Passer un mot de passe à ssh dans pure bash

Je veux passer un mot de passe à ssh utilisant 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 j’ai l’intention).

J’ai trouvé des solutions qui étaient en expect mais comme ce n’est pas un outil 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? Est-il possible de le faire fonctionner? Peut-être exécuter ssh tant que processus différent, obtenir son PID puis lui envoyer directement une chaîne?

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

Pour utiliser sshpass, vous devez d’abord l’installer. alors

 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 plus sûr de fournir le mot de passe à partir d’un fichier ou d’une variable au lieu de la ligne de commande.

BTW, une petite explication pour la syntaxe <(command) . Le shell exécute la commande entre 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 -tuyau

Comme il n’y avait pas de réponses exactes à ma question, j’ai cherché à savoir pourquoi mon code ne fonctionnait pas lorsque 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 access TTY direct pour s’assurer que le mot de passe est bien émis par un utilisateur de clavier interactif.” sshpass page de manuel

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 “pense” qu’il est exécuté sur le terminal normal et que cela peut être accompli par de simples fonctions de posix , cela dépasse ce que le simple bash offre.