Bei Verwendung von os.system () müssen häufig Dateinamen und andere Argumente maskiert werden, die als Parameter an Befehle übergeben werden. Wie kann ich das machen? Am besten etwas, das auf mehreren Betriebssystemen / Shells funktioniert, aber insbesondere für Bash.
Ich mache derzeit Folgendes, bin mir aber sicher, dass es dafür eine Bibliotheksfunktion oder zumindest eine elegantere / robustere / effizientere Option geben muss:
def sh_escape(s):
return s.replace("(","\\(").replace(")","\\)").replace(" ","\\ ")
os.system("cat %s | grep something | sort > %s"
% (sh_escape(in_filename),
sh_escape(out_filename)))
Bearbeiten: Ich habe die einfache Antwort der Verwendung von Anführungszeichen akzeptiert, weiß nicht, warum ich nicht daran gedacht habe; Ich denke, weil ich von Windows kam, wo 'und "sich ein wenig anders verhalten.
In Bezug auf die Sicherheit verstehe ich das Problem, aber in diesem Fall bin ich an einer schnellen und einfachen Lösung interessiert, die os.system () bietet, und die Quelle der Zeichenfolgen wird entweder nicht vom Benutzer generiert oder zumindest von a eingegeben vertrauenswürdiger Benutzer (ich).
sh_escape
Funktion würde aus den ;
Leerzeichen und entkommen und das Sicherheitsproblem beseitigen, indem einfach eine Datei mit dem Namen "so etwas" erstellt wird foo.txt\;\ rm\ -rf\ /
.