在 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 子进程发送密码的主要内容,如果未能解决你的问题,请参考以下文章