script que interact ejemplos linux bash ssh expect

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.