Comment passer le mot de passe à su/sudo/ssh sans passer par dessus le TTY?

j'écris un programme Shell C qui fera su ou sudo ou ssh . Ils veulent tous que leurs mots de passe soient entrés dans la console (le TTY) plutôt que dans le stdin ou la ligne de commande.

est-ce que quelqu'un connaît une solution?

configurer sudo sans mot de passe n'est pas une option.

expect pourrait être une option, mais elle n'est pas présente sur mon système démonté.

130
demandé sur codeforester 2008-10-24 15:59:55

20 réponses

pour sudo il y a une option-S pour accepter le mot de passe de l'entrée standard. Voici l'entrée de l'homme:

    -S          The -S (stdin) option causes sudo to read the password from
                the standard input instead of the terminal device.

cela vous permettra d'exécuter une commande comme:

echo myPassword | sudo -S ls /tmp

quant à ssh, j'ai fait de nombreuses tentatives pour automatiser/script son utilisation sans succès. Il ne semble pas y avoir de moyen de passer le mot de passe dans la commande sans l'avoir demandé. Comme d'autres l'ont mentionné, le" s'attendent " utilité il semble qu'il vise à résoudre ce dilemme, mais en fin de compte, la mise en place de la bonne autorisation de clé privée est la bonne façon de procéder lorsque l'on tente d'automatiser ce processus.

192
répondu Jesse Webb 2010-12-01 17:27:26

j'ai écrit un Applescript qui demande un mot de passe via une boîte de dialogue et construit ensuite une commande de bash personnalisée, comme ceci:

echo <password> | sudo -S <command>

Je ne suis pas sûr que ça aide.

ce serait bien si sudo acceptait un mot de passe pré-crypté, donc je pourrais le crypter dans mon script et ne pas m'inquiéter de faire écho à des mots de passe clairs autour. Cependant, cela fonctionne pour moi et ma situation.

33
répondu mlambie 2008-12-09 06:04:04

pour ssh vous pouvez utiliser sshpass : sshpass -p yourpassphrase ssh user@host .

vous avez juste besoin de télécharger sshpass d'abord :)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
23
répondu Edward 2018-05-18 12:41:23

j'ai:

ssh user@host bash -c "echo mypass | sudo -S mycommand"

ça me va.

11
répondu David Dawson 2012-07-30 20:58:20

la solution habituelle à ce problème est de configurer une application helper qui exécute la tâche nécessitant un accès super-utilisateur: http://en.wikipedia.org/wiki/Setuid

Sudo n'est pas destiné à être utilisé hors ligne.

édite Plus Tard: SSH peut être utilisé avec une authentification à clé privée-publique. Si la clé privée n'a pas de phrase de passe, ssh peut être utilisé sans demander un mot de passe.

9
répondu diciu 2008-10-24 12:14:23

cela peut être fait en mettant en place des clés publiques/privées sur les hôtes cibles auxquels vous vous connecterez. La première étape serait de générer une clé ssh pour l'utilisateur qui exécute le script sur la machine locale, en exécutant:

ssh-keygen
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default>
Overwrite (y/n)? y

entrez ensuite un mot de passe vide. Après cela, copiez votre clé ssh sur l'hôte cible auquel vous souhaitez vous connecter.

ssh-copy-id <remote_user>@<other_host>
remote_user@other_host's password: <Enter remote user's password here>

après avoir enregistré les clés ssh, vous serez en mesure d'effectuer un ssh remote_user@other_host de votre hôte local.

9
répondu Byob 2012-07-30 12:54:31

pour sudo vous pouvez faire cela aussi:

sudo -S <<< "password" command
9
répondu Jahid 2015-06-09 14:12:18

quand il n'y a pas de meilleur choix (comme suggéré par d'autres), alors l'homme socat peut aider:

   (sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |
   socat - EXEC:'ssh -l user server',pty,setsid,ctty

          EXEC’utes an ssh session to server. Uses a pty for communication
          between socat and ssh, makes it ssh’s  controlling  tty  (ctty),
          and makes this pty the owner of a new process group (setsid), so
          ssh accepts the password from socat.

toute la complexité pty,setsid,ctty est nécessaire et, même si vous n'avez pas besoin de dormir aussi longtemps, vous aurez besoin de dormir. L'option echo=0 vaut également le coup d'oeil, de même que le passage de la commande à distance sur la ligne de commande de ssh.

5
répondu Martin Dorey 2011-09-15 21:30:21

regardez expect utilitaire linux.

il vous permet d'envoyer la sortie à stdio basé sur la correspondance simple de modèle sur stdin.

5
répondu Marko 2012-07-30 20:59:13

peut-être Pouvez-vous utiliser une commande expect ?:

expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact

cette commande donne automatiquement le mot de passe.

4
répondu adhown 2012-07-30 20:57:47

configure SSH up pour L'authentification de la clé publique, sans pasphrase sur la clé. Des tas de guides sur le filet. Vous n'aurez pas besoin de mot de passe pour vous connecter. Vous pouvez alors limiter les connexions pour une clé basée sur le nom du client. Fournit une sécurité raisonnable et est idéal pour les connexions automatisées.

1
répondu 2008-10-27 15:56:17

utiliser:

echo password | sudo command

exemple:

echo password | sudo apt-get update; whoami

J'Espère Que Ça Aidera..

1
répondu Sarat Chandra 2017-03-23 08:00:45
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF
1
répondu Ed Bishop 2017-11-28 17:22:44

vous pouvez fournir le mot de passe comme paramètre pour s'attendre script.

0
répondu Marko 2008-10-24 12:07:16

j'ai eu le même problème. script de dialogue pour créer un répertoire sur pc distant. dialogue avec ssh est facile. J'utilise sshpass (déjà installé).

   dialog --inputbox "Enter IP" 8 78 2> /tmp/ip

   IP=$(cat /tmp/ip)


   dialog --inputbox "Please enter username" 8 78 2> /tmp/user

   US=$(cat /tmp/user)


   dialog --passwordbox "enter password for \"$US\" 8 78 2> /tmp/pass

   PASSWORD = $(cat /tmp/pass)


   sshpass -p "$PASSWORD" ssh $US@$IP mkdir -p /home/$US/TARGET-FOLDER


   rm /tmp/ip

   rm /tmp/user

   rm /tmp/pass

salutations de l'Allemagne

titus

0
répondu titus 2015-04-29 12:23:06

S'appuyant sur la réponse de @Jahid, cela a fonctionné pour moi sur macOS 10.13:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers
0
répondu JS. 2017-11-03 23:13:38
echo <password> | su -c <command> <user> 

ça marche.

-1
répondu DevOz 2010-10-18 14:02:06

Hardcoder un mot de passe dans un script expect est la même chose qu'avoir un sudo sans mot de passe, en fait pire, puisque sudo au moins enregistre ses commandes.

-1
répondu Aleksandar Ivanisevic 2011-09-15 22:00:32

une façon serait d'utiliser l'option read-S.. de cette façon, les caractères du mot de passe ne se répercutent pas à l'écran. J'ai écrit un petit script pour certains cas d'utilisation et vous pouvez les voir sur mon blog: http://www.datauniv.com/blogs/2013/02/21/a-quick-little-expect-script/

-1
répondu Avi 2013-02-22 01:29:01
su -c "Command" < "Password"

j'Espère que c'est utile.

-9
répondu Shankar 2012-07-30 20:58:47