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() を使用する方がより前方互換性が高く、優れたチェック動作を備えているため、実際には subprocess.check_call() を使用したいと思います。

これら 2 つが異なる理由を説明する提案やドキュメントはありますか? これは、これらの動作を呼び出しているローカル 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。

シェルを使用したサブプロセスでも問題が回避されるかどうかを確認することも興味深いでしょう。

于 2009-06-02T17:13:47.150 に答える