Übertragen von Dateien mit Junos PyEZ
ZUSAMMENFASSUNG Verwenden Sie Junos PyEZ, um SCP-Dateien (Secure Copy) zwischen dem lokalen Host und einem Junos-Gerät zu sichern.
Junos PyEZ bietet Dienstprogramme, mit denen Sie Dateiverwaltungsaufgaben auf Junos-Geräten ausführen können. Sie können die Junos PyEZ-Klasse jnpr.junos.utils.scp.SCP verwenden, um das Kopieren von Dateien zwischen dem lokalen Host und einem Junos-Gerät zu sichern.
Die SCP open() Methode and close() stellt die Verbindung mit dem Gerät her und beendet sie. Wenn die Clientanwendung nur Dateikopiervorgänge ausführt, kann sie daher Aufrufe der Device open() and-Methode close() auslassen. Instanzen der SCP Klasse können als Kontext-Manager verwendet werden, die automatisch die open() and-Methoden close() aufrufen. Zum Beispiel:
from jnpr.junos import Device
from jnpr.junos.utils.scp import SCP
dev = Device('router1.example.com')
with SCP(dev) as scp:
scp.put('local-file', remote_path='path')
scp.get('remote-file', local_path='path')
SCP ermöglicht es Ihnen, den Fortschritt von Übertragungen mithilfe des progress Parameters zu verfolgen. Standardmäßig SCP werden keine Fortschrittsmeldungen ausgegeben. Legen Sie fest progress=True , dass Standardfortschrittsmeldungen in Übertragungsabschlussintervallen von 10 Prozent oder mehr ausgegeben werden.
with SCP(dev, progress=True) as scp:
Alternativ können Sie eine benutzerdefinierte Funktion definieren, um Statusmeldungen zu drucken, und dann den progress Parameter auf den Namen der Funktion setzen. Die Funktionsdefinition sollte zwei Parameter enthalten, die der Geräteinstanz und der Statusmeldung entsprechen. Zum Beispiel:
def log(dev, report):
print (dev.hostname + ': ' + report)
def main():
...
with SCP(dev, progress=log) as scp:
Das folgende Beispielprogramm überträgt die scp-test1.txt - und scp-test2.txt-Dateien vom lokalen Host in das Verzeichnis /var/tmp auf dem Zielgerät und anschließend die Meldungsprotokolldatei vom Zielgerät in ein Protokollverzeichnis auf dem lokalen Host. Das Meldungsprotokoll wird umbenannt, sodass der Hostname des Geräts an den Dateinamen angehängt wird. Im Beispiel werden SSH-Schlüssel zur Authentifizierung verwendet, die bereits auf dem lokalen Host und dem Gerät konfiguriert sind.
Zu Vergleichszwecken verwendet das Programm sowohl die Standard-Fortschrittsmeldungen als auch benutzerdefinierte Meldungen, die in der Funktion namens logdefiniert sind, um den Fortschritt der Übertragungen zu verfolgen.
from jnpr.junos import Device
from jnpr.junos.utils.scp import SCP
def log(dev, report):
print (dev.hostname + ': ' + report)
def main():
dev = Device('router1.example.com')
msgfile = 'logs/'+dev.hostname+'-messages'
try:
#Default progress messages
with SCP(dev, progress=True) as scp1:
scp1.put('scp-test1.txt', remote_path='/var/tmp/')
scp1.get('/var/log/messages', local_path=msgfile)
#Custom progress messages
with SCP(dev, progress=log) as scp2:
scp2.put('scp-test2.txt', remote_path='/var/tmp/')
scp2.get('/var/log/messages', local_path=msgfile)
except Exception as err:
print (err)
return
if __name__ == "__main__":
main()
Der Fortschritt der Übertragungen wird an die Standardausgabe gesendet. Die Standardausgabe (progress=True) enthält den Gerätenamen, die zu übertragende Datei und den Fortschritt der Übertragung sowohl in Bytes als auch in Prozent.
router1.example.com: scp-test1.txt: 8 / 8 (100%) router1.example.com: logs/router1.example.com-messages: 0 / 229513 (0%) router1.example.com: logs/router1.example.com-messages: 24576 / 229513 (10%) router1.example.com: logs/router1.example.com-messages: 139264 / 229513 (60%) router1.example.com: logs/router1.example.com-messages: 229513 / 229513 (100%)
Die benutzerdefinierte Funktion erzeugt in diesem Fall eine ähnliche Ausgabe.
router1.example.com : scp-test2.txt: 1 / 1 (100%) router1.example.com : logs/router1.example.com-messages: 0 / 526493 (0%) router1.example.com : logs/router1.example.com-messages: 57344 / 526493 (10%) router1.example.com : logs/router1.example.com-messages: 106496 / 526493 (20%) router1.example.com : logs/router1.example.com-messages: 212992 / 526493 (40%) router1.example.com : logs/router1.example.com-messages: 319488 / 526493 (60%) router1.example.com : logs/router1.example.com-messages: 368640 / 526493 (70%) router1.example.com : logs/router1.example.com-messages: 475136 / 526493 (90%) router1.example.com : logs/router1.example.com-messages: 526493 / 526493 (100%)
Geben Sie nach dem Ausführen des Programms den file list Befehl auf dem Zielgerät ein, um zu überprüfen, ob die scp-test1.txt - und scp-test2.txt-Dateien in das richtige Verzeichnis kopiert wurden.
user1@router1> file list /var/tmp/scp-test* /var/tmp/scp-test1.txt /var/tmp/scp-test2.txt
Auf dem lokalen Host sollte die Meldungsprotokolldatei , die umbenannt wird, um den Hostnamen des Geräts zu enthalten, im Protokollverzeichnis vorhanden sein.
user1@server:~$ ls logs router1.example.com-messages
Standardmäßig fragt Junos PyEZ die SSH-Standardkonfigurationsdatei unter ~/.ssh/config ab, sofern vorhanden. Sie können jedoch beim Erstellen der Geräteinstanz eine andere SSH-Konfigurationsdatei angeben, indem Sie den ssh_config Parameter in die Device Argumentliste aufnehmen. Zum Beispiel:
ssh_config_file = '~/.ssh/config_dc'
dev = Device('198.51.100.1', ssh_config=ssh_config_file)
Wenn Sie den ssh_private_key_file Parameter in die Argumentliste aufnehmen, um eine bestimmte private SSH-Schlüsseldatei für die Authentifizierung zu definieren, verwendet die Instanz dieselbe Schlüsseldatei für die Device SCP Authentifizierung beim Übertragen von Dateien.
key_file='/home/user1/.ssh/id_rsa_dc'
dev = Device('198.51.100.1', ssh_private_key_file=key_file)
with SCP(dev) as scp:
scp.put('scp-test.txt', remote_path='/var/tmp/')
Die SCP Klasse bietet auch Unterstützung für ProxyCommand, mit dem Sie Dateien vom lokalen Host auf das Zielgerät über einen Zwischenhost übertragen können, der netcat unterstützt. Dies ist nützlich, wenn Sie sich nur über den Zwischenhost am Zielgerät anmelden können. Um ProxyCommand zu konfigurieren, fügen Sie der SSH-Konfigurationsdatei die entsprechenden Informationen hinzu. Zum Beispiel:
user1@server:~$ cat ~/.ssh/config Host 198.51.100.1 User user1 ProxyCommand ssh -l user1 198.51.100.2 nc %h 22 2>/dev/null