Software Frage Möglichkeit der Scriptsteuerung eines SSH-Client gesucht.

dr_tommi

alter Oldie
Ich muss in regelmäßigen Abständen Konfigurationsdateien von Routern abspeichern.
Die Router sind über SSH mit verändertem Port unter ihrer öffentlichen IP-Adresse erreichbar, allerdings nur von bestimmten Servern/IP-Adressen.
Manuell ist das alles kein Problem, mit einem SSH-Client verbinden, Benutzername und Passwort senden, erweiterten Modus einschalten, benötigte Dateien per TFTP an einen Server sende, abmelden.
Nun würde ich das ganze gerne automatisieren, da es sich aktuell um etwa 120 Router handelt.
Nun gibt es aber mit Plink/Putty ein Problem.
key.PNG


Solange ich den Host schon mal manuell besucht habe, klappt alles prima, da der Key im Cache gespeichert ist.
Nur leider kommen jede Woche neue Adressen hinzu.
Und da kann man nicht alle neuen IP-Adressen zuerst manuell anfahren, nur um den Key zu speichern.
Wir vertrauen diesen Adressen und der Zugriff auf diese Geräte ist eingeschränkt.

Gibt es eine Möglichkeit das auch für neue IP-Adressen zu automatisieren? Gibt es dafür einen Parameter?
Oder wäre ein anderes Tool besser dafür geeignet?
 

boao

Aktives Mitglied
Hi,
wenn Du unter Windows unterwegs bist, gibt es Kitty mit der Kommandozeilen-Option -auto-story-sshkey.

Das sollte helfen.
Gruß, boao
 

mailfire

Bekanntes Mitglied
Oder auch mit einem Python Script:


/ Edit:
hier auch ausführlicher dokumentiert:

 

dr_tommi

alter Oldie
Erstmal vielen Dank für die Denkanstösse.
Die plink.exe, klink.exe und Powershell sind aktuell im Testeinsatz.

Nimm nicht PuTTY sondern klassisches SSH dir Windows. Das lässt sich prima automatisieren
Dazu habe ich leider keine ausreichende Doku gefunden, wäre natürlich am einfachsten mit Bordmitteln ohne zusätzliche Software.


Das mit dem Server-Key habe ich jetzt so gelöst, dass ich zuerst eine Verbindung mit absichtlich falschen Credentials aufbaue und aus der Rückmeldung den Key per Regex extrahiere und speichere.
Im zweiten Aufruf mit den richtigen Credentials wird der Key dann mit angegeben.
Das klappt soweit ganz gut.
Leider macht der SSH-Server auf den Geräten bei der Ausführung der Kommandos noch nicht ganz das was ich will.
Das mit Python schaue ich mir auch mal an. Da könnte man mit dem Compiler auch den Code "schützen" bzw. zumindest das Lesen erschweren.
 

DrSnuggles

Bekanntes Mitglied
Du solltest niemals ungeprüft ein Passwort an einen SSH- Server senden, d.h. du musst vorher den Fingerprint OOB geprüft haben.
Sonst hast du ganz schnell Mal ein Passwort an einen fremden Server verloren
 

dr_tommi

alter Oldie
Du solltest niemals ungeprüft ein Passwort an einen SSH- Server senden, d.h. du musst vorher den Fingerprint OOB geprüft haben.
Sonst hast du ganz schnell Mal ein Passwort an einen fremden Server verloren
Da hast du natürlich im Prinzip Recht, aber in diesem Fall geht es um Geräte, auf die eigentlich kein Fremdzugriff besteht.
Nur festgelegte Ports (keine Standardports) und Protokolle (https und ssh) und das auch nur von fest definierten IP-Adressen sowie 12-stellige Benutzerkennungen und Passwörter aus dem Generator.
Und es handelt sich hier auch nicht um Server im eigentlichen Sinne.
Ziel der Aktion ist die Sicherung der jeweiligen Konfigurationen auf einem externen Server.
 

dr_tommi

alter Oldie
ich muss das mal wieder hochholen.
Ich habe das jetzt soweit geschafft, dass per Kitty bzw. Klink die Verbindung und die Anmeldung in der Schleife klappt.
Die Daten für die Verbindung kommen aus einer CSV-Datei.
Leider werden die weiteren Befehle nicht ausgeführt.
Egal ob ich nur einen Befehl gleich mit in der Kommandozeile angebe oder mehrere Befehle in eine Datei schreibe und diese dann mit übergebe.
Hat jemand vielleicht noch eine Idee dafür?
 

mailfire

Bekanntes Mitglied
Ich hab es mit Python Scripten gemacht, alles andere lief nicht dauerhaft und war zu viel Betreuungsaufwand.

Edit:
Hier sind verschiedene Möglichgkeiten erwähnt auch mit Paramiko.
 

dr_tommi

alter Oldie
Ich hab es mit Python Scripten gemacht, alles andere lief nicht dauerhaft und war zu viel Betreuungsaufwand.

Edit:
Hier sind verschiedene Möglichgkeiten erwähnt auch mit Paramiko.
Python wäre nicht das Problem.
irgendwie haben die Lösungen immer nur ein Problem mit neuen Keys.
Wie würde das mit Python gehen? Da habe ich auf die Schnelle nichts gefunden.

Putty/Kitty resp. Plink/Klink kann die wenigstens noch automatisch annehmen und speichern.
Mir geht es ja nur darum in regelmäßigen Abständen die Konfiguration und einige Systeminformationen irgendwohin zu sichern.
Und da geht leider nur SSH, mit welchem Tool auch immer.
Und es ist kein "richtiges" Linuxsystem sondern es sind Geräte mit einer CentOS-Basis.
Allerdings kann der Zugriff nur von Windows aus erfolgen weil es eine Zugriffsbeschränkung auf bestimmte IP-Adressen gibt und die Sprungserver alle Windowsserver sind.
Und mehr als SSH und HTTPS sind als Zugriff nicht vorgesehen.
Leider kommen mindestens wöchentlich neue Geräte dazu, die dann ebenfalls mit gesichert werden müssten.

Manuell funktioniert alles super, egal ob mit Putty, Kitty, Mobaxterm oder welchem Tool auch immer.
Aber sobald das automatisiert werden soll, ist Ende.

Ich hätte zwar noch die Möglichkeit mit Winautomation die Weboberfläche zur Sicherung zu missbrauchen, aber das sollte der letzte Weg sein. Zumindest mit einer älteren Version habe ich da einige Erfahrungen sammeln dürfen.
 

DrSnuggles

Bekanntes Mitglied
Solange du nicht deine Scripte postest und die dabei entstehenden Fehlermeldungen, etc. kann man dir da nicht helfen.

Du kannst mit keyscan die keys regelmäßig einsammeln
 

dr_tommi

alter Oldie
Solange du nicht deine Scripte postest und die dabei entstehenden Fehlermeldungen, etc. kann man dir da nicht helfen.
Das ist ja genau das Problem.
Es gibt keine Fehlermeldungen, zumindest sehe ich keine. Es passiert einfach nichts nach der Anmeldung.
Ich habe das Log mal mit angehängt.,
An den Stellen wo die drei Punkte also "..." sind, waren Hexdaten, die ich entfernt habe.
Man sieht den Verbindungsaufbau, die Anmeldung und dass die Kommandos angeblich ausgeführt werden, zumindest übermittelt.
Der Aufruf sieht aktuell so aus:
Code:
klink -ssh -auto-store-sshkey -P 22 192.168.2.10 -l Admin -pw Admin -m Test_VE.txt   -sshlog log.txt
Gemacht werden sollte in diesem Fall nach der Anmeldung eigentlich nur das was in der Test_VE.txt steht:
Code:
Enable
Admin
schow system version
Also in den privilegierten Modus umschalten, das Passwort dafür übermitteln (in diesem Fall Admin) und dann einige Informationen anzeigen.
Wenn das dann klappt, soll natürlich dann etwas mehr passieren wie Sicherung der Konfigurationen, Zertifikate usw. auf einen externen Server.

Bevor jetzt jemand ankommt und was von Sicherheit hervorholt.
Hier geht es um eine virtuelle Edition mit Standardanmeldedaten bei mir in meinem Netz.
Die echten Daten kommen aus einer Datenbank und da sind natürlich Benutzername, Benutzerpassword und auch das Enable-Passwort mindestens 12-stellig und aus einem Generator. Und der Zugriff auf die Geräte ist stark eingeschränkt auf aktuell 10 IP-Adressen. Mögliche Hackerangriffe sind sehr unwahrscheinlich.
 

Anhänge

  • log.txt
    3,1 KB · Aufrufe: 11
Zuletzt bearbeitet:

DrSnuggles

Bekanntes Mitglied
Bug in Kitty, nimm SSH

Welche Version klink nimmst du?
Die aktuelle Version hat nur einen Parameter log, keinen Namens sshlog
 

dr_tommi

alter Oldie
Bug in Kitty, nimm SSH

Welche Version klink nimmst du?
Soll angeblich die v0.74.4.13 sein, lst die letzte die ich gefunden habe.
Mit -V kommt aber keine Versionsnummer und es meldet sich plötzlich als Plink.
Ich bin konfus.
Die aktuelle Version hat nur einen Parameter log, keinen Namens sshlog
kitty kennt nur -log, klink kennt -sshlog.


Wie wäre denn der Aufruf mit ssh um nach der Anmeldung eine gewisse Anzahl von Befehlen zu übermitteln?
 

DrSnuggles

Bekanntes Mitglied
 

dr_tommi

alter Oldie
Funktioniert nicht da auf den Geräten keine bash ist und übrigens auch keine andere Shell, die direkt aufrufbar ist.
Wir reden hier nicht von "normalen" Servern auf denen ein Linuxserver installiert ist sondern von Geräten wie Router, Switche, SBC und anderen Geräten deren Konfigurationen, Zertifikate usw. gesichert werden sollen.
Ich muss also direkt die Befehle übergeben können.
 

dr_tommi

alter Oldie
"bash -s" heißt einfach nur lies von Standardinput.
Du brauchst keine "bash".
Der Trick ist "<"
Ich hatte doch schon geschrieben dass das nicht funktioniert. Ich habe das natürlich getestet, bin ja für alles offen.
"<" ist mir nicht unbekannt.
Aber zum einen fragt das Programm nach einem Passwort, was zwar im Test noch möglich ist, bei der Automatisierung aber eben nicht mehr und zum anderen werden die Befehle nicht abgearbeitet sondern gleich abgebrochen.
Und sobald ein Befehl, selbst ein gültiger, in den Hochkommata steht, passiert nichts mehr bis Enter gedrückt wird und dann wird die Verbindung unterbrochen.
Authentifizierung per Key ist auch nicht möglich, da das die Geräte gar nicht können.

Ich suche also immer noch einen Weg .
Im Moment teste ich gerade Netmiko, eine Python-Bibliothek, die verschiedene Geräte unterstützt und spezielle Treiber für verschiedene Geräte unterschiedlicher Art mitbringt.
 

DrSnuggles

Bekanntes Mitglied
Code:
C:\>ssh pi@192.168.3.56 whoami
pi@192.168.3.56's password:
pi

Entweder jedes Commando einzeln oder du suchst dir die Shell (muss ja keine Bash sein) und gibst dann als Commando sowas
wie "cat | shell" < commands.txt
 
Oben Unten