Question

J'ai un script qui se connecte à attendre quelques routeurs via ssh. Tous ces routeurs ont le même mot de passe (je sais, c'est faux), et le script a besoin de savoir que le mot de passe afin de pouvoir se connecter aux routeurs. À l'heure actuelle, le mot de passe est passé à mon script comme argument sur la ligne de commande, mais cela signifie qu'il ya une trace de ce mot de passe dans mon dossier .bash_history ainsi que dans les processus en cours. Ainsi, au lieu que je voudrais que l'utilisateur soit invité à entrer un mot de passe, si possible en silence.

Savez-vous si oui ou non il est possible de demander à l'utilisateur un mot de passe attendre?

Merci.

Modifier : si je connecte aux serveurs au lieu de routeurs, je serais probablement utiliser des clés SSH à la place de mots de passe. Mais les routeurs prennent en charge que je utilise simplement les mots de passe.

Était-ce utile?

La solution

Utilisez la commande stty de s'attendre comme ceci:

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

Notez qu'il est important d'appeler stty -echo avant appeler send_user - Je ne sais pas exactement pourquoi: Je pense qu'il est un problème de synchronisation

.

attendent les programmeurs devraient tous lire livre: Explorer Expect par Don Libes

Autres conseils

OK, la fusion des 2 réponses ci-dessus (ou ci-dessous ou là où ils sont maintenant):

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

Notez que j'ai changé la variable de mot de passe $ à passer pour être compatible avec l'autre réponse.

vous pourriez aussi laisser ssh recueillir le mot de passe via X11 en utilisant la variable d'environnement SSH_ASKPASS.

A partir de la page de manuel:

> 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.)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top