我正在编写一个脚本,该脚本将校验和和目录作为输入。没有太多的背景,我正在寻找"恶意软件"(即。可执行文件目录中的一个标志。我得到了"恶意软件"的SHA512和。我已经让它工作了(我找到了标志),但是在将该函数泛化为不同的加密协议、编码和单个文件而不是目录后,我遇到了输出的问题:
FileNotFoundError: [Errno 2] No such file or directory : 'lessecho'
目录中确实有一个文件lessecho
,而且它与返回实际标志的文件很接近。可能是巧合吧。可能。
#!/usr/bin/python3
import hashlib, sys, os
"""
### TO DO ###
Add other encryption techniques
Include file read functionality
"""
def main(to_check = sys.argv[1:]):
dir_to_check = to_check[0]
hash_to_check = to_check[1]
BUF_SIZE = 65536
for f in os.listdir(dir_to_check):
sha256 = hashlib.sha256()
with open(f, 'br') as f: <--- line where the issue occurs
while True:
data = f.read(BUF_SIZE)
if not data:
break
sha256.update(data)
f.close()
if sha256.hexdigest() == hash_to_check:
return f
if __name__ == '__main__':
k = main()
print(k)
感谢Randall的回答
这是我家乡的一些小饰品,以换取您的智慧。
您的listdir
调用为您提供了裸文件名(例如lessecho
),但这是在dir_to_check
目录内(为了方便,我将其称为foo
)。要打开文件,您需要将路径的这两个部分重新连接在一起,以获得正确的路径(例如foo/lessecho
)。os.path.join
函数就是这样做的:
for f in os.listdir(dir_to_check):
sha256 = hashlib.sha256()
with open(os.path.join(dir_to_check, f), 'br') as f: # add os.path.join call here!
...
代码中还有一些与当前错误无关的其他问题。一种是对文件名(来自循环)和文件对象(在with
语句中)使用相同的变量名f
。为其中一个选择一个不同的名称,因为您需要两个都可用(因为我假设您希望return f
返回文件名,而不是最近关闭的文件对象)。
说到关闭的文件,你实际上关闭了两次文件对象。第一个发生在with
语句的末尾(这就是为什么使用with
)。第二个是对f.close()
的手动调用。你根本不需要手动调用。