Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
从命令行运行提示密码的程序,并自动为其提供密码(cmd.exe、python)_Python_Windows_Cmd - Fatal编程技术网

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

从命令行运行提示密码的程序,并自动为其提供密码(cmd.exe、python),python,windows,cmd,Python,Windows,Cmd,我有命令行程序提示密码: > cwrsync root@NN.NN.NN.NN:/src /cygdrive/c/dst 输出(当我从cmd.exe命令行运行它时): 当我手动输入密码时,一切正常。输出: skipping directory src 我想从命令行或python脚本自动为它提供密码 我试过: 一个。从命令行: root@NN.NN.NN.NN's password: > echo pass|cwrsync -r root@NN.NN.NN.NN:/src /cy

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

> cwrsync root@NN.NN.NN.NN:/src /cygdrive/c/dst
输出(当我从cmd.exe命令行运行它时):

当我手动输入密码时,一切正常。输出:

skipping directory src
我想从命令行或python脚本自动为它提供密码

我试过:

一个。从命令行:

root@NN.NN.NN.NN's password:
> 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]

尝试在stdin字符串中发送一个换行符
communicate
call,如下所示:

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
(from):

使用
shell=True
可能会造成安全隐患。有关详细信息,请参阅下面的警告


面向安全性的程序通常会在直接io上请求密码,而不是读取stdin。作为:

echo pass|cwrsync -r root@NN.NN.NN.NN:/src /cygdrive/c/dst
我问过密码,我想csrsync直接从控制台读取


在这种情况下,如果没有一些工作和低级编程,您将无法实现自动化,因为您必须模拟键盘操作。您应该改为搜索文档,因为它看起来像是使用了底层的
ssh
,所以很可能接受公钥对。如果它接受一个没有密码短语的输入,您应该能够将其自动化。

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