FileNotFoundError但文件在那里:加密版



我正在编写一个脚本,该脚本将校验和和目录作为输入。没有太多的背景,我正在寻找"恶意软件"(即。可执行文件目录中的一个标志。我得到了"恶意软件"的SHA512和。我已经让它工作了(我找到了标志),但是在将该函数泛化为不同的加密协议、编码和单个文件而不是目录后,我遇到了输出的问题:

FileNotFoundError: [Errno 2] No such file or directory : 'lessecho'

目录中确实有一个文件lessecho,而且它与返回实际标志的文件很接近。可能是巧合吧。可能。

下面是我的Python脚本:
#!/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()的手动调用。你根本不需要手动调用。

相关内容

  • 没有找到相关文章

最新更新