首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python For循环只循环一次(对于文本文件中的每一行)

Python For循环只循环一次(对于文本文件中的每一行)
EN

Stack Overflow用户
提问于 2014-01-07 06:35:13
回答 1查看 361关注 0票数 0

我目前正在攻读软件开发学位的第三年,我正在考虑明年扩展到一些安全模块,我选择了“暴力Python”作为入门课程,并学习了一门新语言,但是我被困在了第一个练习中。

我不是编程新手,也许我只是累了--这是漫长的一天,睡得很少--但这个简单的脚本不会起作用:

代码语言:javascript
复制
import crypt
def testPass(cryptPass):
salt = cryptPass[0:2]
 dictFile = open('dictionary.txt')
 for word in dictFile.readlines():
  word = word.strip('\n')
  print "[*] Attempting password: "+word+"\n"
  cryptWord = crypt.crypt(word,salt)
  if (cryptWord == cryptPass):
   print "[+] Found Password: "+word+"\n"
   return
  print "[-] Password Not Found.\n"
  return
def main():
 passFile = open('passwords.txt')
 for line in passFile.readlines():
  if ":" in line:
   user = line.split(':')[0]
   cryptPass = line.split(':')[1].strip(' ')
   print "[*] Cracking Password For: "+user
   testPass(cryptPass)
if __name__ == "__main__":
 main()

Passwords.txt有两个来自/etc/passwd的用户(受害者和根用户),它可以很好地遍历这两个用户。我的dictionary.txt中有三个密码,由于某种原因,它只尝试第一个密码:

代码语言:javascript
复制
[*] Cracking Password For: victim
[*] Attempting password: break 

[-] Password Not Found.

[*] Cracking Password For: root
[*] Attempting password: break 

[-] Password Not Found.

有没有人能解释一下为什么上面从书中搬来的代码不能工作?我设法通过使用“with open”来解决这个问题:

代码语言:javascript
复制
with open('dictionary.txt') as f:
 for word in f:
  word = word.strip("\n")
  cryptWord = crypt.crypt(word,salt)
  if (cryptWord == cryptPass):
   print "[+] Found Password: "+word+"\n"
   return
  print "[-] Password Not Found.\n"
  return
EN

回答 1

Stack Overflow用户

发布于 2014-01-07 06:50:47

这是一个缩进错误。为了让它正常工作,你的'testPass‘函数应该是这样的:

代码语言:javascript
复制
def testPass(cryptPass):
    salt = cryptPass[0:2]
    dictFile = open('dictionary.txt')
    for word in dictFile.readlines():
        word = word.strip('\n')
        print "[*] Attempting password: "+word+"\n"
        cryptWord = crypt.crypt(word,salt)
        if (cryptWord == cryptPass):
            print "[+] Found Password: "+word+"\n"
            return
     print "[-] Password Not Found.\n"
     return

这样,它将遍历字典中的每个单词,并在找到密码后返回。如果它循环遍历所有内容但没有找到它,那么它应该打印"password not found“。你的问题是你的代码(为清晰起见有一点间隔)实际上是这样缩进的:

代码语言:javascript
复制
def testPass(cryptPass):
    salt = cryptPass[0:2]
    dictFile = open('dictionary.txt')
    for word in dictFile.readlines():
        word = word.strip('\n')
        print "[*] Attempting password: "+word+"\n"
        cryptWord = crypt.crypt(word,salt)
        if (cryptWord == cryptPass):
            print "[+] Found Password: "+word+"\n"
            return
        print "[-] Password Not Found.\n"
        return

看到区别了吗?像这样,它只会检查第一个单词,因为第二个"return“在循环中。请验证您的缩进(理想情况下是4个空格,如@jonrsharpe所说,或者是制表符),然后重试。我怀疑这会解决你的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20960601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档