2016-04-18 4 views
0

からPythonスクリプトは、次のコマンドを実行します:は、シェルコマンドの結果を管理するPythonスクリプト

return_code = call("iw wlan0 scan | sed -e 's#(on wlan# (on wlan#g' | awk -f scan.awk > scan.txt", shell=True) 

私はコマンドがうまくいけ場合にのみ、私のコードで進行します。しかし、コマンドが失敗した場合でもreturn_codeは常に "0"です。

より正確に故障がどのように私はこのメッセージを「捕獲」し、プログラムが継続することを避けることができ

command failed: Device or resource busy (-16) 

で表されますか? 「コマンドが失敗しました」というエラーが表示された場合は、シェルコマンドを繰り返し実行しますが、その方法はわかりません。

import subprocess 

cmd = "iw wlan0 scan | sed -e 's#(on wlan# (on wlan#g' | awk -f scan.awk > scan.txt" 
cmd_err = "command failed: Device or resource busy" 
output = cmd_err 

while cmd_err in output: 
    # maybe add a delay and a "max no. of retries" counter 
    output = subprocess.check_output(cmd, shell=True) 

# success - rest of your code 

私はそれを使用して、特定のセキュリティリスク(コード/コマンド・インジェクション)が付属していることを言及せずshell=Trueを書き込むことはできません。

+0

https://docs.python.org/2/library/subprocess.html #subprocess.check_output – BlackBear

+0

Check_call()とcheck_output()は私の問題を解決しません。コマンド自体の実行は常に成功し、戻りコードは「0」です。問題は、 "iw wlan0 scan"がコマンドの失敗メッセージを返すことができるということです。スクリプトに問題があると思われます。なぜなら、うまくいきませんでした。 –

+0

'check_output 'を使用すると、エラーメッセージにエラーメッセージが含まれているかどうかを確認できます。 – BlackBear

答えて

0

あなたはこのような何かを行うことができます。信頼できない入力に使用することはできません。使用しない場合は使用しないでください。

0

これは、コマンドのどの部分に結果が必要かによって異なります。あなたが得なければならないものは、 "awk -f scan.awk> scan.txt"のリターンコードです。

「iw wlan0 scan」の結果にsed/awkコンポーネントを続行するかどうかを判断するために、2つのセクションに分けてスキャンを実行し、結果を確認して続行するリターンコードが0の場合、出力は "command failed:Device or resource busy"ではありません。

私はそれを行う方法の構文的およびプログラム的に完璧な例を提供してみたいが、私はあまりにも学んでいる:)

関連する問題