FileNotFoundError 但文件在那里:密码学版

FileNotFoundError But The File Is There: Cryptography Edition

我正在编写一个将校验和和目录作为输入的脚本。 在没有太多背景的情况下,我正在寻找可执行文件目录中的 'malware'(即标志)。我得到了 'malware' 的 SHA512 总和。我已经让它工作了(我找到了标志),但是在针对不同的加密协议、编码和单个文件而不是目录概括函数之后,我 运行 遇到了输出问题:

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

目录中确实有一个文件lessecho,而且正好接近returns实际标志的文件。可能是巧合。应该是吧。

下面是我的 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)

感谢兰德尔的回答 here

这里有一些来自我祖国的不起眼的小饰品,以换取你的智慧。

您的 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 到 return 文件名,而不是最近关闭的文件对象)。

说到关闭的文件,您实际上是在关闭文件对象两次。第一个发生在 with 语句的末尾(即 为什么 你使用 with)。第二个是您手动调用 f.close()。您根本不需要手动呼叫。