sudo avec mot de passe dans une ligne de commande?

115

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?

Jichao
la source
Vous devez haltexécuter en tant que root.
Keith Thompson
1
Vous sudon'avez pas de délai d'attente de 15 minutes? Ne pourriez-vous pas exécuter, par exemple, sudo lsou quelque chose de similaire, entrez votre mot de passe, puis exécutez la commande ci-dessus, les sudoprivilèges étant toujours actifs? (Je ne peux pas tester cela pour le moment, sinon je posterais ceci comme réponse.)
Matt
1
Le délai d'attente sudoest configurable. Les personnes soucieuses de la sécurité (alias paranoïaques, comme moi) la mettent à zéro ... :-)
mardi

Réponses:

173

Oui, utilisez le -Scommutateur 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-le <password>par votre mot de passe.

John T
la source
42
Évidemment, on ne voudrait pas lancer ceci s'il existe un danger que quelqu'un d'autre voie le mot de passe dans l'historique du shell.
Brett Daniel
chercher des moyens rapides pour exécuter des commandes privilégiées sur un hôte distant et cela fonctionne merci.
Nelaaro
13
Si vous avez décidé d'utiliser le mot de passe 'echo <mot de passe> | L'option sudo -S, pour éviter d'exposer le mot de passe dans l'historique des commandes, lancez la commande avec un caractère SPACE. Bien entendu, la meilleure option consiste à canaliser le mot de passe à partir d'un fichier sécurisé.
Shannon Haworth
Vous voudrez peut-être l'utiliser si vous avez le mot de passe dans un $ VARIABLE (que vous pourriez avoir avec des sops par exemple)
Natim
9 ans plus tard et fonctionne toujours comme un charme :)
WinEunuuchs2Unix
10

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.

CarlF
la source
8
une version alternative (et probablement préférée) de ceci:sudo sh -c "./configure && make && make install && halt"
Quack Quichote
2
Mais alors tous les fichiers de compilation générés n'auraient-ils pas les autorisations de superutilisateur? Cela vous empêcherait d'exécuter ./configure && en tant qu'utilisateur normal ultérieurement.
user45909
Oui, user45909, vous avez tout à fait raison. Personnellement, je n'ai jamais relancé ./configure && sauf après avoir téléchargé une mise à jour du paquet principal de toute façon, mais je ne suis probablement pas typique.
CarlF
10

Plusieurs des autres solutions ont l'inconvénient d'être exécutées inutilement ./configureet en maketant 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 à l'utilisateur $USERd'être développé par le shell (non root).

Je pourrais aussi ajouter un sleep 60avant la haltcommande. 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; la sleepme permet de tuer la commande avant arrête le système. Ou vous pouvez utiliser shutdownavec un argument de temps.

Keith Thompson
la source
9

Vous pouvez également configurer sudo avec visudopour permettre à votre utilisateur d’utiliser make as sudo sans mot de passe.

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

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, l’information ci-dessous dirige votre mot de passe en toute sécurité vers la commande sudo, sans conserver d’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 le 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é un sudo avant chaque commande pour vérifier 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 aussi mettre "export HISTIGNORE = ' sudo -S'"dans votre fichier ~ / .bashrc, puis chargez-le avec". ~ / .bashrc "ou déconnectez-vous puis connectez-vous. Cependant, je pense utiliser ceci à des fins de script, donc je le garderai en haut de tous mes scripts pour des pratiques de sécurité optimales. Setting" echo "" | sudo -S -v "à une variable à la place peut aussi être une bonne idée, alors 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 dispose déjà de vos informations d'identification (et qu'il est toujours valide, le cache d'authentification sudo par défaut est de 5 minutes), puis bash exécutera votre mot de passe sous la forme d'une commande, à savoir mauvais.

utilisateur393365
la source
1
Juste comme une petite note sur la création d'éléments non disponibles dans l'historique, exécutez votre commande avec un seul espace au début. Pour une raison quelconque, l’histoire l’ignore.
Matt Fletcher
4

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

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

Où que cette méthode fonctionne sur les anciennes et les nouvelles versions sudo:

$ echo "<your_password>" | sudo -S -v
$ sudo whoami
Darren DeHaven
la source
Ce n'est pas une réponse à la question initiale. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire en dessous de son message - vous pouvez toujours commenter vos propres messages, et une fois que vous avez suffisamment de réputation, vous pourrez commenter n'importe quel message .
DavidPostill
@ Darren DeHaven: Pourriez-vous s'il vous plaît expliquer comment cela devient une réponse à la question posée ici?
Renju Chandran chingath
4

Vous pouvez le faire aussi:

sudo -S <<< "password" command
Jahid
la source
seul celui-ci fonctionne pour moi sous mac os.
Mehdico le
2

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 ;-)

desgua
la source
echo <mot de passe> sera toujours affiché dans la liste des processus et si quelqu'un a de la chance avec ps aux au bon moment, il peut voir le mot de passe en texte clair. Mieux vaut enregistrer le mot de passe dans un fichier et utiliser <pour rediriger le fichier vers sudo.
Bobpaul
1

Configurer sudo de cette manière est dangereux si quelqu'un découvre que sudo ne requiert 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 dit John T. sonne bien cependant, sauf que le risque de trouver le mot de passe est toujours présent dans l'historique du shell. Ce que CarlF a dit semble meilleur, mais si une commande échoue, l’ordinateur fonctionnera toujours avec les privilèges de superutilisateur.

Temps.
la source
0

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 la variable mienne 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 à 02:47
Janar
la source
0

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

echo -e 'password\npassword\n' | sudo passwd root
Jerson Martínez
la source
Que fait -e flag, @jerson Martinez?
user674669
1
L'option -e pour l'écho lui permet d'interpréter certaines séquences comme ayant une signification particulière.
Jerson Martínez le