Я запускаю следующий код на Python:
import subprocess
host = "ftp://localhost:2121"
p = subprocess.Popen(
['wget', '-P', '/tmp/output', '-N', '-r', '-l', 'inf', '--ask-password', '--user', 'anonymous', host],
stdin=subprocess.PIPE)
p.communicate("password\n")
if p.returncode != 0:
raise RuntimeError('wget command failed with return code: %d' % p.returncode)
Похоже, что password не отправляется в wget, поскольку скрипт зависает, показывая:
Password for user ‘anonymous’:
Нажатие Enter приводит к завершению работы wget с кодом ошибки '1'.
Нажатие клавиш и затем нажатие Enter заставляет wget начать загрузку, как и ожидалось.
FTP-сервер является локальным и имеет анонимный доступ. Версия Python - 2.7.8






Попробуйте добавить это перед p.communicate:
p.stdin.write('password\n')
p.stdin.flush()
stdout, stderr = p.communicate()
Я тестировал и действительно вы правы ... это интересно. Можете ли вы просто передать пароль в качестве аргумента или есть причина, по которой вы делаете это таким образом?
Похоже, что wget считывает пароль с tty, а не с stdin. Это не то же самое!
Команда sudo позволяет вам переключиться на стандартный ввод
Certain programs read directly from /dev/tty, not stdin. "passwd" for example. So it's difficult to script them. Expect is one way around that - it can trick the program by providing input to them:
Один из способов добиться чтения пароля из stdin - создать URL-адрес, содержащий пользователя & pass:
ftp://user:[email protected]/link.txt
И используя переключатель -l -, чтобы передать ссылку в wget через stdin. Предлагается здесь
Не повезло :( wget не будет делать что-то вроде запуска другого процесса для запроса пароля, не так ли?