2016-01-06 92 views
2

如果我使用subprocess從Python運行終端命令,如何打印密碼提示?使用Python的子進程打印密碼提示

我有一個Python腳本,要求用戶通過Kerberos進行身份驗證。我的程序基本上是這樣的:

import subprocess 

def kinit(): 
    kinit = "kinit -f" 
    prompt = subprocess.check_output(kinit, shell=True) 
    print prompt ## echoes "Password for [email protected]" AFTER pw input 

if __name__=="__main__": 
    kinit() 
    doOtherStuff() 

當這個腳本是從終端啓動,程序等待密碼輸入(可以通過命令行輸入),但只顯示「密碼用戶名@ domain.com「提示用戶輸入密碼後。

您知道在Python腳本等待他們輸入密碼之前,我可以如何顯示「密碼爲[email protected]」嗎?

回答

0

原來你不行。 subprocess將不會在進程中間返回輸出,並且只有在輸入用戶輸入之後,進程纔會完成。

2

這是一個互動的東西,所以你不應該叫check_output。這通常用於子流程,它會做一些事情然後終止(不需要鍵盤輸入)。

您可以通過製作Popen實例來實現自己的目的,然後使用Popen.communicate與其進行交互。但將輸入發送到進程stdin並正確讀取標準輸出中的行可能會非常棘手,而不會發生死鎖或緩衝複雜化。

還有更好的方法:pexpect非常適合這個。我建議溝通subprocess有利於pexpect在這裏。

+0

這是正確的答案。試圖使它與子進程一起工作只會導致大量的挫折 – Logan

+0

感謝解釋(1)爲什麼'check_output'不夠理想,(2)'Popen'和'pexpect'是更優化的解決方案。我會嘗試這些,看看他們是如何工作的。 –

+0

@Logan:由於[這些原因](http://pexpect.readthedocs.org/en/stable/FAQ.html#whynotpipe),'pexpect'是可取的,但[這並不意味着'subprocess'不能在互動案例中使用](http://stackoverflow.com/a/23795689/4279) – jfs