2

我在 Python 的 subprocess.call() 和 os.system() 之间有一些奇怪的行为差异,这似乎与 setgid 有关。不同之处在于,在使用 subprocess.call() 时会调用 Perl 的污染检查,这会产生问题,因为我无法修改所有需要添加无污染代码的 Perl 脚本。

例如,“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"

“子进程.pl”

#!/usr/bin/perl

print "perl subprocess\n";
`$ARGV[0]`;
print "perl subprocess done\n";

输出 - subprocess.pl 的两次运行应该是相同的,但是使用 subprocess.call() 运行的一次会出现污染错误:

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>

虽然使用 os.system() 有效,但我真的更愿意使用 subprocess.check_call() 因为它更向前兼容并且具有很好的检查行为。

任何可以解释为什么这两者不同的建议或文档?这可能是我的本地 unix 环境中调用这些行为的一些奇怪设置吗?

4

2 回答 2

2

我认为您的错误在于 perl,或者它与您的环境交互的方式。您的反引号进程出于某种原因正在调用 setgid。我可以复制它的唯一方法是在/usr/bin/perl (-rwxr-sr-x) 上设置gid。[编辑] 使用 python setgid 也可以做到这一点!

[编辑] 我忘了 os.system正在为你工作。我认为这里唯一相关的区别是 os.system 环境不是由子进程继承的。查看每个子进程的环境,你可能会找到你的罪魁祸首。

于 2009-06-02T18:45:03.357 回答
0

不会发生在我身上:

$ 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

你的版本号是多少?

您在哪种帐户下运行?

编辑:

抱歉错过了标题 - 我没有易于访问的 python 2.6,所以我将不得不离开这个问题。

编辑:

所以看起来我们解决了问题——python 2.6 二进制文件上的 sgid。

看看带有 shell 的子进程是否也能避免这个问题也会很有趣。

于 2009-06-02T17:13:47.150 回答