Login auf SSH-Jumphost mit Netmiko

02.04.2021


In diesem Artikel zeige ich, wie man sich in der Programmiersprache Python mit Hilfe der Netmiko-Library auf einem Jumphost anmelden kann.


Zu Beginn des Programms müssen die nötigen Funktionen aus der Netmiko-Libary importiert werden:

from netmiko import ConnectHandler

from netmiko import redispatch


Quellcode

Das ist meine Python-Funktion für den Login auf dem Linux-SSH-Jumphost:


def verbindungJumphost():

""" Diese Funktion stellt die Verbindung zum Jumphost her. """


# Globale Variable net_connect referenzieren

global net_connect

# Verbindungsaufbau

jumphost = {'device_type': 'terminal_server', 'ip': ip_jumphost, 'username': ssh_username, 'password': ssh_passwort , 'global_delay_factor':1}

try:

net_connect = ConnectHandler(**jumphost, timeout=jumphost_timeout)

p=net_connect.find_prompt()

# Prüfen, ob ein Prompt gefunden wurde

# Kriterium: der Prompt muss mindestens vier Zeichen lang sein

if len(p)>3:

return 0

else:

return 1

except:

return 2

Erläuterung

Die Variable net_connect wird überall im Programm genutzt, sie ‚trägt‘ die Netzwerkverbindung zum SSH-Jumphost und damit indirekt auch zu allen ‚besuchten‘ Devices. Da sie global verwendet wird, wird sie mit dem Keyword global versehen.


In der Zeile jumphost = wird definiert, wie die Verbindung aufgebaut werden soll. ip_jumphost, ssh_username und ssh_passwort sind im Hauptprogramm festgelegte globale Variablen, natürlich allesamt Strings.


Der Eintrag 'device_type': 'terminal_server' legt fest, dass der Kommunikationspartner ein Terminal Server ist (statt z. B. ein IOS-Device), Konkret bedeutet dies, dass dort Unix/Linux gesprochen wird . Dies ist relevant, da Netmiko z. B. selber nach dem Command Prompt auf dem System sucht und sich dieses je nach Umgebung unterscheidet.


Der global_delay_factor ist ein optionaler Parameter, der aber wichtig werden kann. Er legt fest, wie lange Netmiko beim Verbindungsaufbau auf eine Reaktion des Jumphosts warten soll. Wenn der Wert überschritten wird, wird eine Exception ausgelöst. Per Default wartet Netmiko meist 100 Sekunden auf eine Reaktion des Gegenübers. Falls Netmiko länger warten soll, muss kann man diesen Wert erhöhen. Dabei werden die 100 Sekunden mit dem Faktor multipliziert. Falls man z. B. ein neues IOS-Image von einem TFTP-Server auf einen Switch kopiert, kann das ja auch mal länger dauern. Und dann macht es Sinn, diesen Wert zu erhöhen.


Der Befehl p=net_connect.find_prompt() wartet darauf, dass der Jumpserver sich meldet und liefert den gefunden Prompt zurück. Als Plausibilitätskontrolle habe ich noch die Bedingung festgelegt, dass diese Rückmeldung mindestens vier Zeichen lang sein muss, sonst stimmt etwas nicht.


Mit dem try: except: -Konstrukt werden Fehler abgefangen, damit das Programm im Fehlerfall geordnet beendet werden kann. Je nach aufgetretenem Fehler werden von der Funktion verschiedene Return-Codes zurückgeliefert. Ein Wert von 0 bedeutet, dass alles ok ist.


Die Verbindung zum Jumphost wieder schließen

Wenn kein Kommunikationsbedarf mehr zum Jumphost besteht, kann man die Verbindung schließen mit dem Befehl net_connect.disconnect(). Ich mach das meist am Ende, so dass ich die bestehende Verbindung zum SSH-Host an verschiedenen Stellen im Programm jederzeit weiterverwenden kann.


Mit dem beschriebenen Programmcode erfolgt eine automatisierte Anmeldung mittels Benutzerkennung und Passwort, für die Authentifizierung über Zertifikate muss man etwas anders vorgehen.


In diesem Artikel zeige ich den Login auf einem Cisco IOS-Device.


Suchbegriffe: automatisierung