これは私のスクリプトです。
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
$1
var
Popen
そして%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