Question sudo avec mot de passe dans une ligne de commande?


Les jours de pointe, je voudrais courir

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

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


84
2017-11-09 02:37


origine


Vous avez besoin halt pour exécuter en tant que root. - Keith Thompson
Ne pas sudo avoir un délai de 15 minutes? Ne pourriez-vous pas courir, disons, sudo ls ou quelque chose de similaire, entrez votre mot de passe, puis exécutez la commande ci-dessus, en ayant sudo privilèges encore actifs? (Je ne peux pas tester cela pour le moment, sinon je posterais ceci comme une réponse.) - Matt
Le timeout sur sudo est configurable. Les personnes soucieuses de la sécurité (aka paranoid, comme moi) le mettent à zéro ... :-) - dda
Regarde aussi Demander le mot de passe sudo et augmenter les privilèges par programmation en script bash?, Comment entrer le mot de passe qu'une seule fois dans un script bash nécessitant sudo, Demander le privilège root depuis un script, Créez un utilisateur sudo dans un script sans invite de mot de passe ..., Comment inciter l'utilisateur à utiliser le mot de passe sudo?, etc - jww


Réponses:


Oui, utilisez le -S commutateur 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, remplacer <password> avec votre mot de passe


121
2017-11-09 02:47



De toute évidence, on ne voudrait pas exécuter ceci s'il y a un danger que quelqu'un d'autre voie le mot de passe dans l'historique du shell. - Brett Daniel
rechercher des moyens rapides d'exécuter des commandes privilégiées sur un hôte distant et cela fonctionne grâce à - nelaaro
Si vous avez décidé d'utiliser 'echo <mot de passe> | 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 à utiliser le mot de passe depuis un fichier sécurisé. - user224306
Vous voudrez peut-être l'utiliser si vous avez le mot de passe dans une variable $ VARIABLE (que vous pourriez avoir par exemple avec sops) - Natim


Vous pouvez également configurer sudo avec visudo pour permettre à l'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

9
2017-11-09 03:03





Vous pouvez remplacer votre ligne de commande par ceci:

$sudo su

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

Vous serez invité à entrer votre mot de passe immédiatement, puis le reste des commandes s'exécutera en tant que superutilisateur.


8
2017-11-09 03:14



une version alternative (et probablement préférée) de ceci: sudo sh -c "./configure && make && make install && halt" - quack quixote
Mais alors, tous les fichiers de compilation générés n'auraient-ils pas les droits de superutilisateur? Cela vous empêcherait de lancer ./configure && make en tant qu'utilisateur régulier plus tard. - user45909
Oui, user45909, vous avez raison. Je n'ai jamais personnellement relancé ./configure && make sauf après avoir téléchargé une mise à jour du paquet principal, mais je ne suis probablement pas typique. - CarlF


Plusieurs des autres solutions ont l’inconvénient d’être inutilement exécutées ./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 pour permettre $USER à étendre par le shell (non root).

Je pourrais aussi ajouter un sleep 60 avant le halt commander. J'ai parfois fait des choses comme celle-ci, s'attendant à ce que la commande soit exécutée pendant une longue période, mais quelque chose ne va pas et cela se termine immédiatement. la sleep me permet de tuer la commande avant que le système ne s'arrête. Ou vous pouvez utiliser shutdown avec un argument temporel.


8
2017-08-08 06:52





Définissez HISTIGNORE sur "sudo -s"

$ export HISTIGNORE='*sudo -S*'

Puis transmettez 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'histoire en mémoire ou fichier "~ / .bash_history".

Par exemple, le mot de passe ci-dessous transmettra votre mot de passe en toute sécurité à la commande sudo, sans conserver un 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 C'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, elles ne seront plus 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'attente de 5 minutes), puis exécutez le fichier sudo séparément. Mais l'inconvénient est que vous devez connaître le 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 est mis à jour, la valeur par défaut étant 5 mintues. Oui, whoami ne devrait pas prendre 5 minutes, mais je pense que cela pourrait aussi bien fonctionner avant chaque commande pour la 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 tête de tous mes scripts pour les meilleures pratiques de sécurité. Paramétrer" echo "" | sudo -S -v "pour une variable peut aussi être une bonne idée, alors lancez simplement la variable avant chaque commande qui nécessite 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 a déjà vos identifiants (et est toujours valide, le cache d'authentification sudo par défaut est de 5 minutes) alors bash exécutera votre mot de passe mal.


5
2017-11-25 19:43



Juste comme une petite note pour rendre les choses non disponibles dans l'historique, lancez votre commande avec un seul espace à l'avant. Pour une raison quelconque, l'histoire l'ignore. - Matt Fletcher


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

Exemple:
1) Créez un fichier:

gedit ~/.easy.install  

2) Collez ceci et sauvegardez:

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

3) Rendez-le exécutable:

sudo chmod +x ~/.easy.install  

4) Modifiez les permissions du fichier pour que seul root puisse le lire et le modifier:

sudo chmod 700 ~/.easy.install  

5) Exécuter:

~/.easy.install  

Prendre plaisir ;-)


2
2018-04-19 23:56



echo <mot de passe> apparaîtra toujours 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 clair. Mieux vaut enregistrer le mot de passe dans un fichier et utiliser <pour rediriger le fichier vers sudo. - bobpaul


Vous pouvez le faire aussi:

sudo -S <<< "password" command

2
2018-06-09 14:15





Configurer sudo comme cela est dangereux si quelqu'un constate que sudo ne requiert aucun mot de passe sur votre compte. À moins que vous sachiez ce que vous faites, ne le faites pas. Je l'ai eu à mon programme de formation A + local avec mon ordinateur expérimental trop souvent ... -_-

Ce que John T. a dit semble cependant bien, sauf qu'il y a toujours le risque de trouver le mot de passe dans l'historique du shell. Ce que CarlF a dit sonne mieux, mais si une commande échoue, l'ordinateur fonctionnera toujours avec les privilèges du superutilisateur.


1
2017-11-10 03:37





Notez que je trouve que cette méthode ne fonctionne 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 sur les anciennes et nouvelles versions sudo:

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

1
2017-12-08 15:18



C'est ne 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 réputation vous pourrez commenter un post. - DavidPostill♦
@Darren DeHaven: Pourriez-vous s'il vous plaît expliquer comment cela devient la réponse à la question posée ici? - Renju Chandran chingath


Personnellement, je fais tout à fait la même chose que John T a répondu le 9 novembre 09 à 02h47, j'ai également amélioré le mien selon les indications de sa réponse, merci.

La différence est que j'ai tendance à utiliser des variables, quelque chose comme:

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 mine au lieu de sudo,

$AutoSuDo apt-get update;

Cela est très pratique avec des scripts plus longs. Je les utilise principalement pour les ordinateurs personnels des autres, que je dois maintenir.

Je recommande également de faire attention sur:

  • desgua répondre le 19 avril 11 à 23:56
  • user224306 commenter le 14 mai 13 à 17:38 pour John T répondre le 9 nov 09 à 2:47

0
2018-06-29 20:57