fragen stichworte

Erwarten Sie, dass Skriptprobleme aus der Datei gelesen werden

Ich versuche, das Kennwort eines Benutzers auf einer Reihe von Linux-basierten Routern zu ändern, der IPs aus einer Liste abruft. Die iplist.txt ist nur eine Liste von ips (eine pro Zeile). Dies ist der Code, den ich zu verwenden versuche:

   #!/usr/bin/expect
    set timeout 20
    #Edit for User
    set user username
    #Edit for Old Password
    set old oldpassword
    #Edit for New Password
    set new newpassword
    #get IP List from iplist.txt
    set f [open "/iplist.txt"]
    set hosts [split [read $f] "\n"]
    close $f

    foreach host $hosts {
            spawn -noecho ssh -q -o "StrictHostKeyChecking=no" $user@$host
            expect "assword:"
            send "$old\r"
            expect ">"
            send "user set $user password=$new\r"
            expect ">"
            send "quit\r"
            expect eof
            close
    }

Was für die erste IP in der Liste funktioniert, aber diese Fehlermeldung an die zweite senden:

   spawn_id: spawn id exp4 not open

Ich habe es so gemacht, wie ich wollte:

#!/usr/bin/expect
set timeout 30
#Edit for User
set user user
#Edit for Old Password
set old oldpassword
#Edit for New Password
set new newpassword
#get IP List from iplist.txt
set f [open "/iplist.txt"]
set data [read $f]
close $f

foreach line [split $data \n] {
        if {$line eq {}} continue
        spawn -noecho ssh -q -o "StrictHostKeyChecking=no" $user@$line
        expect "assword:"
        send "$old\r"
        expect ">"
        send "user set $user password=$new\r"
        expect ">"
        send "\r"
        expect ">"
        send "quit\r"
        send "\r"
        expect eof
}

Das nächste Problem, dem ich begegne, ist, wenn das Gerät nicht das alte Passwort hat oder wenn die Linux-Box das Gerät nicht über ssh erreichen kann, es wird mit derselben Spawn-ID exp * ausgegeben, die nicht geöffnet ist IP und wird nicht mit der nächsten IP in der Liste fortgesetzt. Gibt es sowieso eine Aussage, die besagt, ob "assword:" ein zweites Mal erscheint, um zur nächsten IP zu wechseln, und wenn ">" so erscheint, als sollte es mit dem Skript weitergehen, dann füge eine Zeile nach dem Spawn-Befehl hinzu wechselt zur nächsten IP in der Liste, wenn sie nicht das erste erwartete "assword:" empfängt?

Jede Hilfe wäre dankbar. Ich bin neu zu erwarten, scheint aber ein wirklich gutes Werkzeug für Massen-SSH-Prozesse in einem Skript zu sein. Nur wenn Sie Probleme haben, es zu korrigieren, um nicht bei einem Job Fehler zu machen, anstatt bei einem Fehler zum nächsten Job zu wechseln.

antworten

#!/usr/bin/expect
set timeout 30
#Edit for User
set user user
#Edit for Old Password
set old oldpassword
#Edit for New Password
set new newpassword
#get IP List from iplist.txt
set f [open "/iplist.txt"]
set data [read $f]
close $f

foreach line [split $data \\n] {
        if {$line eq {}} continue
        spawn -noecho ssh -q -o "StrictHostKeyChecking=no" $user@$line
        expect {
                "assword:" {
                        send "$old\\r"
                        expect {
                                "assword:" {
                                                close
                                                continue
                                                }}
                        expect {
                                "*" {
                                        send "user set $user password=$new\\r"
                                        expect ">"
                                        send "quit\\r"
                                        close
                                        continue
                                        }}}}
        expect {
                "*" {
                        close
                        continue
                        }}
        expect eof
}

Wahrscheinlich etwas schmutziges Scripting, aber es funktioniert. Wenn ich jetzt herausfinden kann, wie man erfolgreiche, falsche Passwort- und Timeout-Logs exportiert, weiß ich, ob irgendwelche Fehler behoben sind.