2014-10-27 138 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