web-dev-qa-db-fra.com

sudo avec mot de passe dans une ligne de commande?

Pendant les jours chargés, j'aimerais courir

$ ./configure && make && Sudo make install && halt

la nuit et aller au lit, en espérant que l'application serait automatiquement installée. Mais ce que je vois le lendemain, c'est l'écran où Sudo me demande le mot de passe. Alors, comment pourrais-je exécuter Sudo avec un mot de passe dans une ligne de commande ou existe-t-il une autre méthode pour le faire?

103
Jichao

Oui, utilisez le commutateur -S qui lit le mot de passe de STDIN:

$echo <password> | Sudo -S <command>

Donc, pour votre cas, cela ressemblerait à ceci:

$./configure && make && echo <password> | Sudo -S make install && halt

bien sûr, remplacez <password> par votre mot de passe.

152
John T

Vous pouvez remplacer votre ligne de commande par ceci:

$Sudo su

$./configure && make && make install && halt

Votre mot de passe vous sera demandé immédiatement, puis le reste des commandes sera exécuté en tant que superutilisateur.

10
CarlF

Plusieurs des autres solutions ont l'inconvénient d'exécuter inutilement ./configure et make en tant que root.

C'est un peu compliqué, mais ça devrait marcher:

Sudo sh -c "su $USER -c ./configure && su $USER -c make && make install && halt"

Notez l'utilisation de guillemets doubles pour permettre à $USER d'être développé par le shell (non root).

Je pourrais aussi ajouter un sleep 60 avant la commande halt. J'ai parfois fait des choses comme celle-ci, m'attendant à ce que la commande soit exécutée pendant longtemps, mais quelque chose ne va pas et elle se termine immédiatement; sleep me laisse tuer la commande avant que le système ne s'éteigne. Ou vous pouvez utiliser shutdown avec un argument de temps.

10
Keith Thompson

Vous pouvez également configurer Sudo avec visudo pour permettre à votre utilisateur d'utiliser make en tant que Sudo sans mot de passe.

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS
9
Natim

Réglez HISTIGNORE sur " Sudo -S "

$ export HISTIGNORE='*Sudo -S*'

Puis passez votre mot de passe en toute sécurité à Sudo:

$ echo "your_password" | Sudo -S -k <command>

"HISTIGNORE" signifie ne pas enregistrer cette commande dans l'historique. C'est l'historique en mémoire ou le fichier "~/.bash_history".

Par exemple, la procédure ci-dessous dirige votre mot de passe en toute sécurité vers la commande Sudo, sans conserver l'historique de votre mot de passe.

“-S”, signifie utiliser stdin pour le mot de passe,

“-K” signifie ignorer les informations d'identification mises en cache pour forcer Sudo à toujours demander. Ceci est pour un comportement cohérent.

$ export HISTIGNORE='*Sudo -S*'
$ echo "<your_password>" | Sudo -S -k whoami
$ echo "<your_password>" | Sudo -S -k cat /etc/shadow
$ echo "<your_password>" | Sudo -S -k bash /tmp/myscript.sh

L'inconvénient de la méthode ci-dessus est que si vous voulez voir les commandes que vous avez exécutées dans l'historique plus tard, elles ne seront pas là. Une autre méthode consiste à mettre à jour le cache des informations d'authentification Sudo (la valeur par défaut est activée avec un délai d'expiration de 5 minutes), puis à exécuter Sudo séparément. Mais l'inconvénient est que vous devez connaître la mémoire cache de 5 minutes.

Par exemple:

$ export HISTIGNORE='*Sudo -S*'
$ echo "<your_password>" | Sudo -S -v
$ Sudo whoami
$ echo "<your_password>" | Sudo -S -v
$ Sudo cat /etc/shadow
$ echo "<your_password>" | Sudo -S -v
$ Sudo /tmp/myscript.sh

Remarque J'ai exécuté Sudo avant chaque commande pour m'assurer que le cache Sudo était mis à jour, la valeur par défaut étant 5 minutes. Oui, whoami ne devrait pas prendre 5 minutes, mais je pense qu'il pourrait tout aussi bien l'exécuter avant chaque commande pour plus de cohérence. Vous pouvez également insérer "export HISTIGNORE = ' Sudo -S '" dans votre fichier ~/.bashrc, puis le charger avec ". ~/.Bashrc" ou vous déconnecter, puis vous connecter. Cependant, je pense utiliser ceci à des fins de script, je le garderai donc au sommet de tous mes scripts pour des pratiques de sécurité optimales. Définir "echo" "| Sudo -S -v" sur une variable peut également être une bonne idée, puis exécutez simplement la variable avant chaque commande nécessitant des privilèges root, voir le commentaire de Janar. Le commentaire de "John T" devrait également inclure le paramètre "-k", comme si vous exécutiez "Sudo -S" sans "-k" et que le cache d'authentification Sudo avait déjà vos informations d'identification (et est toujours valide, le cache d'authentification Sudo par défaut est 5 minutes) puis bash exécutera votre mot de passe sous forme de commande, ce qui est mauvais.

7
user393365

Vous pouvez le faire aussi:

Sudo -S <<< "password" command
2
Jahid

Remarque: j'ai constaté que cette méthode ne fonctionnait pas sur une ancienne version de Sudo, en particulier "Sudo version 1.6.7p5":

$ echo "<your_password>" | Sudo -S -k whoami

Où cette méthode fonctionne-t-elle sur les anciennes et les nouvelles versions de Sudo:

$ echo "<your_password>" | Sudo -S -v
$ Sudo whoami
2
Darren DeHaven

Si vous souhaitez prendre plus de précautions, vous pouvez créer un script, modifier les autorisations du fichier afin que seul root puisse lire et modifier, puis simplement l'exécuter.

Exemple:
1) Créez un fichier:

gedit ~/.easy.install  

2) Collez ceci et enregistrez:

./configure && make && echo <password> | Sudo -S make install && halt  

3) le rendre exécutable:

Sudo chmod +x ~/.easy.install  

4) Modifiez les autorisations du fichier afin que seul root puisse le lire et le modifier:

Sudo chmod 700 ~/.easy.install  

5) Run:

~/.easy.install  

Prendre plaisir ;-)

2
desgua

Configurer Sudo de cette manière est dangereux si quelqu'un découvre que Sudo n'exige aucun mot de passe pour votre compte. À moins que vous ne sachiez ce que vous faites, ne le faites pas. Je l'ai eu trop souvent à mon programme de formation A + local avec mon ordinateur expérimental ... -_-

Ce que John T. a dit semble bien, sauf que le risque de trouver le mot de passe est toujours présent dans l’histoire de Shell. Ce que CarlF a dit semble meilleur, mais si une commande échoue, l’ordinateur fonctionnera toujours avec les privilèges de superutilisateur.

1
TimE.

Le problème est résolu. Par exemple, pour l'utilisateur root:

echo -e 'password\npassword\n' | Sudo passwd root
0
Jerson Martínez

Personnellement, je fais assez comme John T a répondu le 9 novembre 09 à 14h47, j'ai également amélioré le mien selon les indications de sa réponse, merci.

La différence, c’est que j’ai tendance à utiliser des variables, par exemple:

AutoSuDo=$" $echo pass | Sudo -S";
# Change AutoSuDo to something else.
# Note that string starts with space,
# useful only if used as first command in line

De cette façon, je peux facilement utiliser ma variable variable au lieu de Sudo,

$AutoSuDo apt-get update;

Cela vient assez bien avec des scripts plus longs. Je les utilise principalement pour les ordinateurs personnels de tiers, que je dois entretenir.

Je recommande également de faire attention sur:

  • desgua répondre le 19 avril '11 à 23:56
  • user224306 commente sur le 14 mai 13 à 17:38 pour John T réponse le 9 novembre 09 à 02h47
0
Janar