Backup eines Switches

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
dacki
User
Beiträge: 12
Registriert: Donnerstag 11. September 2014, 08:53

Hallo Liebe Community

Wie sich jeder Leser dieses Threads denken kann bin ich mit Python noch recht unerfahren. Ob ich auch mit meinem anliegen hier richtig weiß ich auch nicht richtig, daher entschuldige ich mich bereits im voraus dafür.

Ich denke das mir jemand von euch helfen kann. Zu meinem kleinen Projekt :

Ich möchte eine automatisierte Lösung für das Backup eines switches erstellen. Ich habe bereits es geschafft mich via Python an dem gerät anzumelden und auch so weit durchzuhageln bis ich mir die Config Datei runterladen will.

Der switch möchte nach dem befehl "copy flash tftp" die Eingabe von Informationen wie :
source file
tftp server adress
destination file name

Für diese kommen drei einzelne Zeilen im switch jeweils nach der Eingabe der vorhergehenden frage. Und ab da geht mein Script nicht mehr weiter als ob meine antworten nicht mehr weitergereicht werden und der switch auf eine antworte wartet.

Code: Alles auswählen

import telnetlib

HOST = "Geräte IP"

tn = telnetlib.Telnet(HOST)
tn.set_debuglevel(999)

tn.write(b'mein User\n')
  tn.read_until(b'Password: ')
tn.write(b'mein PW\n')
tn.write(b'en\n')
tn.write(b'copy flash tftp\n')
  print (tn.read_all())
tn.write(b'default.cfg\n')
  print (tn.read_all())
tn.write(b'TFTP IP\n')
  print (tn.read_all())
tn.write(b'switch.cfg\n')

  print (tn.read_all()) 

tn.write(b'exit\n')
Hier noch die Ausgabe :

Code: Alles auswählen

Telnet(Geräte IP,23): send b'Mein User\n'
Telnet(Geräte IP,23): recv b"\xff\xfd\x18\xff\xfd \xff\xfd#\xff\xfd'"
Telnet(Geräte IP,23): IAC DO 24
Telnet(Geräte IP,23): IAC DO 32
Telnet(Geräte IP,23): IAC DO 35
Telnet(Geräte IP,23): IAC DO 39
Telnet(Geräte IP,23): recv b'\xff\xfb\x03\xff\xfd\x01\xff\xfd\x1f\xff\xfb\x05\xff\xfd!'
Telnet(Geräte IP,23): IAC WILL 3
Telnet(Geräte IP,23): IAC DO 1
Telnet(Geräte IP,23): IAC DO 31
Telnet(Geräte IP,23): IAC WILL 5
Telnet(Geräte IP,23): IAC DO 33
Telnet(Geräte IP,23): recv b'\xff\xfb\x03'
Telnet(Geräte IP,23): IAC WILL 3
Telnet(Geräte IP,23): recv b'\xff\xfb\x01'
Telnet(Geräte IP,23): IAC WILL 1
Telnet(Geräte IP,23): recv b'Switch login: mein User\r\nPassword: '
Telnet(Geräte IP,23): send b'mein PW\n'
Telnet(Geräte IP,23): send b'en\n'
Telnet(Geräte IP,23): send b'copy flash tftp\n'
Telnet(Geräte IP,23): recv b'\r\n'
Telnet(Geräte IP,23): recv b'en\r\n'
Telnet(Geräte IP,23): recv b'copy flash tftp\r\n' # anweisung für die sicherung 
Telnet(Geräte IP,23): recv b'No entry for terminal type "network";\r\nusing vt100'
Telnet(Geräte IP,23): recv b' terminal settings.\r\n'
Telnet(Geräte IP,23): recv b'\r\x00\r\nAlliedWare Plus (TM) 5.4.2 09/25/13 12:57:05\r\n'
Telnet(Geräte IP,23): recv b'\r\nSwitch>en\r\x00\r\nSwitch#copy flash tftp\r\x00\r\nEnter s'
Telnet(Geräte IP,23): recv b'ource file name []:' # --> und ab hier passiert nichts mehr
so was mache ich falsch ich will ja nur übergeben wie die Datei heißt die auf dem switch liegt wo er es hinschicken soll und wie sie am ziel heißen soll danach reicht ein Exit.

Ich danke euch für eure Hilfe und wünsche noch einen schönen Tag.

Gruss Dacki
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@dacki: hier mal die Dokumentation von read_all:

Telnet.read_all()
Read all data until EOF; block until connection closed.

Du brauchst halt hier auch ein read_until.
BlackJack

@dacki: `read_all()` bedeutet wirklich das *lese alles* und zwar bis die Gegenseite die Verbindung schliesst. Dummerweise tut sie das nicht, weil sie ja auf Eingaben von Dir wartet. Du wartest auf das Ende der Kommunikation, und der Switch wartet auf Eingaben von Dir. So warten beide Seiten bis in alle Ewigkeit. Klassischer „deadlock”.
dacki
User
Beiträge: 12
Registriert: Donnerstag 11. September 2014, 08:53

Danke der schnelle Antwort. Ich habe die tn.read_all ausgetauscht und ein until eingesetzt.

Code: Alles auswählen

import telnetlib



HOST = "Geräte IP"

tn = telnetlib.Telnet(HOST)
tn.set_debuglevel(999)
tn.write(b'mein User\n')
tn.read_until(b'Password: ')
tn.write(b'mein PW\n')
tn.write(b'en\n')
tn.write(b'copy flash tftp\n')
print (tn.read_until(b'Enter source file name[]:'))
tn.write(b'default.cfg\n')
print (tn.read_until(b'Enter destination host name []:'))
tn.write(b'TFTP IP\n')
print (tn.read_until(b'Enter destination host name []:'))
tn.write(b'Switch.cfg\n')

tn.write(b'exit\n')

Und leider kommt wieder nichts. Ich weiß nicht worauf er wartet.
???? Verstehe ich nicht HELP^^

Gruss Dacki
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@dacki: Du mußt wirklich zweimal auf "destination hostname" warten?
dacki
User
Beiträge: 12
Registriert: Donnerstag 11. September 2014, 08:53

@ sirius3

jup leider schon

zuerst ist der befehl

copy flash tftp
danach
1.Frage source file name : eintragen ->
erst wenn die frage 1 beantwortet wurde taucht die frage 2 auf

2.Frage tftp hostname : eintragen ->
erst wenn die frage 2 beantwortet wurde taucht die frage 3 auf

3. Frage destination file name-> eintragen ->

danach kommt nur noch der
copying...
und dann
successful operation
wenn es geklappt hat
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

dacki hat geschrieben:3. Frage destination file name-> eintragen ->
Laut Code fragst du hier aber den Text "destination host name" ab.
dacki
User
Beiträge: 12
Registriert: Donnerstag 11. September 2014, 08:53

richtig

Enter source file name[]:

Enter destination host name []:

Enter destination host name []:

Das sind die genauen Sätze die der switch dann zurückgibt. Also nach dem Copy befehl.

Hatte weiter oben das nur schnell hingeschrieben sollte nur beispielhaft sein.

Gruss Dacki
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@dacki: Dann mußt Du halt wie am Anfange schauen, was zurückgegeben wird, und warum er den Suchstring nicht findet.
dacki
User
Beiträge: 12
Registriert: Donnerstag 11. September 2014, 08:53

Hi sirius3

würdest du mir vielleicht verraten wie ich die Infos bekommen könnte denn ich lasse mir ja nu mit read_all alles ausgeben was kann ich denn noch tun


MFG Dacki
BlackJack

@dacki: Die Information wird Dir doch ausgegeben wenn Du den Debug-Level entsprechend setzt, wie man in Deinem ersten Beitrag schön sehen kann. Da steht doch genau was gesendet und empfangen wird.
dacki
User
Beiträge: 12
Registriert: Donnerstag 11. September 2014, 08:53

Hallo Blackjack

ich habe bereits die möglichekieten ausprobiert:

Code: Alles auswählen

tn.write(b'copy flash tftp\n')
print (tn.read_all())
print (tn.read_until(b'ource file name []:\n'))
sowie

Code: Alles auswählen

tn.write(b'copy flash tftp\n')
print (tn.read_all())
print (tn.read_until(b'Enter s\n'))
Und auch das

Enter source file name[]:

Egal was ich eingebe es kommt immer diese meldung und er macht nicht weiter:

Code: Alles auswählen

Telnet(10.220.0.11,23): recv b'\r\nDKBSW11>en\r\x00\r\nDKBSW11#copy flash tftp\r\x00\r\nEnter s'
Telnet(10.220.0.11,23): recv b'ource file name []:'
Ich danke euch für die Hilfe und entschuldige mich das soviel zeit dafür drauf geht.

Gruss Dacki
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@dacki: hast Du tatsächlich ein `read_all` dazwischen stehen?
dacki
User
Beiträge: 12
Registriert: Donnerstag 11. September 2014, 08:53

ok Hier nochmal meinen code

Code: Alles auswählen

import telnetlib

HOST = "Geräte IP"

tn = telnetlib.Telnet(HOST)
tn.set_debuglevel(999)
tn.write(b'Mein User\n')
tn.read_until(b'Password: ')
tn.write(b'mein PW\n')
tn.write(b'en\n')
tn.write(b'copy flash tftp\n')
print (tn.read_all())
print (tn.read_until(b'Enter s\n'))
tn.write(b'default.cfg\n')
print (tn.read_until(b'Enter destination host name []:\n'))
tn.write(b'Switch\n')
print (tn.read_until(b'Enter destination host name []:\n'))
tn.write(b'Switch.cfg\n')
 

tn.write(b'exit\n')
Damit man erst gar nicht was falsches denken kann..:D
BlackJack

@dacki: Na das Problem hatten wir doch schon mal. Beim ersten `read_all()` bleibt Dein Programm hängen, weil das auf das Ende der Daten wartet, das aber nie kommt, weil die Gegenseite auf Daten von Deinem Skript wartet.
dacki
User
Beiträge: 12
Registriert: Donnerstag 11. September 2014, 08:53

ok nun verzweifel ich doch langsam etwas daran entweder gibt der Switch gar nix zurück oder ich übersehe etwas ich habe nun das read_all raus genommen und trotzdem bleibt er an dieser stelle stehen zum schreien.
BlackJack

@dacki: Also mich wundert das nicht. Das auf das Du wartest wird sicher niemals gesendet, also kannst Du lange warten. ;-)
dacki
User
Beiträge: 12
Registriert: Donnerstag 11. September 2014, 08:53

aber es erscheint auf dem telnet schirm, also ist doch eine Ausgabe seitens des switches vorhanden oder verstehe ich das falsch
??
BlackJack

@dacki: Da erscheint ziemlich sicher nicht b'Enter s\n'. Dir ist schon klar was das \n da bedeutet‽
dacki
User
Beiträge: 12
Registriert: Donnerstag 11. September 2014, 08:53

so wie ich das verstanden habe ist das \n eine newline anweisung also sowas wie ein "Enter" auf der tastatur
Antworten