O comando que você executa o shell é algo assim, com 1234
sendo um valor de var
(isso é passado como argumento para sh -c
):
ssh $servername /usr/local/bin/pstat $1|awk 'FNR==5 {print $9}' 1234
Lá, $1
é expandido no primeiro argumento do shell, mas não tem nenhum, então isso desaparece. 1234
é um argumento para awk
, que toma como nome de um arquivo de entrada, tenta abri-lo e falha.
Suponho que você queira o valor de var
como um argumento para pstat
. Você tem duas opções: colocar o número onde você tem $1
agora, com %s
como você fez acima; ou use $1
e passe var
como um argumento para o shell que Popen
executa.
Com %s
:
cmd=(''' ssh "$servername" /usr/local/bin/pstat '%s' | awk 'FNR==5 {print $9}' '''
% int(var))
p=subprocess.Popen(cmd, shell=True, ... )
Observe que isso baixa o valor da variável no meio do comando shell, então você precisa saber que ele não contém nada perigoso. Com aspas simples ao redor, apenas aspas simples causarão problemas. Como você só tem um número, isso deve ser seguro.
Com $1
:
cmd=(''' ssh "$servername" /usr/local/bin/pstat "$1" | awk 'FNR==5 {print $9}' ''')
p=subprocess.Popen([cmd, "sh", str(var)], shell=True, ... )
Aqui, passamos uma matriz como o primeiro argumento de Popen
, o que faz com que use o primeiro elemento da matriz como a linha de comando e o restante como argumentos para o shell. (por exemplo, ele executa sh
com os argumentos -c
, cmdline...
, sh
e 1234
. A string sh
vai para o $0
do shell.)
Isso é mais seguro que o anterior, em que o valor da variável nunca é misturado com o código que o shell executa (mas note que você precisa das aspas duplas em torno de "$1"
pelos motivos usuais).
Observe que você precisa ter servername
definido no ambiente para que essa variável seja expandida pelo shell Popen
runs.