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()
。您根本不需要手动呼叫。
我正在编写一个将校验和和目录作为输入的脚本。 在没有太多背景的情况下,我正在寻找可执行文件目录中的 '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()
。您根本不需要手动呼叫。