2011-01-24 15 views
89

Para aquellos que quieren responder que debo utilizar claves SSH favor abstengoUso esperar en escritura del golpe para proporcionar la contraseña SSH comando

Estoy intentando utilizar esperar en una escritura del golpe 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 script:

#!/bin/bash 

read -s PWD 

/usr/bin/expect <<EOD 
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$myhost.example.com' 
expect "password" 
send "$PWD\n" 
EOD 
echo "you're out" 

La salida de mi guión:

spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$myhost.example.com 
[email protected]$myhost.example.com's password: you're out 

me gustaría tener mi sesión SSH y sólo cuando salgo a volver a mi escritura del golpe. La razón por la que estoy usando bash antes de esperar es porque uso un menú. Puedo elegir a qué unidad conectarme.

Gracias

+41

consulte primera línea: Para aquellos que quieren responder que debo utilizar claves SSH favor abstenerse – Max

+44

Editaría tu primera línea para ser un poco más amable. Puede considerar algo como "Debido a restricciones, simplemente no puedo usar claves SSH, debo encontrar la manera de hacerlo funcionar con la expectativa". Debería esperar que las personas sientan curiosidad por saber por qué no están usando las teclas, y solo están tratando de ser útiles :) @ Ignacio no sugirió que los usara, simplemente lo confirmaba como una restricción y no como un descuido. –

Respuesta

59

Mezclar bash y esperar no es una buena manera de lograr el efecto deseado. Que iba a tratar de utilizar sólo esperar:

#!/usr/bin/expect 
eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$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 

Solución de muestra para la fiesta podría ser:

#!/bin/bash 
/usr/bin/expect -c 'expect "\n" { eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$myhost.example.com; interact }' 

Este a esperar a entrar y de retorno (por un momento) sesión interactiva.

+1

funciona genial, gracias. ¿Qué sucede si quiero ingresar el comando una vez que estoy conectado a través de SSH, qué debo hacer? – Max

+0

Esta secuencia de comandos debe devolver el shell ineractive con el usuario conectado. No entiendo la pregunta. Si desea utilizar la misma secuencia de comandos en bash, mire la entrada editada. –

+0

De la misma manera que envío la contraseña cuando se me solicita, me gustaría enviar comandos del sistema una vez que inicie sesión. – Max

5

Utilice la herramienta de ayuda fd0ssh (de hxtools, no PMT), que funciona sin tener que esperar una pronta particular del programa ssh.

+0

Esto es genial! Es un poco difícil hacerlo funcionar (al menos en el servidor ubuntu) ¡pero funciona sin problemas! La configuración que hicimos: 'echo" yoursshpass "| fd0ssh ssh -c -L $ port: $ ip: $ remote_port [email protected] & ' ¡GRACIAS! – Raspu

+1

Mucho más seguro que pasar la contraseña en la línea de comando como 'sshpass'. –

14

Agregar el comando 'interactuar' esperar justo antes de su EOD:

#!/bin/bash 

read -s PWD 

/usr/bin/expect <<EOD 
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$myhost.example.com' 
expect "password" 
send "$PWD\n" 
interact 
EOD 
echo "you're out" 

Esto le debe permitir interactuar con la máquina remota hasta que se cierra la sesión. Entonces estarás de vuelta en bash.

+1

lo siento, lo probé pero no funciona – Max

+0

Entra y sale de inmediato. "you're out" está impreso. – Emmanuel

+7

He reemplazado "interactuar" y "EOD" con "esperar eof" y funcionó para mí. Esto está en una Mac. – Emmanuel

45

La manera 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 una escritura del golpe.

Nota: Por favor, leaConsideraciones de Seguridad sección en man sshpass para la plena comprensión de las implicaciones de seguridad.

+0

No sé si es una buena solución, pero ciertamente simplifica mucho. Gracias – erikbwork

+7

Muy peligroso desde una perspectiva de seguridad: los argumentos de la línea de comandos se pueden leer mediante cualquier otro proceso en el sistema. Es posible sobrescribirlos, y con suerte 'sshpass' hace eso, pero aun así hay un período durante el cual todavía se está iniciando antes de que sea capaz de hacerlo cuando la contraseña esté disponible para que se vea cualquier proceso. –

+0

@CharlesDuffy Por supuesto, estás en lo cierto. 'sshpass' se usa en un escenario donde tienes 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 'man sshpass' donde se explica una sección completa sobre consideraciones de seguridad. Agregué esto para responder, gracias. – dotnix

3

También asegúrese de usar

send -- "$PWD\r" 

lugar, como contraseñas que comienzan con un guión (-) fallará lo contrario.

Lo anterior no interpretará una cadena que comience con un guión como una opción para el comando de envío.

1

Otra forma en la que encontré útil utilizar un pequeño pequeño script esperado de 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...

8

Después de buscar una respuesta para la cuestión de meses, por fin encuentro un muy mejor solución: escribir un script sencillo.

#!/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 a /usr/bin/exp, entonces usted puede utilizar:

  • exp <password> ssh <anything>
  • exp <password> scp <anysrc> <anydst>

hecho!

4

Un simple script de esperar

Remotelogin.exp

#!/usr/bin/expect 
    set user [lindex $argv 1] 
    set ip [lindex $argv 0] 
    set password [lindex $argv 2] 
    spawn ssh [email protected]$ip 
    expect "password" 
    send "$password\r" 
    interact 

Ejemplo:

./Remotelogin.exp <ip> <user name> <password> 
Cuestiones relacionadas