linux - que - Utilice la secuencia de comandos expect in bash para proporcionar una contraseña al comando SSH
spawn linux (8)
Agregue el comando ''interact'' esperar justo antes de su 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"
Esto debería permitirle interactuar con la máquina remota hasta que cierre sesión. Entonces estarás de vuelta en bash.
Para aquellos que quieran responder que debería usar las claves SSH, abstenganse
Estoy intentando utilizar expect en un script bash para proporcionar la contraseña SSH. Si la contraseña funciona pero no termino en la sesión de SSH como debería hacerlo, vuelve a ser muy difícil.
Mi guion
#!/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"
El resultado de mi script:
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
usr@$myhost.example.com''s password: you''re out
Me gustaría tener mi sesión SSH y solo cuando salga de ella para volver a mi script bash. La razón por la que estoy usando bash antes de esperar es porque uso un menú. Puedo elegir a qué unidad conectarme.
Gracias
Después de buscar una respuesta para la pregunta durante meses, finalmente encuentro la mejor solución: escribir un guión 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
Ponlo en /usr/bin/exp
, luego puedes usar:
-
exp <password> ssh <anything>
-
exp <password> scp <anysrc> <anydst>
¡Hecho!
La forma más fácil es usar sshpass . Esto está disponible en repositorios Ubuntu / Debian y no tiene que lidiar con la integración de esperar con bash.
Un ejemplo:
sshpass -p<password> ssh <arguments>
sshpass -ptest1324 ssh [email protected] ls -l /tmp
El comando anterior se puede integrar fácilmente con un script bash.
Nota: Lea la sección Consideraciones de seguridad en man sshpass
para obtener una comprensión completa de las implicaciones de seguridad.
Mezclar bash y esperar no es una buena manera de lograr el efecto deseado. Intentaré usar solo Esperar:
#!/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 solución de muestra para bash podría ser:
#!/bin/bash
/usr/bin/expect -c ''expect "/n" { eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com; interact }''
Esto esperará para ingresar y luego regresar (por un momento) sesión interactiva.
Otra forma en que encontré útil utilizar un pequeño script de espera desde un script bash es el siguiente.
...
bash-script start
bash-commands
...
expect - <<EOF
spawn your-command-here
expect "some-pattern"
send "some-command"
...
...
EOF
...
more bash commands
...
Esto funciona porque ...If the string "-" is supplied as a filename, standard input is read instead...
También asegúrate de usar
send -- "$PWD/r"
en cambio, como contraseñas que comienzan con un guión (-) fallarán de lo contrario.
Lo anterior no interpretará una cadena que comience con un guión como una opción para el comando de envío.
Un script simple de esperar
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
Ejemplo:
./Remotelogin.exp <ip> <user name> <password>
Use la herramienta auxiliar fd0ssh
(desde hxtools, no pmt), funciona sin tener que esperar un mensaje específico del programa ssh.