2010-03-05 3 views
14

Я пытаюсь использовать модуль подпроцесса python для входа на безопасный ftp-сайт, а затем захватить файл. Тем не менее, я постоянно зависаю, просто пытаюсь отправить пароль, когда он запрашивается. У меня до сих пор есть следующий код:Использовать подпроцесс для отправки пароля

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-like?

Например, Pexpect (example). Существуют и другие аналогичные библиотеки python.

+0

+1 для Pexpect. Это правильное решение для взаимодействия с консольными процессами. –

+0

Есть ли модуль ожидания stdlib? Мне нужно придерживаться stdlib. –

+0

Pexpect не stdlib. Но это чистый питон, поэтому просто поместите файл pexpect.py где-нибудь на ваш путь к python. Например, рядом с вашим файлом сценария. – codeape

6

Попробуйте

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

Это должно работать.

Что вы описываете как stdin=None, где дочерний процесс наследует stdin родителя (ваша программа Python).

+0

Хм ... это все еще, кажется, останавливается и просит пароль. –

+1

Вы читаете stdout процесса во втором потоке, не так ли? В противном случае могут произойти странные вещи. Кроме того, проверьте, разрешает ли sftp пароль из stdin с помощью 'echo password ' sftp ... 'из командной строки. Возможно, что sftp всегда открывает оболочку. –

+2

пароли не написаны с помощью стандартного ввода, насколько я знаю. Проверяется ли этот код? –

1

Я бы рекомендовал отказаться от подпроцесса и использовать пакет paramiko для доступа sftp.

1

Использовать Paramiko для SFTP. Для чего-то еще, это работает:

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') 

Попробуйте с вводом = «пароль» в сообщаться, что работал для меня.

Смежные вопросы