python子进程和wget询问密码

时间:2018-11-19 06:32:52

标签: python subprocess

我正在运行以下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

2 个答案:

答案 0 :(得分:0)

尝试在p.communicate之前添加:

p.stdin.write('password\n')
p.stdin.flush()
stdout, stderr = p.communicate()

答案 1 :(得分:0)

似乎wget从tty而不是stdin读取密码。这些不一样!

sudo命令允许您switch to stdin

also

  

某些程序直接从/ dev / tty中读取,而不是从stdin中读取。例如“ passwd”。因此很难编写脚本。 Expect是解决问题的一种方法-它可以通过向他们提供输入来欺骗程序:

一种从stdin读取密码的方法是构造一个包含用户名&pass的URL:

ftp://user:password@ftp.server.com/link.txt

然后使用-l -开关通过stdin将链接传递到wget中。建议here