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?
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.
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