Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中向sftp子进程发送密码_Python_Subprocess_Sftp_Openssh - Fatal编程技术网

在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交互。

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

似乎没有现成的方法来模拟带有
子流程的终端。Popen
,请参阅:


您可以使用OpenSSH
sftp
自动进行密码验证常用的所有黑客,如
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