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

1296
shivams

Ich versuche, mich über Telnet mit diesem Skript zu verbinden:

#!/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 gut bis zum send -- "sh\n"Teil. Sie gelangen zur Shell-Eingabeaufforderung, die wie ~ $folgt aussieht: (Tilda-Space-Dollar-Space). Ich kann den Befehl danach jedoch nicht mehr ausgeben. Danach funktioniert es einfach nicht.

Kann jemand sagen warum? Ist ihr Fehler, den ich mache?

1

1 Antwort auf die Frage

0
shivams

Okay. Ich habe es geknackt. Es hatte etwas mit einem falschen Musterabgleich in dem expectTeil in den letzten Zeilen des Codes zu tun .

Was ich zuerst gemacht habe, war die Erstellung eines aufgezeichneten Skripts mit autoexpect. Dieses Tool dient zum Aufzeichnen Ihrer Sitzungen und zum Generieren eines darauf basierenden Skripts. Dazu habe ich zuerst das autoexpectPaket ( expect-devauf Debian-basierten Systemen als Paket verfügbar ) installiert 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, reichte es bis zur Ausführung meines Befehls und zur Ausführung im Router, konnte es jedoch nicht beenden. Ich nahm Hinweise aus diesem Skript und las die erwartete Manpage. Ich fand schließlich heraus, dass es ein Problem mit der Mustererkennung gab. Ich habe das Skript schließlich entsprechend modifiziert, und das funktioniert schließlich:

#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 autoexpectSkripte automatisch generieren sollten. Wenn diese automatisch generierten Skripts fehlerhaft sind, liegt dies 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, an die Sie sich wenden. Wenn Sie einen E-Mail-Server über Telnet kontaktieren, werden unterschiedliche Ausgaben ausgegeben, und Sie müssen dementsprechend übereinstimmen.