web-dev-qa-db-fra.com

Utilisez expect dans le script bash pour fournir le mot de passe à la commande SSH

À ceux qui veulent répondre que je devrais utiliser des clés SSH, veuillez vous abstenir

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, ça retourne détroit en 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 "$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 pour revenir à mon script bash. La raison pour laquelle j'utilise bash auparavant est parce que j'ai utilisé un menu auquel je peux choisir l'unité à laquelle me connecter.

Merci

121
Max

Le mélange de bash et d’attente n’est pas un bon moyen d’obtenir l’effet souhaité. 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

La solution exemple 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 attendra pour entrer et pour revenir (pour un moment) session interactive.

76
Piotr Król

Le moyen le plus simple consiste à utiliser sshpass. Ceci est disponible dans les dépôts Ubuntu/Debian et vous n’aurez pas à intégrer l’attente avec bash.

Un exemple:

sshpass -p<password> ssh <arguments>
sshpass -ptest1324 ssh [email protected] ls -l /tmp

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

Remarque: Veuillez lire la section relative à la sécurité dans man sshpass pour une compréhension complète des conséquences pour la sécurité.

51
dotnix

Ajoutez la commande 'interact' expect juste avant votre 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. Ensuite, vous serez de retour dans bash.

18
dr-jan

Après avoir cherché une réponse à la question pendant des mois, j'ai finalement trouvé 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 dans /usr/bin/exp, vous pouvez alors utiliser:

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

Terminé!

13
damn_c

Un simple script d'attente

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>
7
Vijay S B

Veillez également à utiliser

send -- "$PWD\r" 

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

Ce qui précède n'interprète pas une chaîne commençant par un tiret comme une option de la commande send.

7
Timmah

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

6
user562374

Voici un autre moyen que j’ai trouvé utile d’utiliser un script petit attendu à partir d’un script bash:.

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

Cela fonctionne car ...If the string "-" is supplied as a filename, standard input is read instead...

4
Jimbo

sshpass est cassé si vous essayez de l'utiliser dans la cible de construction de Sublime Text, dans un Makefile. Au lieu de sshpass, vous pouvez utiliser passh: https://github.com/clarkwang/passh

Avec sshpass vous feriez:

sshpass -p ssh user@Host

Avec passh vous feriez:

passh -p ssh user@Host

Remarque: N'oubliez pas d'utiliser -o StrictHostKeyChecking=no, sinon la connexion s'interrompra la première fois que vous l'utiliserez. Par exemple:

passh -p ssh -o StrictHostKeyChecking=no user@Host

Références:

  1. La commande d'envoi du mot de passe ne fonctionne pas avec le script prévu dans la connexion ssh
  2. https://askubuntu.com/questions/87449/how-to-disable-strict-Host-key-checking-in-ssh
  3. https://linuxcommando.blogspot.com/2008/10/how-to-disable-ssh-Host-key-checking.html
  4. https://serverfault.com/questions/330503/scp-without-known-hosts-check
  5. https://debian-administration.org/article/587/pam_mount_and_sshfs_with_password_authentication
0
user