2010-03-05 11 views
14

파이썬 하위 프로세스 모듈을 사용하여 보안 FTP 사이트에 로그인 한 다음 파일을 가져 오려고합니다. 그러나 나는 요청이있을 때 암호를 보내려고 할 때 끊임없이 노력하고있다.subprocess를 사용하여 암호 보내기

from subprocess import Popen, PIPE 

proc = Popen(['sftp','[email protected]', 'stop'], stdin=PIPE) 
proc.communicate('password') 

이 여전히 암호 프롬프트에서 중지 : 지금까지 다음과 같은 코드가 있습니다. 수동으로 암호를 입력하면 ftp 사이트로 이동 한 다음 명령 줄에 암호를 입력합니다. 사람들이 pexpect를 사용하도록 제안했지만 짧은 표준화 된 라이브러리 솔루션이 필요하다고 생각합니다. 어쨌든 하위 프로세스 및/또는 다른 stdlib가 있습니까? 위에서 잊어 버린 것은 무엇입니까?

+0

중복 된 http://stackoverflow.com/questions/2356391/why-does-supplying-stdin-to-subprocess-popen-cause-what-is-written-to-stdout-to-c ? –

답변

8

아마도 expect과 같은 라이브러리를 사용해야할까요?

예 : Pexpect (example). 비슷한 파이썬 라이브러리도 있습니다.

+0

+1 Pexpect입니다. 이것이 바로 콘솔 프로세스와 상호 작용하는 올바른 솔루션입니다. –

+0

stdlib expect 모듈이 있습니까? 나는 stdlib에 충실해야한다. –

+0

Pexpect가 stdlib가 아닙니다. 하지만 그것은 순수한 파이썬이므로 pexpect.py 파일을 파이썬 경로의 어딘가에 넣으십시오. 예를 들어 스크립트 파일 옆에 있습니다. – codeape

6

작동합니다

proc.stdin.write('yourPassword\n') 
proc.stdin.flush() 

을보십시오.

설명하는 내용은 하위 프로세스가 부모 (귀하의 Python 프로그램)의 표준을 상속하는 stdin=None처럼 들립니다.

+0

흠 ...이 여전히 중지하고 암호를 묻는 것 같습니다. –

+1

두 번째 스레드에서 프로세스의 표준 출력을 읽지 않습니까? 그렇지 않으면 이상한 일이 발생할 수 있습니다. 또한, sftp가'echo password | sftp ...'명령 줄에서. sftp가 항상 쉘을 열 가능성이 있습니다. –

+2

암호는 내가 아는 한 표준 입력을 통해 작성되지 않습니다. 이 코드가 테스트 되었습니까? –

1

하위 프로세스 접근법을 폐기하고 samp 액세스를 위해 paramiko 패키지를 사용하는 것이 좋습니다.

1

SFTP는 Paramiko을 사용하십시오. 무엇을 위해,이 작품 :

import subprocess 

args = ['command-that-requires-password', '-user', 'me'] 

proc = subprocess.Popen(args, 
         stdin=subprocess.PIPE, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 

proc.stdin.write('mypassword\n') 
proc.stdin.flush() 

stdout, stderr = proc.communicate() 
print stdout 
print stderr 
+0

이 테스트되었고 작동하지 않음 – weefwefwqg3

2
from subprocess import Popen, PIPE 

proc = Popen(['sftp','[email protected]', 'stop'], stdin=PIPE) 
proc.communicate(input='password') 

나를 위해 일한 입력 = '비밀번호'에서 통신과보십시오.