2016-02-25 57 views
1

我需要写打开两个文件和功能,如果一定比较真实结果写入第三个文件:蟒蛇通过迭代和写入文件

def crack_pass_file(pass_filename,words_filename,out_filename): 
    f1=open(pass_filename) 
    f2=open(words_filename) 
    f3=open(out_filename,'w') 
    for line1 in f1: 
     x=make_dictionary(line1.split(":")) 
     password=x["password"] 
     name=x["account"] 
     for line2 in f2: 
      if (check_pass(line2.strip(),password)==True): 
       f3.write(name + "="+line2.strip()) 

文件F1是包含一个文件:

root:VgzdTLne0kfs6:0:0:Corema Latterll:/home/root:/bin/bash 
checani:IqAFDoIjL2cDs:1:1:Pengpu Checani:/home/checani:/bin/bash 
rkrakow:DLD3nJmCvt3pY:2:2:Rodentia Krakow:/home/rkrakow:/bin/bash 
forkland:oWMVyy1FTdNL6:3:3:Forkland Maskins:/home/forkland:/bin/bash 
obongo:O44lPEloqk5tY:4:4:Obongo Obwalden:/home/obongo:/bin/bash 
pglenda:xboW5dHcsqvSQ:5:5:Pahsien Glenda:/home/pglenda:/bin/bash 
madel:qEHvJXMkTSAZA:6:6:Madel Aporosa:/home/madel:/bin/bash 
ssauks:Q3Kz1z7eAiwjg:7:7:Schober Sauks:/home/ssauks:/bin/bash 
slajoie:wWTHgoE8SC8W6:8:8:Scheiner Lajoie:/home/slajoie:/bin/bash 
tieton:RWORYLxRSSzMU:9:9:Lerwa Tieton:/home/tieton:/bin/bash 

其中每行有一个用户,一个密码和一堆其他东西。对于第1行,root是用户,VgzdTLne0kfs6是加密的密码。每隔一行使用相同的格式。我需要做的是把加密后的口令,看看是否在其他文件中,F2密码,其中包含按字母顺序排列的话就像一个巨大的列表调用隐窝:

embordering 
emborders 
emboscata 
embosk 
embosked 
embosking 

将使该密码进入加密的密码。 我已经有了确实的功能和它的工作原理:

def check_pass(plain,enc): 
    s = enc[0:2] 
    x = crypt.crypt(plain, s) 
    if x==enc: return True 
    else: return False 

也在这里是我用它来做一个字典出的文件1的每一行的makedictionary功能,也适用香港专业教育学院进行了测试:

def make_dictionary(s): 
    d={} 
    d["account"]=s[0] 
    d["shell"]=s[6] 
    d["UID"]=int(s[2]) 
    d["GID"]=int(s[3]) 
    d["GECOS"]=s[4] 
    d["directory"]=s[5] 
    d["password"]=s[1] 
    return d 

当我测试它时,它会写入: root = stroam 到输出文件,这是第一个用户的解密密码,但没有写任何其他文件。这应该是结果:

root=stroam 
checani=asarta 
rkrakow=sinklike 
obongo=yawnful 
madel=aviatic 
tieton=dagesh 
pglenda=sngissa 
forkland=relliarb 
slajoie=mu2j1k 
ssauks=EGaFeIHC 

我发现所有的这些话(yawnful,AVIATIC等)的字样文件,但由于某种原因,他们没有被匹配。我也试过这样做: check_pass(“asarta”,“IqAFDoIjL2cDs”)和一些其他人,他们都返回true,所以我很困惑为什么他们更多没有打印到我的输出文件。

+0

对不起,但我没有关注...你基本上想要2个文件逐行比较每个文件,并将匹配写入第三个文件? – Seekheart

回答

0

想要针对f2中的每条线评估f1的每条线。但是您在第一次迭代时通过f1消耗f2中的每一行。在第二次迭代中,f2是空的,你不会进入这个循环的主体。

for line1 in f1: 
# ... 
    for line2 in f2: 

相反,你的for line in f1循环之外,产生F2(和可选F1)的行的列表,像这样:

f2_lines = [line2 for line2 in f2] 
... 
for line1 in f1: 

现在你可以在使用

for line2 in f2_lines: 

你的f1循环的正文。

+0

为什么要用“列表”理解? 'f2_lines = list(f2)'可以更快,更简单地完成相同的目标。 – ShadowRanger

+0

事实上,这还是更好。 –

+0

这只是一个字符串列表的文件?完美我需要那个。如果我这样做会自动摆脱字符串末尾的换行符? –

0

您第一次迭代f2时,用尽了迭代器,并且所有将来的迭代f2都是根本不执行的循环。请将f2的所有行加载到list中,以便可以迭代多次,或者在耗尽复位文件指针后调用f2.seek(0)