Python変数をシェルスクリプトに渡す

Python変数をシェルスクリプトに渡す

これは私のスクリプトです。

cmd=(''' ssh $servername /usr/local/bin/pstat $1|awk 'FNR==5 {print $9}' %s ''' %int(var))  
p=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)  
out, err=p.communicate()  
print "err", err 

エラーは次のとおりです。

err awk: cmd. line:1: fatal: cannot open file (No such file or directory)

私が書くのが苦手だと思いますcmd。私は何を見逃していますか?

ベストアンサー1

シェルに実行するように指示するコマンドは次のとおりです(この1234値はvarに引数として渡されますsh -c)。

ssh $servername /usr/local/bin/pstat $1|awk 'FNR==5 {print $9}' 1234

そこは$1シェルの最初の引数に拡張されましたが、引数なしで消えました。1234はパラメータであり、awk入力ファイルの名前として開こうとしますが失敗します。

var私はあなたがパラメータとしてからの値を望んでいると仮定しますpstat。 2つのオプションがあります。上記の$1ように、現在存在する場所に番号を入力するか、を使用して実行中のシェルに引数として渡します。%s$1varPopen

そして%s

cmd=(''' ssh "$servername" /usr/local/bin/pstat '%s' | awk 'FNR==5 {print $9}' '''
      % int(var))  
p=subprocess.Popen(cmd, shell=True,  ... )

これはシェルコマンドの中間にある変数の値を削除するので、実際には危険な内容が含まれていないことに注意してください。一重引用符が使用されるため、一重引用符のみが問題を引き起こします。番号は1つだけなので安全です。

そして$1

cmd=(''' ssh "$servername" /usr/local/bin/pstat "$1" | awk 'FNR==5 {print $9}' ''')  
p=subprocess.Popen([cmd, "sh", str(var)], shell=True,  ... )

ここでは、配列を最初の引数として渡し、最初の配列要素をPopenコマンドラインとして使用し、残りの要素をシェルの引数として使用します。 (つまり、sh引数と文字列で-cシェルcmdline...に移動してsh実行されます1234。)sh$0

これは、変数の値がシェルで実行されているコードと決して混在しないため、以前の値よりも安全です(ただし、"$1"一般的な理由で二重引用符が必要であることに注意してください)。

シェルを介して拡張を実行するservernameには、環境でこの変数を設定する必要があります。Popen

おすすめ記事