Ich versuche, mit diesem Skript über Telnet eine Verbindung zu meinem Router herzustellen:
#!/usr/bin/expect -f
set timeout 20
# router user name
set name "admin"
# router password
set pass "admin"
# router IP address
set routerip "192.168.1.1"
# Read command as arg to this script
set routercmd "cat /var/1.leases"
# start telnet
spawn telnet $routerip
# send username & password
expect "username:"
send -- "$name\n"
expect "password:"
send -- "$pass\n"
# get out of ISP's Stupid menu program, go to shell
expect "TBS>>"
send -- "sh\n"
# execute command
expect -re ".*\$"
send -- "$routercmd\n"
# exit
send -- "^D"
Jetzt funktioniert das Skript bis zu diesem send -- "sh\n"
Teil einwandfrei. Es gelangt zur Shell-Eingabeaufforderung, die wie folgt aussieht: ~ $
(Tilde-Leerzeichen-Dollar-Leerzeichen). Danach kann ich den Befehl jedoch nicht mehr ausführen. Danach funktioniert es im Grunde einfach nicht mehr.
Kann mir jemand sagen, warum? Mache ich einen Fehler?
Antwort1
Okay. Ich habe es geknackt. Es musste etwas mit einem falschen Mustervergleich im expect
Teil der letzten Zeilen des Codes zu tun haben.
Als erstes habe ich ein aufgezeichnetes Skript mit erstellt autoexpect
. Dieses Tool wird verwendet, um Ihre Sitzungen aufzuzeichnen und darauf basierend ein Skript zu erstellen. Dazu habe ich zuerst das autoexpect
Paket installiert ( expect-dev
auf Debian-basierten Systemen als Paket verfügbar) und dann meine Sitzung aufgezeichnet:
sudo apt-get install expect-dev #Since I'm on Ubuntu
autoexpect telnet 192.168.1.1
autoexpect
automatisch ein Skript für mich generiert. Als ich dieses Skript ausführte, dauerte es bis zur Ausführung meines Befehls und führte ihn im Router aus, konnte dann aber nicht beendet werden. Anhand der Hinweise aus diesem Skript und der Manpage von expect fand ich schließlich heraus, dass es ein Problem mit der Mustererkennung gab. Schließlich änderte ich das Skript entsprechend und das hier funktioniert nun endlich:
#I am mentioning here only the end part of the complete script which was faulty
# execute command
expect "~ \$ "
send -- "$routercmd\r"
expect "~ \$ "
send -- "exit\r"
expect -- "TBS>>"
send -- "exit\r"
expect -- "*Are you sure to logout?*"
send -- "y"
expect eof
Die Lektion war also, dass wir autoexpect
automatisch generierte Skripte verwenden sollten. Und wenn diese automatisch generierten Skripte fehlerhaft sind, liegt das höchstwahrscheinlich an einer falschen Mustererkennung im expect
Teil.
In meinem Fall war der im Wesentlichen fehlerhafte Teil:
expect -re ".*\$" #WRONG
expect "~ \$ " #RIGHT
Die fehlerhaften Teile hängen vollständig von Ihrer Sitzung ab, mit der Sie Kontakt aufnehmen. Wenn Sie einen Mailserver über Telnet kontaktieren, werden unterschiedliche Ergebnisse zurückgegeben, und Sie müssen entsprechend vorgehen.