我有提示密码的命令行程序:
> cwrsync root@NN.NN.NN.NN:/src /cygdrive/c/dst输出(当我从cmd.exe命令行运行它时):
root@NN.NN.NN.NN's password:当我手动输入密码时,一切正常。输出:
skipping directory src我想从命令行或python脚本自动提供它的密码。
我试过了:
一。在命令行中:
> echo pass|cwrsync -r root@NN.NN.NN.NN:/src /cygdrive/c/dst不起作用。输出:
root@NN.NN.NN.NN's password:二。来自python脚本。test.py:
import subprocess
cmd = "cwrsync -r root@NN.NN.NN.NN:/src /cygdrive/c/dst"
proc = subprocess.Popen(cmd1, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
std1, std2 = proc.communicate("pass")
print std1print std2不是在工作。输出:
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: unexplained error (code 255) at io.c(235) [Receiver=3.1.1]发布于 2015-05-14 22:03:05
面向安全的程序通常要求在直接io上输入密码,而不是读取标准输入。和as:
echo pass|cwrsync -r root@NN.NN.NN.NN:/src /cygdrive/c/dst确实询问了密码,我假设csrsync直接从控制台读取。
在这种情况下,如果没有一些工作和低级编程,您就无法实现自动化,因为您必须模拟键盘操作。相反,您应该搜索文档,因为它看起来使用了底层ssh,因此很可能接受公钥对。如果它接受一个没有密码短语,那么您应该能够使其自动化。
发布于 2015-05-14 21:51:34
尝试在标准输入字符串communicate调用中发送一个换行符,如下所示:
import subprocess
cmd = ['cwrsync', '-r', 'root@NN.NN.NN.NN:/src', '/cygdrive/c/dst']
proc = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE,
shell=True)
std1, std2 = proc.communicate("pass\r\n\r\n")
print std1
print std2您还应该看看它是否适用于shell=False (来自subprocess docs):
使用shell=True的
可能会带来安全风险。有关详细信息,请参阅Frequently Used Arguments下的警告。
https://stackoverflow.com/questions/30238840
复制相似问题