web-dev-qa-db-fra.com

Passer un mot de passe à ssh en pure bash

Je veux passer un mot de passe à ssh à l'aide d'un script bash (oui, je sais qu'il y a des clés ssh que je pourrais utiliser, mais ce n'est pas ce que je souhaite).

J'ai trouvé des solutions qui utilisaient expect, mais comme ce n'est pas un outil bash standard, je me demande si je peux le faire en utilisant des pipes.

Quelqu'un peut-il m'expliquer pourquoi exactement quelque chose comme ceci:

echo "password\n" | ssh somehost.com

ou

ssh somehost.com <(echo "password\n")

ne fonctionne pas? Y a-t-il une possibilité de le faire fonctionner? Peut-être exécuter ssh en tant que processus différent, obtenir son PID puis lui envoyer une chaîne directement?

35
Liberat0r

Comme il n’y avait pas de réponse précise à ma question, j’ai cherché à savoir pourquoi mon code ne fonctionnait pas alors que d’autres solutions fonctionnaient, et j’ai décidé de publier ce que j’avais trouvé pour compléter le sujet.
Comme il s'avère:

"ssh utilise un accès direct au téléscripteur pour s'assurer que le mot de passe est bien émis par un utilisateur de clavier interactif." page de manuel sshpass

qui répond à la question, pourquoi les tuyaux ne fonctionnent pas dans ce cas. La solution évidente était de créer des conditions pour que ssh "pensait" qu'il soit exécuté dans le terminal standard et, comme il peut être accompli par de simples fonctions posix, il est au-delà de ce simple bash offres.

36
Liberat0r

Vous ne pouvez pas spécifier le mot de passe à partir de la ligne de commande, mais vous pouvez utiliser des clés ssh ou sshpass comme suggéré par John C. ou un script expect.

Pour utiliser sshpass, vous devez d'abord l'installer. ensuite

sshpass -f <(printf '%s\n' your_password) ssh user@hostname

au lieu d'utiliser sshpass -p your_password. Comme mentionné par Charles Duffy Dans les commentaires, il est préférable de fournir le mot de passe à partir d'un fichier ou d'une variable plutôt qu'à partir de la ligne de commande.

BTW, une petite explication pour la syntaxe <(command). Le shell exécute la commande entre les parenthèses et remplace le tout par un descripteur de fichier, qui est connecté à la sortie standard de la commande. Vous pouvez trouver plus de cette réponse https://unix.stackexchange.com/questions/156084/why-does-process-substitution-result-in-a-file-called-dev- fd-63-which-is-a-pipe

61
CS Pei