이것은 내 스크립트입니다.
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
. 두 가지 옵션이 있습니다. 위에서 했던 $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
:
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