Para aquellos que quieran responder que debo usar las claves SSH, por favor abstenerse
Estoy tratando de usar esperar 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, se remonta a bash.
Mi guión:
#!/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 para volver a mi script bash. La razón por la que estoy usando bash antes de esperar es porque he usado un menú en el que puedo elegir a qué unidad conectarme.
Gracias
Respuestas:
Mezclar bash y esperar no es una buena manera de lograr el efecto deseado. Intentaría usar solo Expect:
La solución de muestra para bash podría ser:
Esto esperará para ingresar y luego regresar (por un momento) sesión interactiva.
fuente
La forma más fácil es usar sshpass . Está disponible en repositorios Ubuntu / Debian y no tiene que lidiar con la integración de esperar con bash.
Un ejemplo:
El comando anterior se puede integrar fácilmente con un script bash.
Nota: Lea la sección Consideraciones de seguridad en
man sshpass
para una comprensión completa de las implicaciones de seguridad.fuente
sshpass
hace, pero incluso entonces hay un período en el que aún se está iniciando antes de que pueda hacerlo cuando la contraseña esté disponible para que cualquiera de los procesos los vea.sshpass
se usa en un escenario donde tiene scripts de prueba simples que se ejecutan en un entorno de red local donde la seguridad no es la principal preocupación. De hecho, hay una sección en laman sshpass
que se explica una sección completa sobre Consideraciones de seguridad. Agregó esto para responder, gracias.Agregue el comando de espera 'interactuar' justo antes de su EOD:
Esto debería permitirle interactuar con la máquina remota hasta que cierre la sesión. Entonces volverás a la fiesta.
fuente
expect eof
resolvió el problema.'
deusr@$myhost.example.com'
y debería funcionar. Y tal vez es necesario sustituir\n
con\r
, pero tu caso es distintoDespués de buscar una respuesta para la pregunta durante meses, finalmente encuentro la mejor solución: escribir un guión simple.
Póngalo en
/usr/bin/exp
, luego puede usar:exp <password> ssh <anything>
exp <password> scp <anysrc> <anydst>
¡Hecho!
fuente
expect "assword:"
a que te refieresexpect "password:"
?"assword"
coincidirá con ambosPassword
ypassword
.También asegúrese de usar
en cambio, ya que las 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.
fuente
Un guión de esperar simple
Remotelogin.exp
Ejemplo:
fuente
Use la herramienta auxiliar
fd0ssh
(de hxtools, no pmt), funciona sin tener que esperar un aviso particular del programa ssh.fuente
echo "yoursshpass" | fd0ssh ssh -c -L$port:$ip:$remote_port [email protected] &
¡GRACIAS!sshpass
hace.Otra forma que encontré útil para usar un script pequeño de esperar de un script bash es la siguiente.
Esto funciona porque
...If the string "-" is supplied as a filename, standard input is read instead...
fuente
-
aquí, como seexpect
lee destdin
forma predeterminada si lo invoca sin argumento. Sin embargo, es útil si desea ejecutarlo interactivamente sin símbolo del sistema (expect
vs.expect -
) o en caso de que haga algo comoexpect -f "$@"
donde el primer argumento será un archivo, incluso si parece una opción (comienza con-
). En ese caso, si$1
(el archivo dado) se-
lee estostdin
.sshpass
se rompe si intenta usarlo dentro del objetivo de construcción de Sublime Text, dentro de un Makefile. En lugar desshpass
que pueda usarpassh
: https://github.com/clarkwang/passhContigo
sshpass
harías:Contigo
passh
harías:Nota: No olvide usar
-o StrictHostKeyChecking=no
, de lo contrario la conexión se bloqueará la primera vez que la use. Por ejemplo:Referencias
fuente