我有命令行程序提示输入密码:
> 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]
答案 0 :(得分:2)
通常,面向安全的程序在直接io上请求密码而不是读取stdin。并作为:
echo pass|cwrsync -r root@NN.NN.NN.NN:/src /cygdrive/c/dst
确实要求密码,我认为csrsync直接从控制台读取。
在这种情况下,如果没有一些工作和低级编程,你就无法自动化它,因为你必须模拟键盘动作。您应该搜索文档,因为看起来它使用基础ssh
,它可能会接受公钥对。如果它接受没有密码的语言,你应该能够自动化它。
答案 1 :(得分:0)
尝试在stdin字符串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下的警告。