在 Python 中向 sftp 子进程发送密码

Posted

技术标签:

【中文标题】在 Python 中向 sftp 子进程发送密码【英文标题】:Send password to sftp subprocess in Python 【发布时间】:2020-04-21 03:11:26 【问题描述】:
import subprocess

password= "xyz"

p = subprocess.Popen(["sudo", "-S", "whoami"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

print (p.communicate((password+"\n").encode())) 


ps = subprocess.Popen(["sftp", "user@sftphost"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

print (ps.communicate((password+"\n").encode())) # without print as well I get prompted for password

第一个命令(sudo -S whoami)通过subprocess正确输入密码成功。但是,sftp 命令不接受密码 - 我仍然收到提示输入密码。

我和Use subprocess to send a password 有同样的问题。但是,我不想使用像 Pexpect 或 expect 这样的解决方案。我已经尝试了其他解决方案。

想知道为什么sftp 会失败,还有其他方法吗?

【问题讨论】:

【参考方案1】:

sftp 不会从标准输入读取密码,而是打开 /dev/tty。这就是为什么通过通信发送密码不起作用的原因。

相反,您可以使用 pubkey 身份验证并为您的 sftp 命令使用批处理文件 (sftp -b)。作为替代方案,您也可以使用 pexpect (https://pexpect.readthedocs.io/en/stable/) 与 sftp 交互。

【讨论】:

【参考方案2】:

OpenSSH sftp 总是从终端读取密码(它没有 sudo -S 的等效开关)。

似乎没有现成的方法来模拟带有subprocess.Popen 的终端,请参阅: How to call an ncurses based application using subprocess module in PyCharm IDE?


您可以使用所有常用的技巧,通过 OpenSSH sftp 自动进行密码验证,例如 sshpass 或 Expect:How to run the sftp command with a password from Bash script?

或者使用公钥认证。


虽然更好的是使用原生 Python SFTP 模块,例如 Paramiko 或 pysftp。

有了它们,你就不会有这些问题了。

【讨论】:

以上是关于在 Python 中向 sftp 子进程发送密码的主要内容,如果未能解决你的问题,请参考以下文章

在 Linux 中向多个进程发送数据 [关闭]

童工如何在Deno中向父进程发送消息?

由于 contextIsolation 发生变化,在电子渲染器进程中向 Web 应用程序发送命令

如何使用 sftp 批处理文件发送密码

在python子进程中将字符串作为参数发送

如何在 python 中的子进程调用期间阻止 stdout 显示我的密码? [复制]