2009-06-02 1 views
2

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?

Antwort

2

Ich denke, Ihr Fehler ist mit Perl oder die Art, wie es mit Ihrer Umgebung interagiert. Ihr Backtick-Prozess ruft aus irgendeinem Grund setgid auf. Der einzige Weg, wie ich das replizieren kann, ist setgid auf/usr/bin/perl (-rwxr-sr-x). [EDIT] python setgid zu haben macht das auch!

[EDIT] Ich habe vergessen, dass os.system für Sie arbeitet. Ich denke, der einzige relevante Unterschied hier ist, dass mit os.system die Umgebung nicht geerbt vom Subprozess ist. Schauen Sie sich die Umgebung jedes Teilprozesses an und Sie werden Ihren Täter finden.

+0

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. –

+0

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. –

+0

HA - Ich habe gerade diese Kombination ausprobiert, aber Sie haben mich dazu geschlagen;) – JimB

0

Ist für mich nicht passieren:

$ python proc.py 
Python calling os.system 
perl subprocess 
perl subprocess done 
Python done calling os.system 
Python calling subprocess.call 
perl subprocess 
perl subprocess done 
Python done calling subprocess.call 

$ python --version 
Python 2.5.2 

$ perl --version 
This is perl, v5.8.8 built for i486-linux-gnu-thread-multi 

Was sind Ihre Versionsnummern?

Unter welcher Art von Konto laufen Sie?

EDIT:

Leider verpasst den Titel - ich habe nicht Python 2.6 überall leicht zugänglich, so dass ich dieses Problem verlassen.

EDIT:

So sieht es aus wie wir das Problem ausgearbeitet - sgid auf dem Python 2.6 binär.

Es wäre auch interessant zu sehen, ob Subprozess mit der Shell auch das Problem vermeidet.

+0

Python 2.6.1 hat das Problem, 2.5.2 scheint nicht das Problem zu haben (das sind die Versionen, die ich installiert habe). Die Perl-Version ist eine 5.8.5. Ich durchstöbere die Seiten "Was ist neu in Python?", Um etwas Ähnliches zu finden. –

+0

Auch habe ich vergessen zu erwähnen, dass dies eine SuSE 9 Linux Installation ist (mit einigen Verbesserungen und zusätzlichen Programmen von meiner freundlichen Engineering Computing Abteilung) –

Verwandte Themen