Проблема с использованием open() в python с глобальной переменной linux

#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 да, исправил это. Спасибо.