2015-05-14 49 views
1

我有命令行程序是什么促使密码提供密码运行程序命令行):命令行提示什么密码,并自动为它(CMD.EXE,蟒蛇)

[email protected]'s password: 

当我手动输入密码,一切OK。输出:

skipping directory src 

我想从命令行或python脚本自动提供密码。

我试过了:

一。从命令行:

> echo pass|cwrsync -r [email protected]:/src /cygdrive/c/dst 

不工作。输出:

[email protected]'s password: 

二。来自python脚本。 test.py:

import subprocess 
cmd = "cwrsync -r [email protected]:/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

尝试在你的标准输入字符串发送一个换行符communicate调用就像这样:

import subprocess 
cmd = ['cwrsync', '-r', '[email protected]:/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下的警告。

+0

“尝试发送换行符” - 相同的结果,不起作用 – user1412586

2

以安全为导向的程序要求在直接io上输入密码而不是阅读stdin是很常见的。和:

echo pass|cwrsync -r [email protected]:/src /cygdrive/c/dst 

确实要求密码,我认为csrsync直接从控制台读取。

在这种情况下,如果没有一些工作和低级编程,就不能实现自动化,因为您必须模拟键盘操作。您应该搜索文档,因为它看起来像使用底层的ssh,它可能会接受公钥对。如果它接受一个没有密码的话,你应该能够自动化它。

+0

发送键盘输入使用Python的ctypes模块来调用'WriteConsoleInput'相对容易。我今天做了这个测试getpass模块的例子。但我同意使用公钥/私钥对是一种更简单,更安全的自动化方法。 – eryksun