Aqui está o meu roteiro:
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
Aqui está o erro:
err awk: cmd. line:1: fatal: cannot open file (No such file or directory)
Acho que não estou escrevendo cmd
direito. o que estou perdendo?
O comando que você executa no shell é algo assim,
1234
sendo um valor devar
(isso é passado como argumento parash -c
):Lá,
$1
é expandido para o primeiro argumento do shell, mas não tem nenhum, então isso desaparece.1234
é um argumento paraawk
, que o toma como o nome de um arquivo de entrada, tenta abri-lo e falha.Estou assumindo que você quer o valor de
var
como um argumento empstat
vez disso. Você tem duas opções: ou coloque o número onde você tem$1
agora,%s
como você fez acima; ou use$1
, e passevar
como argumento para o shell quePopen
é executado.Com
%s
:Observe que isso descarta o valor da variável no meio do comando shell, então você precisa saber que não contém nada perigoso. Com aspas simples, apenas aspas simples causarão problemas. Como você só tem um número, isso deve ser seguro.
Com
$1
:Aqui, passamos um array como o primeiro argumento de
Popen
, o que faz com que ele use o primeiro elemento do array como linha de comando e o restante como argumentos para o shell. (ou seja, ele é executadosh
com os argumentos-c
,cmdline...
esh
.1234
Ash
string vai para o shell$0
.)Isso é mais seguro que o anterior, pois o valor da variável nunca é misturado com o código que o shell executa (mas observe que você precisa das aspas duplas
"$1"
pelos motivos usuais).Observe que você precisa ter
servername
definido no ambiente para que essa variável seja expandida pelasPopen
execuções do shell.