ssh befehl absetzen und rückgabe bekommen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Hier erst mal mein Codesnipe:

Code: Alles auswählen

def executeCommand (server_ip, username, password, command):
	ssh = paramiko.SSHClient()
	ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
	ssh.connect(server_ip, username=username, password=password)
	stdin, stdout, stderr = ssh.exec_command (command)
	stdin.flush()
	
	data = stdout.read ()
	return data
Ich setze per SSH einen Befehl an einen Linux Rechner ab und bekomme auch die Ausgabe wenn ich mir die Ausgabe auf den Bildschirm per print ausgeben lasse. Nun muß ich allerdings, diese Augabe mit Python noch filtern und da ist mein Problem. Es sieht so aus als würde die Ausgabe, die ich bekomme, sequenziell ist, also Zeichen für Zeichen und da fällt mir nun das filtern mit split und so weiter ziemlich schwer. Wie bekomme ich denn nun mehr oder weniger einen kompletten String zusammen, den ich weiter filtern kann? Achja, ich lege die Ausgabe mal bei.

Code: Alles auswählen

Vmid              Name                                               File                                         Guest OS         Version   Annotation
16     Ares.itbusiness.intra        [datastore1] Ares.itbusiness.intra/Ares.itbusiness.intra.vmx             winLonghorn64Guest    vmx-04              
32     3cxserver.itbusiness.intra   [datastore1] 3cxserver.itbusiness.intra/3cxserver.itbusiness.intra.vmx   winNetStandardGuest   vmx-04              
Aus der Ausgabe muß ich nun die Tabelle heraus filtern. Dieses Problem hatte ich hier im Forum schon mal beschrieben und habe auch eine Lösung bekommen, allerdings war es vorher eine Textdatei und jetzt ist die Ausgabe, Zeichen für Zeichen. Weiß jemand Rat?

EDIT: denn so, konnte ich es vorher filtern als die Ausgabe noch eine Datei war:

Code: Alles auswählen

		for line in datei:
			if line.startswith('Vmid'):
				continue # Erste Zeile...
			parts = line.split()
			vmid = parts[0]
			vmname = parts[1]
In der Datei stand nichts anderes drin, wie auch oben die Ausgabe.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

vielleicht habe ich es dann so gelöst:

Code: Alles auswählen

def getVMListe (server_ip, username, password):
	ausgabe = libscp.executeCommand (server_ip, username, password, "vim-cmd vmsvc/getallvms")
	tabelle = []
	zaehler = 0
	
	for spalten in ausgabe.split ():
		tabelle.append (ausgabe.split ()[zaehler])
		zaehler = zaehler +1
	print (tabelle)
alles hintereinander weg. Wollte erst nen Dic nehmen doch ich glaube, dazu bräuchte ich nen zwei dimensionales Dic.
BlackJack

@The Hit-Man: Was ist dass denn für ein Blödsinn. Denk über die Schleife noch mal nach und wie sich `tabelle` am Ende von ``ausgabe.split()`` unterscheidet.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ja mist, das sieht ja genau so aus. Die Schleife brauche ich ja gar nicht. Allerdings hätte ich gerne eine Tabelle, ohne diesen Überschriften. Kann ich die erste Zeile irgendwie überspringen?
BlackJack

@The Hit-Man: Ja. Ausgabe in Zeilen aufteilen und dann Slicing. Das sind absolute Grundlagen was man mit Zeichenketten und Listen machen kann.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

hmmm, die muß ich übersprungen haben. Bin ja schon längst dabei wxWidgets Fenster zu machen. Strings waren noch nie meine Sache :(. Aber da muß ich wohl durch.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Habe mir die Strings dann mal zu Herzen genommen. So, habe ich es dann jetzt gelöst:

Code: Alles auswählen

	ausgabe = libscp.executeCommand (server_ip, username, password, "vim-cmd vmsvc/getallvms")
	
	for line in ausgabe.splitlines():
		if line.split ()[3].split ("/")[0] == vm_name:
			vmid = line.split ()[0]
	return (vmid)
Antworten