Pergunta

Eu tenho um esperar script que se conecta a um alguns routers através de ssh. Todos esses roteadores têm a mesma senha (eu sei, é errado), eo script precisa saber que a senha, a fim de ser capaz de se conectar aos roteadores. Atualmente, a senha é passada para o meu script como um argumento na linha de comando, mas isso significa que há um traço de que a senha no meu arquivo .bash_history, bem como nos processos em execução. Então, ao invés eu gostaria que o usuário seja solicitada uma senha, se possível em silêncio.

Você sabe se é ou não é possível solicitar ao usuário uma senha com espera?

Obrigado.

Editar : se eu estava conectando a servidores em vez de roteadores, eu provavelmente iria usar chaves SSH em vez de senhas. Mas os routers eu estou usando apenas senhas de apoio.

Foi útil?

Solução

Use esperar de comando stty assim:

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

Note que é importante para chamar stty -echo antes chamando send_user - Eu não sei exatamente o porquê:. Eu acho que é um problema de tempo

esperar programadores devem todos leitura o livro: Explorando esperar por Don Libes

Outras dicas

OK, a fusão das 2 respostas acima (ou abaixo ou onde quer que estejam agora!):

#!/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"

Note que eu mudei a variável $ senha para $ passe para ser consistente com a outra resposta.

Como alternativa, você poderia deixar ssh recolher a senha via X11 usando a variável de ambiente SSH_ASKPASS.

A partir da página man:

> 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top