Ich habe einige seltsame Verhaltensunterschiede zwischen Pythons subprocess.call() und os.system(), die mit Setgid verwandt zu sein scheinen. Der Unterschied ist, dass Perls Taint-Checks aufgerufen werden, wenn subprocess.call() verwendet wird, was zu Problemen führt, da ich nicht alle Perl-Skripte modifizieren kann, die einen unkenntlich gemachten Code benötigen.Python 2.6 subprocess.call() scheint das Setgid-Verhalten aufzurufen, das die Taint-Prüfungen von Perl auslöst. Wie kann ich auflösen?
Beispiel "process.py"
#!/usr/bin/python
import os, subprocess
print "Python calling os.system"
os.system('perl subprocess.pl true')
print "Python done calling os.system"
print "Python calling subprocess.call"
subprocess.call(['perl', 'subprocess.pl', 'true'])
print "Python done calling subprocess.call"
"subprocess.pl"
#!/usr/bin/perl
print "perl subprocess\n";
`$ARGV[0]`;
print "perl subprocess done\n";
Der Ausgang - beide Läufe von subprocess.pl sollten gleich sein, aber der einen Lauf mit Subprozess .call() bekommt einen Makel Fehler:
mybox> process.py
Python calling os.system
perl subprocess
perl subprocess done
Python done calling os.system
Python calling subprocess.call
perl subprocess
Insecure dependency in `` while running setgid at subprocess.pl line 4.
Python done calling subprocess.call
mybox>
Bei der Verwendung von os.system() funktioniert, würde ich wirklich lieber subprocess.check_c verwenden werden all(), da es mehr abwärtskompatibel ist und gute Kontrollmöglichkeiten bietet.
Irgendwelche Vorschläge oder Unterlagen, die erklären könnten, warum diese zwei verschieden sind? Ist es möglich, dass dies eine seltsame Einstellung in meiner lokalen Unix-Umgebung ist, die diese Verhaltensweisen aufruft?
Interessant, dass Sie es so reproduzieren konnten. Ich habe gerade festgestellt, dass das Problem verschwindet, wenn ich Python auf die Version 2.5.2 umstelle, die ich installiert habe.Ich habe meine Perl-Binärdatei überprüft und es ist nicht das Setgid-Bit gesetzt. Es könnte etwas falsch mit der Python-Installation sein. –
Ah! Das Setgid-Bit ist in der 2.6.1 Python-Binärdatei festgelegt! Unerwartet, aber hoffentlich kann ich den Systemadministrator dazu bringen, das Problem zu beheben und das Problem verschwinden zu lassen. –
HA - Ich habe gerade diese Kombination ausprobiert, aber Sie haben mich dazu geschlagen;) – JimB