passando a variável python para o shell script

1

Aqui está o meu script:

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)

Eu acredito que não estou escrevendo cmd corretamente. O que estou perdendo?

    
por Akand 10.07.2018 / 19:20

1 resposta

0

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.

    
por 10.07.2018 / 22:35

Tags