2017-09-12 7 views
0

Ich versuche eine Handvoll lokaler Bash-Skripte aufzurufen, die ich für Health-Check-Anwendungen auf Remote-Servern geschrieben habe.Einlesen von ssh aus einer Datei mit subprocess.Popen()

ssh -q <servername> "bash -s" -- < ./path/to/local/script.bash 

Das obige funktioniert einwandfrei in der Befehlszeile. Allerdings, wenn ich den Anruf in Python wickeln, ich erhalte immer Fehler besagt:

bash: /path/to/file/script.bash: No such file or directory 

Was meinen Python, ich bin mit dem Subprozess-Modul. Python:

bashcmd="ssh -q %s \"bash -s\" -- < ./%s" % (<server>,<bashfilepath>) 
process=subprocess.Popen(bashcmd.split, stdout=subprocess.PIPE) 
output, error = process.communicate() 

Jede mögliche Hilfe würde geschätzt!

+0

Warum haben Sie ein explizites '. /' Vor den 'bashfilepath' Wert gesetzt? Beginnen Sie mit dem Entfernen und stellen Sie sicher, dass Ihr 'bashfilepath'-Wert korrekt ist. – roaima

+0

@roima In dieser Frage geht es wirklich darum, wie man 'stdin' mit Python' subprocess.Popen() 'setzt. Die Frage besagt, dass das Beispiel in der Shell funktioniert. Die Änderungen in meiner Antwort auf das Python-Programm haben das Problem gelöst. Das Problem hat die Python-API nicht korrekt verwendet. Hilfeseite zu [off-topic] (https://unix.stackexchange.com/help/on-topic) sagt zu Programmierfragen außer Shell-Scripting: "* Wenn Ihre Frage eine Programmierfrage ist, die Programmierkenntnisse in anderen Sprachen erfordert als Unix-Shell-Skriptsprachen, fragen Sie auf Stack Overflow. * " – sebasth

Antwort

2

Umleitung in Ihrem ersten Beispiel erfolgt durch Shell. Standardeingabe für ssh gelesen aus der Datei ./path/to/local/script.bash, die ssh an den Prozess auf Remote-Maschine übergibt.

Sie können keine Shellumleitungen verwenden, da Sie keinen Befehl von der Shell ausführen. Stattdessen können Sie stdin und stdout Argumente für Popen() verwenden, um die Standardeingabe und -ausgabe für Ihren Prozess festzulegen. Sie müssen die Datei öffnen und dann den Handle an stdin übergeben. Dies wird erklärt in: Using files as stdin and stdout for subprocess.

In Python Beispiel, übergeben Sie ssh -q <server> "bash -s" -- < ./<filepath> als erstes Argument zu subprocess.Popen(), das eine Liste von Argumenten ausnimmt, oder eine einzelne Zeichenfolge: der Pfad zum ausführbaren. Sie erhalten No such file or directory Fehler, da Ihr Zeichenfolgenargument kein Pfad zu einer ausführbaren Datei ist. Das korrekte Format, das der Standardkonvention folgt, wäre subprocess.Popen(["/path/to/executable", "arg1", "arg2", ...]).

All dies zusammen, Ihr Beispiel etwas aussehen soll:

with open("./path/to/local/script.bash") as process_stdin: 
    p = subprocess.Popen(["/usr/bin/ssh", "-q", server, "--", "bash", "-s"], 
         stdin=process_stdin, stdout=subprocess.PIPE) 
    out, err = p.communicate() 

Das alles in Python-Dokumentation für subprocess module erklärt.

+0

Also was genau würde ich als Parameter übergeben? – bngrngrufio

+0

danke !! Lief wie am Schnürchen. – bngrngrufio

+0

Wie würde ich Argumente mit der erwähnten ./path/to/local/script.sh übergeben? – bngrngrufio

Verwandte Themen