使用子进程发送密码

32 投票
14 回答
77244 浏览
提问于 2025-04-15 20:03

我正在尝试使用Python的subprocess模块登录一个安全的FTP网站,然后下载一个文件。不过,我总是卡在输入密码这一步。当系统请求输入密码时,我的代码就停住了。到目前为止,我写了以下代码:

from subprocess import Popen, PIPE

proc = Popen(['sftp','user@server', 'stop'], stdin=PIPE)
proc.communicate('password')

这段代码在输入密码的时候还是停住了。如果我手动输入密码,它就能继续执行,登录到FTP网站,然后在命令行中输入密码。我看到有人建议使用pexpect模块,但简单来说,我需要一个标准库的解决方案。请问用subprocess或者其他标准库有没有办法解决这个问题?我上面的代码有什么遗漏吗?

14 个回答

7
from subprocess import Popen, PIPE

proc = Popen(['sftp','user@server', 'stop'], stdin=PIPE)
proc.communicate(input='password')

试试在 communicate 里输入 'password',这个对我有效。

12

试试这个

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

这样应该可以。

你说的情况听起来像是 stdin=None,这意味着子进程会继承父进程(也就是你的Python程序)的输入。

6

也许你应该考虑使用一个类似于 expect 的库呢?

比如说 Pexpect示例)。还有其他类似的 Python 库也可以使用。

撰写回答