J'essaie d'utiliser Expect dans un script Bash pour fournir le mot de passe SSH. Fournir le mot de passe fonctionne, mais je ne me retrouve pas dans la session SSH comme je le devrais. Il remonte le détroit à Bash.
Mon scénario:
#!/bin/bash
read -s PWD
/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com'
expect "password"
send "$PWD\n"
EOD
echo "you're out"
La sortie de mon script:
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
usr@$myhost.example.com's password: you're out
Je voudrais avoir ma session SSH et, seulement quand je la quitte, retourner à mon script Bash.
La raison pour laquelle j'utilise Bash avant Expect est que je dois utiliser un menu. Je peux choisir à quel appareil / appareil me connecter.
À ceux qui veulent répondre que je devrais utiliser des clés SSH, veuillez vous abstenir.
Réponses:
Mélanger Bash et Expect n'est pas un bon moyen d'obtenir l'effet souhaité. J'essaierais d'utiliser uniquement Expect:
Exemple de solution pour bash:
Cela attendra Enter, puis reviendra (pendant un moment) à la session interactive.
la source
Le moyen le plus simple est d'utiliser sshpass . Ceci est disponible dans les référentiels Ubuntu / Debian et vous n'avez pas à vous occuper de l'intégration expect avec Bash.
Un exemple:
La commande ci-dessus peut être facilement intégrée à un script Bash.
Remarque: Veuillez lire la section Considérations relatives à la sécurité
man sshpass
pour une compréhension complète des implications en matière de sécurité.la source
sshpass
faire, mais même dans ce cas, il y a un certain temps pendant le démarrage avant qu'il ne puisse le faire lorsque le mot de passe est disponible pour tout / chaque processus à voir.sshpass
est utilisé dans un scénario où vous avez des scripts de test simples qui s'exécutent dans un environnement de réseau local où la sécurité n'est pas la principale préoccupation. En fait, il y a une section dansman sshpass
laquelle une section entière sur les considérations de sécurité est expliquée. Ajouté ceci pour répondre, merci.Ajoutez la commande 'interact' Expect juste avant votre EOD:
Cela devrait vous permettre d'interagir avec la machine distante jusqu'à ce que vous vous déconnectiez. Ensuite, vous serez de retour à Bash.
la source
expect eof
résolu le problème.'
deusr@$myhost.example.com'
et cela devrait fonctionner. Et peut-être que vous devez remplacer\n
par\r
, mais YMMVAprès avoir cherché une réponse à la question pendant des mois, je trouve enfin la meilleure solution: écrire un script simple.
Mettez-le
/usr/bin/exp
, alors vous pouvez utiliser:exp <password> ssh <anything>
exp <password> scp <anysrc> <anydst>
Terminé!
la source
expect "assword:"
vouliez-vous direexpect "password:"
?"assword"
correspondra à la foisPassword
etpassword
.Assurez-vous également d'utiliser
à la place, les mots de passe commençant par un tiret (-) échoueront autrement.
Ce qui précède n'interprète pas une chaîne commençant par un tiret comme une option de la commande d'envoi.
la source
Un simple script Expect:
Fichier Remotelogin.exp
Exemple:
la source
Utilisez l'outil d'aide
fd0ssh
(de hxtools, pas de pmt). Cela fonctionne sans avoir à attendre une invite particulière dussh
programme.la source
echo "yoursshpass" | fd0ssh ssh -c -L$port:$ip:$remote_port [email protected] &
MERCI!sshpass
fait.Une autre façon que j'ai trouvée utile d'utiliser un petit script Expect à partir d'un script Bash est la suivante.
Cela fonctionne parce que
...If the string "-" is supplied as a filename, standard input is read instead...
la source
-
ici, car ilexpect
litstdin
par défaut si vous l'appelez sans argument. Cependant, il est utile si vous voulez l'exécuter de manière interactive sans invite de commande (expect
vs.expect -
) ou si vous faites quelque chose commeexpect -f "$@"
où le premier argument doit être un fichier, même si cela ressemble à une option (commence par-
). Dans ce cas, si$1
(le fichier donné) est--
ce lu à partir destdin
.sshpass
est cassé si vous essayez de l'utiliser dans une cible de construction Sublime Text , dans un Makefile. Au lieu desshpass
, vous pouvez utiliserpassh
: https://github.com/clarkwang/passhAvec
sshpass
toi ferais:Avec
passh
toi ferais:Remarque: n'oubliez pas d'utiliser
-o StrictHostKeyChecking=no
. Sinon, la connexion se bloquera la première fois que vous l'utiliserez. Par exemple:Références:
la source