2010-03-05 33 views
14

Tôi đang cố gắng sử dụng mô-đun con xử lý con trăn để đăng nhập vào một trang FTP bảo mật và sau đó lấy một tệp. Tuy nhiên tôi tiếp tục bị treo trên chỉ cần cố gắng để gửi mật khẩu khi nó được yêu cầu. Tôi cho đến nay có mã sau:Sử dụng tiến trình con để gửi mật khẩu

from subprocess import Popen, PIPE 

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

Điều này vẫn dừng lại ở dấu nhắc mật khẩu. Nếu tôi nhập mật khẩu theo cách thủ công, nó sẽ đi tới trang FTP và sau đó nhập mật khẩu vào dòng lệnh. Tôi đã nhìn thấy mọi người đề nghị sử dụng pexpect nhưng dài câu chuyện ngắn tôi cần một giải pháp thư viện tiêu chuẩn. Có anyway với subprocess và/hoặc bất kỳ stdlib khác? Tôi đang quên gì ở trên?

+0

Bản sao của http://stackoverflow.com/questions/2356391/why-does-supplying-stdin-to-subprocess-popen-cause-what-is-written-to-stdout-to-c ? –

Trả lời

8

Có lẽ bạn nên sử dụng thư viện giống như expect để thay thế?

Ví dụ Pexpect (example). Có những thư viện python tương tự khác.

+0

+1 cho Pexpect. Đó là giải pháp phù hợp để tương tác với các quy trình giao diện điều khiển. –

+0

Có mô đun kỳ vọng stdlib không? Tôi cần phải dính vào stdlib. –

+0

Pexpect không phải là stdlib. Nhưng nó là python tinh khiết, vì vậy chỉ cần đặt tập tin pexpect.py ở đâu đó trên đường dẫn python của bạn. Ví dụ bên cạnh tệp tập lệnh của bạn. – codeape

6

Hãy thử

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

Điều đó sẽ làm việc.

Những gì bạn mô tả các âm thanh như stdin=None trong đó quá trình con kế thừa chuẩn của cha mẹ (chương trình Python).

+0

Hm ... điều này dường như vẫn đang dừng lại và yêu cầu mật khẩu. –

+1

Bạn đọc stdout của quy trình trong chuỗi thứ hai, phải không? Nếu không, những điều kỳ lạ có thể xảy ra. Ngoài ra, kiểm tra xem sftp cho phép một mật khẩu từ stdin bằng cách sử dụng 'echo mật khẩu | sftp ... 'từ dòng lệnh. Có thể là sftp luôn mở một shell. –

+2

mật khẩu không được viết thông qua đầu vào tiêu chuẩn theo như tôi biết. Mã này có được kiểm tra không? –

1

Tôi khuyên bạn nên loại bỏ phương pháp tiếp cận quy trình con và sử dụng gói paramiko để truy cập sftp.

1

Sử dụng Paramiko cho SFTP. Đối với bất cứ điều gì khác, hoạt động này:

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

được kiểm tra và không hoạt động – weefwefwqg3

2
from subprocess import Popen, PIPE 

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

Hãy thử với input = ‘mật khẩu’ trong giao tiếp, mà làm việc cho tôi.

Các vấn đề liên quan