Seite 1 von 1

Verzeichnis auf Server Listen Rückgabewert subprocess

Verfasst: Montag 30. März 2015, 14:42
von martinjo
Hallo,
ich komme bei einer Aufgabe nicht weiter. Ich möchte eigentlich nur das Verzeichnis auf einem Server listen und diese Liste lokal weiterverarbeiten.

Das wolte ich folgendermaßen machen

Code: Alles auswählen

bilder_auf_server = subprocess.check_call("ssh user@server "ls directory", shell=True)
Das funktioniert auch jedoch werden dabei alle Bilder gelistet was ich vermeiden möchte. Wenn ich shell=False setze funkitoniert der Befehl nicht. Kann mir jemand verraten wie das funkitoniert, dass die Dateien nicht alle beim ausführen gelistet werden?

Danke

Re: Verzeichnis auf Server Listen Rückgabewert subprocess

Verfasst: Montag 30. März 2015, 14:46
von BlackJack
@martinjo: `check_call()` ist die falsche Funktion dafür, die gibt auch gar nichts zurück. Du suchst `check_output()` und wenn Du keine unnötige Shell dazwischen haben möchtest, dann musst Du die Argumente als Liste übergeben.

Re: Verzeichnis auf Server Listen Rückgabewert subprocess

Verfasst: Montag 30. März 2015, 14:55
von martinjo
Danke, check_call hatte ich eben versehentlich hingeschrieben, hier mal ein Beispiel aus dem Skript mit dem Versuch, die Argumente als Liste zu übergeben, habe jedoch nicht ganz verstanden wie das gemeint war.

Code: Alles auswählen

pic_list_server = subprocess.check_output( [ 'ssh %s@%s "ls %s"' %(user, server, picdir_server ) ] )
OSError: [Errno 2] No such file or directory

Hier wir alles gelistet:

Code: Alles auswählen

 pic_list_server = subprocess.check_output( [ 'ssh %s@%s "ls %s"' %(user, server, picdir_server ) ], shell=True )

Re: Verzeichnis auf Server Listen Rückgabewert subprocess

Verfasst: Montag 30. März 2015, 15:11
von Sirius3
@martinjo: jedes Argument ist ein Element der Liste. Da Du nur ein Element hast und der erste als Programmname verwendet wird, findet er das Programm natürlich nicht.

Code: Alles auswählen

pic_list_server = subprocess.check_output(['ssh', '%s@%s' % (user, server), 'ls', picdir_server]
Deine eigentliche Frage habe ich aber noch nicht verstanden. Wenn Du nur bestimme Dateien haben willst, mußt Du halt den ls-Befehl entsprechend anpassen.

Re: Verzeichnis auf Server Listen Rückgabewert subprocess

Verfasst: Montag 30. März 2015, 15:20
von martinjo
Vielen Dank! Warum funktioniert das eigentlich nur wenn ich es als Liste übergebe?

Hier der Einsatzzweck:

Code: Alles auswählen

def check_server_pics(pic_list):
    pic_list_server = subprocess.check_output( [ 'ssh',  '%s@%s' %(user, server),  'ls' , picdir_server ] )
    for i in pic_list:
        if i in pic_list_server:
            print i, "found on server"
        else:
            print i, "NOT on server"
check_server_pics(pic_list)
hatte sogar schon eine andere Methode erarbeitet aber irgenwie ist mir die erste lieber:

Code: Alles auswählen

def check_server_pics_ssh(pic_list):
    s = ssh.Connection(host = user, username = server)
    pic_list_server = s.execute(ls_picdir_server)
    pic_list_server = [p.replace('\n', '') for p in pic_list_server]
    for i in pic_list:
        if i in pic_list_server:
            print i, "found on server"
        else:
            print i, "NOT on server"
check_server_pics_ssh(pic_list)

Re: Verzeichnis auf Server Listen Rückgabewert subprocess

Verfasst: Montag 30. März 2015, 16:16
von BlackJack
@martinjo: Das funktioniert nur so weil das so von der Funktion erwartet wird. Wie sollte es denn sonst funktionieren? Das sind einzelne Argumente, also muss man die auch einzeln angeben. Nach welchen Regeln sollte denn eine einzelne Zeichenkette aufgeteilt werden? Also welche Shell-Syntax von welchem Betriebssystem sollte man da als ”allgemeingültig” ansehen? Das ist ja auch einer der Gründe warum ``shell=True`` problematisch ist: Was man da als Zeichenkette übergibt kann von verschiedenen Shells leicht (oder gar stark) anders interpretiert werden.