我需要编写一个打开两个文件的函数,如果某个比较为真,将结果写入第三个文件:
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的每一行中制作字典,我也测试过它:
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我在单词文件中找到了所有这些单词(打哈欠,无敌,等等),但由于某种原因,它们并不匹配。我也尝试过做类似的事情:check_pass(“As战”,"IqAFDoIjL2cDs")和其他一些,它们都返回true,所以我很困惑为什么更多的它们没有打印到我的输出文件。
发布于 2016-02-25 04:04:55
您希望计算f1中的每一行与f2中的每一行。但是,在通过f2进行的第一次迭代中,您使用了f1中的每一行。在第二次迭代中,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循环的主体中。
发布于 2016-02-25 04:06:02
当您第一次迭代f2时,您就耗尽了迭代器,而f2的所有未来迭代都是根本不执行的循环。要么将f2的所有行加载到list中以便可以多次迭代,要么在耗尽它之后调用f2.seek(0)来重置文件指针。
https://stackoverflow.com/questions/35618029
复制相似问题