Erwarten Sie ein Skript für die Telnet-Kommunikation mit dem DLink-Router

Erwarten Sie ein Skript für die Telnet-Kommunikation mit dem DLink-Router

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 expectTeil 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 autoexpectPaket installiert ( expect-devauf 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

autoexpectautomatisch 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 autoexpectautomatisch generierte Skripte verwenden sollten. Und wenn diese automatisch generierten Skripte fehlerhaft sind, liegt das höchstwahrscheinlich an einer falschen Mustererkennung im expectTeil.

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.

verwandte Informationen