从命令行运行程序提示输入密码并自动为其提供密码(cmd.exe,python)

时间:2015-05-14 13:37:41

标签: python windows cmd

我有命令行程序提示输入密码:

> 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]

2 个答案:

答案 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下的警告。

相关问题