Python 변수를 쉘 스크립트에 전달

Python 변수를 쉘 스크립트에 전달

이것은 내 스크립트입니다.

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$1varPopen

그리고 %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

관련 정보