Utiliser expect in bash script pour fournir un mot de passe à la commande SSH

à ceux qui veulent répondre que je devrais utiliser les clés SSH s'il vous plaît s'abstenir

j'essaye d'utiliser expect in an bash script pour fournir le mot de passe SSH. Pourvu que le mot de passe fonctionne mais que je ne finisse pas dans la session SSH comme je le devrais, il retourne strait to bash.

mon script:

#!/bin/bash

read -s PWD

/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com'
expect "password"
send "$PWDn" 
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

j'aimerais avoir mon SSH session et seulement quand je le quitter pour revenir à mon script bash. La raison pour laquelle j'utilise bash avant de m'attendre est que j'ai utilisé un menu auquel je peux me connecter.

Merci

107
demandé sur blong 2011-01-24 13:22:45

8 réponses

Mélange bash et attendre n'est pas un bon moyen pour obtenir l'effet désiré. J'essaierais d'utiliser seulement Expect:

#!/usr/bin/expect
eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
#use correct prompt
set prompt ":|#|\$"
interact -o -nobuffer -re $prompt return
send "my_password\r"
interact -o -nobuffer -re $prompt return
send "my_command1\r"
interact -o -nobuffer -re $prompt return
send "my_command2\r"
interact

Exemple de solution pour bash pourrait être:

#!/bin/bash
/usr/bin/expect -c 'expect "\n" { eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com; interact }'

Cela va attendre pour entrer et de retour (pour un moment) session interactive.

65
répondu Piotr Król 2015-12-24 18:15:24

la façon La plus simple est d'utiliser sshpass . Ceci est disponible dans les repos Ubuntu/Debian et vous n'avez pas à gérer l'intégration de expect with bash.

un exemple:

sshpass -p<password> ssh <arguments>
sshpass -ptest1324 ssh user@192.168.1.200 ls -l /tmp

la commande ci-dessus peut être facilement intégrée à un script bash.

Note: veuillez lire considérations de sécurité section dans man sshpass pour une compréhension complète de implications en matière de sécurité.

47
répondu dotnix 2015-05-22 17:17:31

ajouter la commande 'interact' expect just before your EOD:

#!/bin/bash

read -s PWD

/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com'
expect "password"
send "$PWD\n" 
interact
EOD
echo "you're out"

cela devrait vous permettre d'interagir avec la machine distante jusqu'à ce que vous vous déconnectiez. Alors tu seras de retour à bash.

16
répondu dr-jan 2011-01-24 19:04:39

après avoir cherché une réponse à la question pendant des mois, je trouve enfin la meilleure solution: écrire un script simple.

#!/usr/bin/expect

set timeout 20

set cmd [lrange $argv 1 end]
set password [lindex $argv 0]

eval spawn $cmd
expect "assword:"
send "$password\r";
interact

mettez-le sur /usr/bin/exp , alors vous pouvez utiliser:

  • exp <password> ssh <anything>
  • exp <password> scp <anysrc> <anydst>

fait!

10
répondu damn_c 2015-02-03 07:12:14

utilisez l'outil d'aide fd0ssh (de hxtools, pas pmt), il fonctionne sans avoir à attendre une invite particulière du programme ssh.

5
répondu user562374 2011-01-24 11:55:06

assurez-vous Également d'utiliser

send -- "$PWD\r" 

à la place, car les mots de passe commençant par un tiret (-) échoueront autrement.

La coutume d'interpréter une chaîne commençant par un tiret comme une option à la commande envoyer.

5
répondu Timmah 2014-01-22 10:39:10

un script d'attente simple

Remotelogin.exp

    #!/usr/bin/expect
    set user [lindex $argv 1]
    set ip [lindex $argv 0]
    set password [lindex $argv 2]
    spawn ssh $user@$ip
    expect "password"
    send "$password\r"
    interact

exemple:

    ./Remotelogin.exp <ip> <user name> <password>
5
répondu Vijay S B 2016-09-23 05:23:30

une autre façon que j'ai trouvé utile d'utiliser un petit expect script à partir d'un script bash est comme suit.

...
bash-script start
bash-commands
...
expect - <<EOF 
spawn your-command-here
expect "some-pattern"
send "some-command"
...
...
EOF
...
more bash commands
...

cela fonctionne parce que ...If the string "-" is supplied as a filename, standard input is read instead...

1
répondu Jimbo 2014-12-30 09:13:04