Verzeichnis auf Server Listen Rückgabewert subprocess

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

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
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.
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

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 )
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

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)
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.
Antworten