Frage

Ich habe ein Skript erwarten, dass auf ein paar Router über ssh verbindet. All diese Router haben das gleiche Passwort (ich weiß, dass es falsch ist), und das Skript muss wissen, dass das Kennwort, um den Router verbinden zu können. Derzeit wird das Passwort zu meinem Skript als Argument auf der Kommandozeile übergeben, aber das bedeutet, dass es eine Spur von diesem Passwort in meiner .bash_history Datei sowie in den laufenden Prozessen. Anstatt also würde ich den Benutzer gerne nach einem Passwort gefragt werden, wenn möglich leise.

Sie Sie wissen, ob es möglich ist, den Benutzer zur Eingabe eines Kennworts auffordern mit erwarten?

Danke.

Bearbeiten : Wenn ich auf Server anstelle von Routern verbindet wurde, habe ich wahrscheinlich SSH-Schlüssel anstelle von Passwörtern verwenden. Aber die Router ich benutze unterstützen nur Passwörter.

War es hilfreich?

Lösung

Verwenden Sie erwarten von stty Befehl wie folgt aus:

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

Beachten Sie, dass es wichtig ist, stty -echo zu nennen vor Aufruf send_user - Ich bin nicht sicher genau, warum: Ich denke, es ist ein Timing-Problem

.

erwarten Programmierer sollten alle lesen die Buch: Erwarten Sie Exploring von Don Libes

Andere Tipps

OK, die Zusammenführung der zwei Antworten oben (oder unten oder wo auch immer sie sind jetzt!):

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

Beachten Sie, dass ich die $ Passwort Variable $ geändert übergeben mit der anderen Antwort konsistent sein.

Alternativ könnten Sie lassen ssh das Passwort über X11 sammeln die SSH_ASKPASS Umgebungsvariable verwendet wird.

Aus der Manpage:

> 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.)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top