Pregunta

Tengo un script de esperar que se conecta a un par de routers a través de SSH. Todos estos routers tienen la misma contraseña (lo sé, está mal), y el guión tiene que saber que la contraseña con el fin de ser capaz de conectarse a los routers. Actualmente, la contraseña se pasa a mi guión como un argumento en la línea de comandos, pero esto significa que hay un rastro de esa contraseña en mi archivo .bash_history, así como en los procesos en ejecución. Así que en lugar me gustaría al usuario se le pida una contraseña, si es posible en silencio.

¿Conoce si es o no es posible pedir al usuario una contraseña con esperar?

Gracias.

Editar : si yo estaba conectando a los servidores en lugar de routers, probablemente utilizar claves SSH en lugar de contraseñas. Sin embargo, los routers que estoy usando sólo admite contraseñas.

¿Fue útil?

Solución

El uso de esperar comando stty como esto:

# grab the password
stty -echo
send_user -- "Password for $user@$host: "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
set pass $expect_out(1,string)

#... later
send -- "$pass\r"

Tenga en cuenta que es importante llamar stty -echo antes send_user llamar - No estoy seguro exactamente por qué: Creo que es un problema de tiempo

.

esperan que los programadores deben leer todos los la libro: Exploración de esperar por Don Libes

Otros consejos

Aceptar, la fusión de las 2 respuestas anteriores (o por debajo, o donde quiera que estén ahora!):

#!/usr/bin/expect
log_user 0
set timeout 10
set userid  "XXXXX"
set pass    "XXXXXX"

### Get two arguments - (1) Host (2) Command to be executed
set host    [lindex $argv 0] 
set command [lindex $argv 1]

# grab the password
stty -echo
send_user -- "Password for $userid@$host: "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
set pass $expect_out(1,string)

spawn /usr/bin/ssh -l $userid $host
match_max [expr 32 * 1024]

expect {
    -re "RSA key fingerprint" {send "yes\r"}
    timeout {puts "Host is known"}
}

expect {
     -re "username: " {send "$userid\r"} 
     -re "(P|p)assword: " {send "$pass\r"}
     -re "Warning:" {send "$pass\r"}
     -re "Connection refused" {puts "Host error -> $expect_out(buffer)";exit}
     -re "Connection closed"  {puts "Host error -> $expect_out(buffer)";exit}
     -re "no address.*" {puts "Host error -> $expect_out(buffer)";exit}

     timeout {puts "Timeout error. Is host down or unreachable?? ssh_expect";exit}
}

expect {
   -re "\[#>]$" {send "term len 0\r"}
   timeout {puts "Error reading prompt -> $expect_out(buffer)";exit}
}


expect {
   -re "\[#>]$" {send "$command\r"}

   timeout {puts "Error reading prompt -> $expect_out(buffer)";exit}
}

expect -re "\[#>]$"
set output $expect_out(buffer)
send "exit\r"
puts "$output\r\n"

Tenga en cuenta que he cambiado la variable $ $ contraseña para pasar a ser consistente con la otra respuesta.

Si lo prefiere puede dejar que ssh recoger la contraseña a través de X11 utilizando la variable de entorno SSH_ASKPASS.

Desde la página del manual:

> SSH_ASKPASS
>     If ssh needs a passphrase, it will read the passphrase from the
>     current terminal if it was run from a terminal.  If ssh does not
>     have a terminal associated with it but DISPLAY and SSH_ASKPASS
>     are set, it will execute the program specified by SSH_ASKPASS
>     and open an X11 window to read the passphrase.  This is particularly
>     useful when calling ssh from a .xsession or related script.
>     (Note that on some machines it may be necessary to redirect the
>     input from /dev/null to make this work.)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top