2011-10-21 3 views
2
나는 다음과 같은 코드를 실행하기 위해 노력하고있어

을에 SSH, CD, 다음 실행을 체인하지만subprocess.Popen

p = subprocess.Popen("ssh [email protected] cd /opt/msys/pe2/bin;./perlscript.pl; -a file.csv", 
       shell=True,stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

    OR: 
    p = subprocess.Popen("ssh [email protected] /opt/msys/pe2/bin/perlscript.pl; -a file.csv", 
       shell=True,stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

를 작동하지 않는 방법 첫 번째 문제는 내가 함께 체인에 보일 수있다 ssh 뒤의 명령. 두 번째는 파일을 직접 호출하면 -a arg가 해당 디렉토리에 없기 때문에 해당 파일을 찾을 수 없다는 것입니다. Popen에 cwd 매개 변수를 사용하고 싶었지만 서버에 ssh하지 않았기 때문에 실패합니다. 명령을 인용

답변

3

봅니다 SSH로 전송되는 :

subprocess.Popen('ssh [email protected] "cd /opt/msys/pe2/bin;./perlscript.pl;" -a file.csv' 

그렇지 않으면 당신이 그것을 할 로컬 쉘을 말하는 것입니다.

+0

감사합니다. scott, this worked –

2

서브 프로세스가이 사용 사례를위한 최상의 도구는 아닙니다. 모든 프로세스 모니터링 옵션 (wait()terminate (예 :)은 로컬 프로세스 (ssh 세션)에 적용되며 원격 스크립트 (예 : perl 스크립트)에서는 발생하지 않습니다.

나는 원격 스크립트 실행을 처리하기 위해 fabric을 사용합니다. 서브 프로세스을 사용하여 명령을 문자열로 연결하는 것보다 사용하는 것이 더 쉽습니다.

+0

멋지다. 내가 확인해 보겠다. –

관련 문제