[英]Run program from command line what prompts password and automatically provide password for it (cmd.exe, python)
我有命令行程序,提示輸入密碼:
> 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]
面向安全的程序通常直接在io上要求輸入密碼,而不是讀取stdin。 並作為 :
echo pass|cwrsync -r root@NN.NN.NN.NN:/src /cygdrive/c/dst
確實詢問了密碼,我認為csrsync是直接從控制台讀取的。
在這種情況下,如果不進行一些工作和進行低級編程,就無法使其自動化,因為您將不得不模擬鍵盤操作。 相反,您應該搜索文檔,因為看起來它使用了基礎ssh
,所以它很可能接受公鑰對。 如果它接受一個沒有密碼短語的密碼,那么您應該能夠使其自動化。
嘗試在您的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
(來自子過程docs ):
使用
shell=True
可能會帶來安全隱患。 有關詳細信息,請參見“ 常用參數”下的警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.