À 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
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.
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é.
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.
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é!
Un simple script d'attente
#!/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>
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.
Utilisez l'outil d'aide fd0ssh
(de hxtools, pas pmt), il fonctionne sans attendre une invite particulière du programme ssh.
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...
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: