Seite 1 von 2

Backup eines Switches

Verfasst: Donnerstag 11. September 2014, 10:17
von dacki
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

Re: Backup eines Switches

Verfasst: Donnerstag 11. September 2014, 10:33
von Sirius3
@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.

Re: Backup eines Switches

Verfasst: Donnerstag 11. September 2014, 10:35
von 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”.

Re: Backup eines Switches

Verfasst: Donnerstag 11. September 2014, 11:08
von dacki
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

Re: Backup eines Switches

Verfasst: Donnerstag 11. September 2014, 12:07
von Sirius3
@dacki: Du mußt wirklich zweimal auf "destination hostname" warten?

Re: Backup eines Switches

Verfasst: Donnerstag 11. September 2014, 12:22
von dacki
@ 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

Re: Backup eines Switches

Verfasst: Donnerstag 11. September 2014, 12:30
von /me
dacki hat geschrieben:3. Frage destination file name-> eintragen ->
Laut Code fragst du hier aber den Text "destination host name" ab.

Re: Backup eines Switches

Verfasst: Donnerstag 11. September 2014, 12:36
von dacki
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

Re: Backup eines Switches

Verfasst: Donnerstag 11. September 2014, 13:18
von Sirius3
@dacki: Dann mußt Du halt wie am Anfange schauen, was zurückgegeben wird, und warum er den Suchstring nicht findet.

Re: Backup eines Switches

Verfasst: Montag 15. September 2014, 10:17
von dacki
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

Re: Backup eines Switches

Verfasst: Montag 15. September 2014, 10:27
von 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.

Re: Backup eines Switches

Verfasst: Montag 15. September 2014, 11:23
von dacki
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

Re: Backup eines Switches

Verfasst: Montag 15. September 2014, 12:12
von Sirius3
@dacki: hast Du tatsächlich ein `read_all` dazwischen stehen?

Re: Backup eines Switches

Verfasst: Montag 15. September 2014, 12:45
von dacki
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

Re: Backup eines Switches

Verfasst: Montag 15. September 2014, 13:14
von 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.

Re: Backup eines Switches

Verfasst: Montag 15. September 2014, 13:17
von dacki
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.

Re: Backup eines Switches

Verfasst: Montag 15. September 2014, 13:23
von BlackJack
@dacki: Also mich wundert das nicht. Das auf das Du wartest wird sicher niemals gesendet, also kannst Du lange warten. ;-)

Re: Backup eines Switches

Verfasst: Montag 15. September 2014, 13:29
von dacki
aber es erscheint auf dem telnet schirm, also ist doch eine Ausgabe seitens des switches vorhanden oder verstehe ich das falsch
??

Re: Backup eines Switches

Verfasst: Montag 15. September 2014, 13:54
von BlackJack
@dacki: Da erscheint ziemlich sicher nicht b'Enter s\n'. Dir ist schon klar was das \n da bedeutet‽

Re: Backup eines Switches

Verfasst: Montag 15. September 2014, 13:58
von dacki
so wie ich das verstanden habe ist das \n eine newline anweisung also sowas wie ein "Enter" auf der tastatur