"[?] Анализ: C:\Users\user\ntuser.dat.LOG2"
И его нужно перезаписать к следующему анализируемому файлу, потому что если я анализирую весь компьютер, журнал будет внутренним. Я добился частичного решения, потому что бывают случаи, когда оно не работает. Вот решение:
Код: Выделить всё
def get_file_owner(filepath, config):
try:
result = subprocess.check_output(['icacls', filepath], universal_newlines=True)
for line in result.splitlines():
if "ENAGAS" in line:
owner = line.split(":")[0].strip()
return owner
print_progress(f"No OWNER found for {filepath}",config, message_type="debug")
except subprocess.CalledProcessError as e:
print_progress(f"Error retrieving file owner for {filepath}: {e}", config, message_type="debug")
except Exception as e:
print_progress(f"Unexpected error for {filepath}: {e}", config, message_type="debug")
return "Unknown"
def print_progress(message, config, message_type):
global last_message_length, last_message_type
# Map message types to the required verbosity levels
verbosity_requirements = {
"analyzing": 0, # Level 0: Minimal output, show analyzing messages
"info": 1, # Level 1: Show positive results and general information
"skipping": 2, # Level 2: Show skipped files and errors
"debug": 3 # Level 3: Debugging details
}
# Get the required verbosity for the message type
required_verbosity = verbosity_requirements.get(message_type, 0)
verbosity_level = config["verbosity_level"]
# If the verbosity level is not sufficient (except for info), return early
if verbosity_level < required_verbosity:
return
if last_message_type == "analyzing":
print(" " * last_message_length, end='\r')
# Print the appropriate message based on the type and verbosity level
if message_type == "analyzing":
print(f"[?] {message}", end='\r')
last_message_length = len(message) + 25
elif message_type == "info" and verbosity_level >= 1:
if last_message_type == "analyzing":
print(" " * last_message_length, end='\r')
print(f"{COLOR_GREEN}[INFO] {message}{COLOR_RESET}")
last_message_length = len(message) + 25
elif message_type == "skipping" and verbosity_level >= 2:
if last_message_type == "analyzing":
print(" " * last_message_length, end='\r')
print(f"{COLOR_RED}[-] {message}{COLOR_RESET}")
last_message_length = 0 # Reset length for skipping messages
elif message_type == "debug" and verbosity_level >= 3:
if last_message_type == "analyzing":
print(" " * last_message_length, end='\r')
print(f"{COLOR_DEBUG}DEBUG: {message}{COLOR_RESET}")
last_message_length = len(message) + 25 # Keep length for debug messages
last_message_type = message_type
# Flush the output to ensure it shows up immediately
sys.stdout.flush()
[img]https://i.sstatic .net/JPVenK2C.png[/img]
Другая проблема заключается в том, что когда линия длиннее ширины терминала, происходит просто «случайный» переход на другую строку.

Я думаю, что это можно решить другим способом, но я его не нашел.
Я ожидаю вывода, который при анализе файлов покажет «[?] Анализ: [текущий_файл]", и любое другое сообщение (отладка, информация, пропуск) остается на терминале, если оно запрошено на уровне детализации.
Подробнее здесь: https://stackoverflow.com/questions/791 ... sages-line