#python #linux #scripting #nmap
Вопрос:
Я пытаюсь открыть и прочитать файл с open() в python, с глобальной переменной $USER в Linux, но программа останавливается в строке 2. Я хочу верить, что проблема в функции open (), потому что я использую $USER в строке 1, и все в порядке:
os.system("/usr/bin/nmap {target} -oN /home/$USER/.nmap_diff/scan{today}.txt")
scantxt = open("/home/$USER/.nmap_diff/scan{today}.txt","rb")
На выходе получается:
File "diffscanner.py", line 92, in scanner
scantxt = open("/home/$USER/.nmap_diff/scan{}.txt".format(today),"rb")
FileNotFoundError: [Errno 2] No such file or directory: '/home/$USER/.nmap_diff/scan2021-07-10.txt'
В выводе говорилось: scan2021-07-10.txt не нашел, но он действительно существует:
scan2021-07-10.txt
Ответ №1:
Проблема в том , что $USER
интерпретируется как литеральная строка open
, а не как переменная среды. Чтобы развернуть переменные среды в строке, используйте os.path.expandvars.
os.system(f"/usr/bin/nmap {target} -oN /home/$USER/.nmap_diff/scan{today}.txt")
result_path = os.path.expandvars(f"/home/$USER/.nmap_diff/scan{today}.txt")
with open(result_path, "r", encoding="utf-8") as f:
scantxt = f.read()
Кстати, также похоже, что строки в вашем вопросе должны были быть строками f, но в них отсутствовали f
префиксы. Я добавил их в свой ответ.
Кроме того, я предполагаю, что вам нужны результаты сканирования в виде строки, поэтому я также добавил код для этого. (Похоже, что nmap обычно не включает в свой вывод для -oN
опции символы, отличные от ascii, но я указываю кодировку как UTF-8 на случай, если в будущей версии будет добавлена поддержка символов UTF-8.)
Ответ №2:
os.system
выполняет команду(переданную в виде строки) в подоболочке. Это означает, что в вашем случае команда будет иметь доступ к переменным среды Linux USER
.
С другой стороны, open
ожидает объект, подобный пути, такой как строка пути. Строка считывается как есть и не оценивается для замены USER
(или любой другой переменной среды) фактическими значениями. Если вы хотите использовать env var, используйте os.environ
import os
USER = os.environ['USER']
scantxt = open(f"/home/{USER}/.nmap_diff/scan{today}.txt","rb")
Комментарии:
1. Я думаю, что строка 3 должна быть
USER = os.environ["USER"]
такой .2. @JackTaylor да, исправил это. Спасибо.