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é.
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.
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.
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
j'ai:
ssh user@host bash -c "echo mypass | sudo -S mycommand"
ça me va.
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.
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.
pour sudo vous pouvez faire cela aussi:
sudo -S <<< "password" command
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.
regardez expect
utilitaire linux.
il vous permet d'envoyer la sortie à stdio basé sur la correspondance simple de modèle sur stdin.
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.
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.
utiliser:
echo password | sudo command
exemple:
echo password | sudo apt-get update; whoami
J'Espère Que Ça Aidera..
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF
vous pouvez fournir le mot de passe comme paramètre pour s'attendre script.
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
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
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.
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/