Python 2.7および3.6のコマンドライブラリの代替

Python 2.7および3.6のコマンドライブラリの代替

私の元の質問は次のとおりです。https://stackoverflow.com/questions/50164551/starting-a-process-with-a-shell-possible-injection-Detected-security-issue

そこでは何の回答も受けられず、ここに交差投稿しました。

ただ代替案を知りたい
import commands
commands.getoutput()

コマンドライブラリ。
オペレーティングシステムやサブプロセスなどを使用してこれを行う方法はありますか?

答え1

commands廃止され、コールに置き換える必要がありますsubprocess。代替方法は次commands.getoutput()のとおりですsubprocess.Popen().communicate()

import subprocess
import shlex


command = shlex.split('/bin/ls -l -a -h')
process = subprocess.Popen(command, stdout=subprocess.PIPE)
stdout, stderr = process.communicate()

banditsubprocess呼び出しシェルとして使用するすべてのアイテムはまだ安全ではないため、重大度の低い問題が引き続き発生する可能性がありますが、これは避けられません。残りの警告は、コードの潜在的な不安定性を思い出させると考えてください。シェルが実際に呼び出す内容に応じて、文字列定数にハードコーディングされたコマンドか、ユーザー入力か、またはそれに応じて直接確認する必要があります。呼び出しコードの変数?とにかくクリーンアップは常に推奨されます。 Pythonではpipes基準寸法そのような理由で。

答え2

subprocesshoeflingの答えによると、「標準」の方法はありますが、外部ライブラリを使用しても問題ない場合は、より現代的な方法を使用できます。

メジャー廃止顧客次のようになります。

In [1]: import delegator

In [2]: print delegator.run('pwd').out
/home/vince

私はそれをインストールした:

pip install git+https://github.com/kennethreitz/[email protected]

答え3

import subprocess

commands = subprocess

残りのコードをそのままにすると、そのまま動作します。

関連情報