Seite 1 von 1

ssh befehl absetzen und rückgabe bekommen

Verfasst: Dienstag 8. Februar 2011, 12:12
von The Hit-Man
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.

Re: ssh befehl absetzen und rückgabe bekommen

Verfasst: Dienstag 8. Februar 2011, 12:46
von The Hit-Man
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.

Re: ssh befehl absetzen und rückgabe bekommen

Verfasst: Dienstag 8. Februar 2011, 13:03
von 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.

Re: ssh befehl absetzen und rückgabe bekommen

Verfasst: Dienstag 8. Februar 2011, 14:24
von The Hit-Man
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?

Re: ssh befehl absetzen und rückgabe bekommen

Verfasst: Dienstag 8. Februar 2011, 15:20
von BlackJack
@The Hit-Man: Ja. Ausgabe in Zeilen aufteilen und dann Slicing. Das sind absolute Grundlagen was man mit Zeichenketten und Listen machen kann.

Re: ssh befehl absetzen und rückgabe bekommen

Verfasst: Dienstag 8. Februar 2011, 18:27
von The Hit-Man
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.

Re: ssh befehl absetzen und rückgabe bekommen

Verfasst: Donnerstag 10. Februar 2011, 10:57
von The Hit-Man
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)