Utilice la secuencia de comandos expect in bash para proporcionar una contraseña al comando SSH

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

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.

La forma más fácil es usar sshpass . Esto está disponible en repositorys Ubuntu / Debian y no tiene que lidiar con la integración de esperar con bash.

Un ejemplo:

 sshpass -p ssh  sshpass -ptest1324 ssh user@192.168.1.200 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.

Agregue el comando ‘interact’ esperar justo antes de su EOD:

 #!/bin/bash read -s PWD /usr/bin/expect <  

Esto debería permitirle interactuar con la máquina remota hasta que cierre sesión. Entonces estarás de vuelta en bash.

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 ssh
  • exp scp

¡Hecho!

Use la herramienta auxiliar fd0ssh (desde hxtools, no pmt), funciona sin tener que esperar un mensaje específico del progtwig ssh.

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    

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 - <  

Esto funciona porque ...If the string "-" is supplied as a filename, standard input is read instead...