Verwenden von Junos PyEZ für den Zugriff auf die Shell auf Junos-Geräten
ZUSAMMENFASSUNG Verwenden Sie Junos PyEZ, um eine Verbindung zur Shell auf Junos-Geräten herzustellen und Befehle auszuführen.
StartShell Übersicht
Die Junos CLI verfügt über viele Befehle für den Betriebsmodus, die Informationen zurückgeben, die den Informationen ähneln, die von vielen Shell-Befehlen zurückgegeben werden. Daher ist der Zugriff auf die UNIX-Shell auf Junos-Geräten in der Regel nicht erforderlich. In einigen Fällen muss ein Benutzer oder eine Anwendung jedoch auf die Shell zugreifen und Shell-Befehle ausführen oder CLI-Befehle von der Shell ausführen.
Das Junos PyEZ-Modul jnpr.junos.utils.start_shell
definiert die Klasse, die StartShell
es Junos PyEZ-Anwendungen ermöglicht, eine SSH-Verbindung zu einem Junos-Gerät herzustellen und auf die Shell zuzugreifen. Die StartShell
Methoden ermöglichen es der Anwendung, dann Befehle über die Verbindung auszuführen und die Antwort abzurufen.
Die StartShell
open()
Methoden und close()
stellen eine SSH-Verbindung mit dem Gerät her und beenden sie. Wenn die Clientanwendung nur Zugriff auf die Shell benötigt, kann sie daher die Aufrufe der Device
open()
and-Methode close()
weglassen.
In Junos PyEZ, Version 2.6.7 und früher, stellt die StartShell
Instance eine Verbindung zum SSH-Standardport 22 her. Ab Junos PyEZ, Version 2.6.8, stellt die StartShell
Instanz eine Verbindung zu demselben Port her, der in der Device
Instanz definiert ist, außer in den folgenden Fällen, in denen die Shell-Verbindung weiterhin Port 22 verwendet:
-
Device
host
ist auf 'localhost' gesetzt. -
Device
port
auf 830 gesetzt ist. -
Device
port
ist nicht definiert.
Ausführen von Befehlen über die Shell
Die StartShell
run()
Methode führt einen Shellbefehl aus und wartet auf die Antwort. Standardmäßig wartet die Methode auf eine der standardmäßigen Shell-Eingabeaufforderungen (%, #, > oder $), bevor sie die Befehlsausgabe zurückgibt. Alternativ können Sie das Argument this="string"
auf eine bestimmte Zeichenfolge festlegen, und die Methode wartet auf die erwartete Zeichenfolge oder das erwartete Muster, bevor sie die Befehlsausgabe zurückgibt.
Der Rückgabewert ist ein Tupel. Das erste Element ist True
, wenn der Exitcode 0 ist, und False
sonst. Das zweite Element ist die Ausgabe des Befehls.
Im folgenden Beispiel wird eine Verbindung zu einem Host hergestellt und zwei Betriebsmodusbefehle von der Shell ausgeführt. Das Skript führt zuerst den request support information
Befehl aus und speichert die Ausgabe in einer Datei. Das Skript führt dann den show version
Befehl aus, speichert die Ausgabe in der version
Variablen und gibt dann den Inhalt der Variablen aus.
from jnpr.junos import Device from jnpr.junos.utils.start_shell import StartShell dev = Device(host='router1.example.net') ss = StartShell(dev) ss.open() ss.run('cli -c "request support information | save /var/tmp/information.txt"') version = ss.run('cli -c "show version"') print (version) ss.close()
Das zurückgegebene Tupel enthält den booleschen Wert, der dem Exitcode für den Befehl entspricht, und die Befehlsausgabe für den show version
Befehl. Die Ausgabe in diesem Beispiel ist der Kürze halber gekürzt.
(False, '\r \rHostname: router1\r\nModel: mx104\r\nJunos: 17.1R8\r\nJUNOS Base OS boot [17.1R1.8]\r\n ...)
Instanzen der StartShell
Klasse können auch als Kontext-Manager verwendet werden. In diesem Fall müssen Sie die StartShell
open()
and-Methode close()
nicht explizit aufrufen. Zum Beispiel:
from jnpr.junos import Device from jnpr.junos.utils.start_shell import StartShell dev = Device(host='router1.example.net') with StartShell(dev) as ss: ss.run('cli -c "request support information | save /var/tmp/information.txt"') version = ss.run('cli -c "show version"') print (version)
Angeben des Shell-Typs
Ab Junos PyEZ, Version 2.6.4, wird das shell_type
Argument in Remote-Skripten unterstützt, StartShell
um den Shell-Typ anzugeben. StartShell
Unterstützt die folgenden Shell-Typen:
-
C-Schale (csh)
-
Bourne-Muschel (Asche)
Standardmäßig StartShell
sind Instanzen vom Typ C Shell (csh). Sie können auch angeben shell_type="sh"
, dass eine Bourne-artige Hülle (Asche) gestartet werden soll. Zum Beispiel:
from jnpr.junos import Device from jnpr.junos.utils.start_shell import StartShell dev = Device(host='router1.example.net') with StartShell(dev, shell_type="sh") as ss: version = ss.run('cli -c "show version"') print (version)
So geben Sie eine Zeitüberschreitung an
Sie können das Argument StartShell
timeout
einschließen, um die Zeitspanne in Sekunden anzugeben, die das Dienstprogramm auf die erwartete Zeichenfolge oder das erwartete Muster warten muss, bevor ein Timeout auftritt. Wenn Sie kein Timeout angeben, beträgt der Standardwert 30 Sekunden.
Die erwartete Zeichenfolge ist der im Argument this
definierte Wert. Wenn Sie nicht definieren this
, ist die erwartete Zeichenfolge eine der Standard-Shell-Eingabeaufforderungen. Wenn Sie stattdessen den speziellen Wert this=None
festlegen, wartet das Gerät die Dauer des Timeouts, bevor es die Befehlsausgabe erfasst, wie unter Ausführen nicht wiederkehrender Shellbefehle beschrieben.
from jnpr.junos import Device from jnpr.junos.utils.start_shell import StartShell dev = Device(host='router1.example.net') with StartShell(dev) as ss: ss.run('cli -c "request support information | save /var/tmp/information.txt"', timeout=60) version = ss.run('cli -c "show version"') print (version)
Gestaffelte Befehlsausführung
Es kann vorkommen, dass Sie mehrere Aufrufe der run()
Methode ausführen oder in einer Schleife durchlaufen möchten. Um die Ausgabe zu stabilisieren, können Sie das Argument sleep
angeben. Das sleep
Argument weist das Gerät an, die angegebene Anzahl von Sekunden zu warten, bevor es Daten aus dem Puffer empfängt. Sie können eine Gleitkommazahl für eine Genauigkeit von unter einer Sekunde definieren sleep
.
from jnpr.junos import Device from jnpr.junos.utils.start_shell import StartShell dev = Device(host='router1.example.net') tables = ['inet.0', 'inet.6'] with StartShell(dev) as ss: for table in tables: command = 'cli -c "show route table ' + table + '"' rsp = ss.run(command, sleep=5) pprint (rsp)
Ausführen von nicht wiederkehrenden Shell-Befehlen
In bestimmten Fällen müssen Sie möglicherweise nicht zurückgegebene Shellbefehle ausführen, z. B. den Befehl, der monitor traffic
Datenverkehr anzeigt, der von der lokalen Routing-Engine ausgeht oder endet. In der Junos CLI zeigt der monitor traffic
Befehl die Informationen in Echtzeit an, bis der Benutzer eine Tastatursequenz von Strg+c sendet, um die Paketerfassung zu stoppen.
Sie können nicht zurückgegebene Shell-Befehle mit der StartShell
run()
Methode ausführen, indem Sie das Argument this=None
. Wenn Sie das Argument this=None
einschließen, wartet die Methode bis zum angegebenen Timeoutwert, um alle Befehlsausgaben von der Shell abzurufen und zurückzugeben. In diesem Fall ist True
das erste Element des zurückgegebenen Tupels, wenn das Ergebnis des ausgeführten Shell-Befehls Inhalt zurückgibt, und das zweite Element ist die Befehlsausgabe. Wenn Sie das Argument this
weglassen oder es auf eine bestimmte Zeichenfolge oder ein bestimmtes Muster festlegen, gibt die Methode möglicherweise eine Teilausgabe für einen nicht zurückgegebenen Befehl zurück, wenn sie in der Befehlsausgabe auf eine Standardeingabeaufforderung oder das angegebene Zeichenfolgenmuster stößt.
Der folgende Beispielcode führt den monitor traffic interface fxp0
Befehl aus, wartet 15 Sekunden und ruft dann die Befehlsausgabe ab und gibt sie zurück.
from jnpr.junos import Device from jnpr.junos.utils.start_shell import StartShell from pprint import pprint dev = Device(host='router1.example.net') with StartShell(dev) as ss: pprint(ss.run('cli -c "monitor traffic interface fxp0"', this=None, timeout=15))
Tabelle "Änderungshistorie"
Die Funktionsunterstützung hängt von der Plattform und der Version ab, die Sie verwenden. Verwenden Sie den Feature-Explorer , um festzustellen, ob ein Feature auf Ihrer Plattform unterstützt wird.
StartShell
Instanz eine Verbindung zu demselben Port her, der in der
Device
Instanz definiert ist, es sei denn, der Host ist auf localhost festgelegt oder der Port ist 830 oder nicht definiert.