在Python中向sftp子进程发送密码
第一个命令(在Python中向sftp子进程发送密码,python,subprocess,sftp,openssh,Python,Subprocess,Sftp,Openssh,第一个命令(sudo-S whoami)通过子进程正确获取密码成功。但是,sftp命令不接受密码–仍会提示我输入密码 我有和你一样的问题。但是,我不想使用像Pexpect或expect这样的解决方案。我已经尝试了其余的解决方案 想知道为什么sftp会失败,还有其他方法吗?sftp不会从stdin读取密码,而是打开/dev/tty。这就是为什么通过通信发送passwod不起作用的原因 相反,您可以使用pubkey身份验证,并使用批处理文件(sftp-b)执行sftp命令。另外,您也可以使用pexp
sudo-S whoami
)通过子进程
正确获取密码成功。但是,sftp
命令不接受密码–仍会提示我输入密码
我有和你一样的问题。但是,我不想使用像Pexpect或expect
这样的解决方案。我已经尝试了其余的解决方案
想知道为什么
sftp会失败,还有其他方法吗?sftp不会从stdin读取密码,而是打开/dev/tty。这就是为什么通过通信发送passwod不起作用的原因
相反,您可以使用pubkey身份验证,并使用批处理文件(sftp-b)执行sftp命令。另外,您也可以使用pexpect()与sftp交互。OpenSSHsftp
始终从终端读取密码(它没有与sudo
-S
开关等效的密码)
似乎没有现成的方法来模拟带有子流程的终端。Popen
,请参阅:
您可以使用OpenSSHsftp
自动进行密码验证常用的所有黑客,如sshpass
或Expect:
或者使用公钥身份验证
尽管更好的方法是使用本机Python SFTP模块,如或
有了它们,你就不会有这些问题了
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