2014-10-27 179 views
0

我試圖做一個使用python的登錄腳本,它將嘗試登錄shell命令login -q MyUsername並嘗試多個密碼。我已經可以生成所需的密碼,但是當我嘗試使用下面的代碼登錄時,login命令響應我輸入了錯誤的用戶名,但我知道我正確寫入了它。澄清:我創建了一個腳本,當我已經知道用戶名而不是密碼時,使用shell命令login登錄。下面的代碼顯示了我在做什麼(迭代密碼)。Python subprocess.Popen使用登錄腳本失敗

for password in passwordList: 
    p = Popen(["login","-q","MyUsername"], stdin=PIPE, stdout=PIPE) #The username MyUsername is correct, 100% sure 
    print repr(p) 

    stdout_value = p.communicate(password)[0] # 
    print(str(stdout_value)) 
    if repr(stdout_value).startswith('Login incorrect\nlogin: '): 
     print "ERROR" 
    else: 
     print "GOOD" 
     break 

如果我在命令login -q MyUsername鍵入直接到終端,我得到提示,而使用腳本返回「登錄不正確」寫我的密碼。我也很困惑Popen如何工作,以及如何寫入stdout

在此先感謝! (使用多個密碼嘗試登錄)我使用login,因爲它沒有鎖定,如果用戶數據不是由超級用戶)。

回答

1

login可能read/write directly from/to terminal (tty)進程外stdin/stdout。你可以使用pexpect,請參閱相關的第一個原因在它的文檔Q: Why not just use a pipe (popen())?

import pexpect 
output, rc = pexpect.run("login -q MyUsername", 
     events={"(?i)password: ": "password"}, 
     withexitstatus=True) 

是否有更簡單的方法來做到這一點?

從/ etc/passwd,/ etc/shadow和check those using crypt.crypt()中讀取散列值。或者使用專門的工具來測試弱密碼,如"John the Reaper"

+0

謝謝,pexpect爲我的需要工作。關於第二個問題,我查看了/ etc/passwd,但該文件不包含任何散列,它包含應用程序的地址(我認爲?)例如:_mysql:*:74:74:MySQL服務器:/ var/empty:/ USR /斌/假。 – romsearcher 2014-10-27 15:20:11

+0

@romsearcher:你在答案中看到任何其他文件名(除了'/ etc/passwd')嗎? – jfs 2014-10-27 15:40:40