2017-02-07 54 views
1

這裏是我的示例Python代碼手柄提示在Python - POPEN

def gitClone(): 
    proc = subprocess.Popen(['git', 'clone', 'https://[email protected]:443/sailclientqa.git'], stdout=subprocess.PIPE) 
    stdout,stderr = proc.communicate('mypassword') 
    print(stddata) 
    print (stderr) 

在提示每一個執行結果的密碼。沒有密碼提示的時候,用python做這個git clone最好的辦法是什麼。

我會很感激你的專長/建議

+0

我試過了。這是我的代碼 'proc = subprocess.Popen(['git','clone','https://[email protected]:443/sailclientqa.git'],stdin = subprocess.PIPE) proc.communicate('5pac1ientd15tqa')' 仍然沒有工作 –

+0

我無法爲這種情況設置SSH。這是Azure上用於部署的臨時GIT存儲庫。我無法獲得https:// user:pass/someurl/.git。 我唯一的解決方案是通過python找出它。 不知道這是如何重複,當原來的問題是關於混帳在哪裏,因爲我想這個由python解決。我確實從你的觀點看到了相似性,儘管Miney從python的角度來看更爲具體 –

回答

0

簡易方法是添加stdin=subprocess.PIPE到您的命令,所以你可以給它輸入密碼。但是,使用輸入鍵盤輸入的特殊方式的密碼輸入並不那麼簡單。

另一方面,如this answer中所述,可以在命令行中傳遞密碼(儘管由於密碼存儲在git命令歷史記錄中,所以不建議使用命令行!)。

如下我將修改代碼:

  • 添加password參數。如果沒有設置,使用Python getpass模塊提示輸入密碼(也許你並不需要一個)
  • 如果密碼正確設置,通過它在修改命令行

我的建議:

import getpass 

def gitClone(password=None): 
    if password is None: 
     password = getpass.getpass() 
    proc = subprocess.Popen(['git', 'clone', 'https://someuser:{}@sailclientqa.scm.azurewebsites.net:443/sailclientqa.git'.format(password)], stdout=subprocess.PIPE) 
    stdout,stderr = proc.communicate() 
    print(stddata) 
    print (stderr) 

如果上述解決方案不起作用,另一種,如果你不能設置SSH密鑰,是使用pexpect模塊,它可以處理特殊的密碼輸入流:

def gitClone(mypassword): 
    child = pexpect.spawn('git clone https://[email protected]:443/sailclientqa.gi') 
    child.expect ('Password:') 
    child.sendline (mypassword) 

它具有很好的優勢而不是在git命令歷史中存儲密碼。

來源:How to redirect data to a "getpass" like password input?

+0

感謝您的回覆。感謝您爲我花費時間。試過了。仍然會提示輸入密碼,即使我將正確的密碼作爲參數傳遞 –

+0

我已經使用'pexpect'模塊添加了一個有前途的潛在客戶。 –