Создание утилит для администрирования: использование Python
Общие принципы создания системных утилит
Системные утилиты на Python позволяют автоматизировать задачи администрирования: мониторинг, очистку, управление процессами и сетью. Python предоставляет богатый набор модулей для взаимодействия с операционной системой. В этой статье рассмотрены основные подходы и примеры.
Как написать утилиту для очистки временных файлов с подтверждением?
Наиболее эффективное решение: использование модулей os, shutil и glob.
Пример утилиты, которая находит файлы старше 7 дней в папке /tmp и удаляет их после подтверждения:
import os
import shutil
import time
import glob
def clean_temp(path='/tmp', days=7):
now = time.time()
cutoff = now - days * 86400
files = glob.glob(os.path.join(path, '*'))
for f in files:
if os.path.isfile(f):
mtime = os.path.getmtime(f)
if mtime < cutoff:
print(f'Удалить {f}?')
answer = input('y/n: ')
if answer.lower() == 'y':
os.remove(f)System calls python (системные вызовы в python)
Пояснение: функция получает время последнего изменения файла и сравнивает с порогом. При удалении запрашивается подтверждение.
Проблемы: не хватает прав на удаление (PermissionError), файл может быть занят другим процессом (OSError). Решение: обернуть удаление в try-except и логировать ошибки.
Как получить информацию о загрузке CPU и памяти?
Вариант с использованием стороннего модуля psutil.
psutil предоставляет удобный интерфейс для системной информации. Пример:
import psutil
cpu_percent = psutil.cpu_percent(interval=1)
memory = psutil.virtual_memory()
print(f'CPU: {cpu_percent}%')
print(f'RAM: {memory.percent}% использовано')
print(f'Всего: {memory.total / (1024**3):.2f} ГБ')создание системных утилит python (создание системных утилит на python)
Цель: мониторинг ресурсов сервера в реальном времени. Используется для скриптов оповещения.
Проблемы: psutil не входит в стандартную библиотеку, требуется установка (pip install psutil). На некоторых системах может потребоваться компиляция.
Как эффективно манипулировать путями и файлами?
Вариант с объектно-ориентированным модулем pathlib.
pathlib упрощает работу с файловыми путями. Пример: поиск всех файлов .log в директории:
from pathlib import Path
log_dir = Path('/var/log')
for log_file in log_dir.glob('*.log'):
print(f'Найден: {log_file.name}')
if log_file.stat().st_size > 1_000_000:
log_file.rename(log_file.with_suffix('.log.bak'))Python open exe (запуск exe файла из python)
Цель: написание кроссплатформенных утилит для обработки файлов. pathlib автоматически обрабатывает разделители путей.
Проблемы: различие в регистре символов на Linux/Windows. Рекомендуется использовать .resolve() для абсолютных путей.
Как создать простой сканер портов?
Вариант с использованием модуля socket.
Пример сканера TCP-портов на заданном хосте:
import socket
def scan_port(host, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)
result = sock.connect_ex((host, port))
sock.close()
return result == 0
host = 'localhost'
for port in range(20, 1025):
if scan_port(host, port):
print(f'Порт {port} открыт')библиотека команд python (библиотека для выполнения команд в python)
Цель: быстрая проверка доступности сетевых сервисов. Используется в диагностике сети.
Проблемы: блокирующие вызовы сокетов замедляют сканирование. Решение: использование асинхронных сокетов или потоков. Также может быть ложное срабатывание из-за файрвола.
Как выполнить системную команду и обработать вывод?
Вариант с модулем subprocess.
Пример запуска команды df для получения информации о дисках:
import subprocess
result = subprocess.run(['df', '-h'], capture_output=True, text=True)
if result.returncode == 0:
print(result.stdout)
else:
print(f'Ошибка: {result.stderr}')Цель: выполнение любых системных команд из Python и получение их вывода. Используется для интеграции с существующими инструментами.
Проблемы: кодировка вывода может отличаться от UTF-8. Рекомендуется указывать encoding='utf-8' или использовать .decode(). Также следует избегать shell=True из-за риска инъекций.
Расширенные примеры системных утилит
Мониторинг дискового пространства с ведением лога
import psutil
import datetime
log_file = '/var/log/disk_monitor.log'
disks = psutil.disk_partitions()
for disk in disks:
usage = psutil.disk_usage(disk.mountpoint)
percent = usage.percent
if percent > 90:
with open(log_file, 'a') as f:
f.write(f'{datetime.datetime.now()} - {disk.mountpoint} занято {percent}%\n')
print(f'Предупреждение: {disk.mountpoint} заполнен на {percent}%')2025-03-22 10:15:30 - / заполнен на 92%
Пояснение: скрипт проверяет каждый смонтированный раздел и записывает в лог, если занято более 90%.
Параллельный сканер портов с использованием потоков
import socket
import threading
from queue import Queue
def scan(q, host):
while not q.empty():
port = q.get()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(0.5)
result = sock.connect_ex((host, port))
if result == 0:
print(f'Порт {port} открыт')
sock.close()
q.task_done()
host = '127.0.0.1'
ports = range(1, 1025)
q = Queue()
for p in ports:
q.put(p)
threads = []
for _ in range(50):
t = threading.Thread(target=scan, args=(q, host))
t.start()
threads.append(t)
for t in threads:
t.join()Порт 22 открыт Порт 80 открыт Порт 443 открыт
Пояснение: использование пула потоков ускоряет сканирование. Очередь распределяет порты между потоками.
Демон для логирования системных событий (syslog)
import socket
import syslog
import time
# Простой демон, слушающий сокет и записывающий сообщения в syslog
def daemon():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', 9999))
sock.listen(5)
syslog.openlog('mydaemon')
while True:
conn, addr = sock.accept()
data = conn.recv(1024)
if data:
syslog.syslog(syslog.LOG_INFO, f'from {addr}: {data.decode()}')
conn.close()
if __name__ == '__main__':
daemon()Пояснение: Демон работает в фоне, принимает TCP-сообщения и пишет их в системный журнал. Запуск: python daemon.py &
Работа с реестром Windows (только Windows)
import winreg
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\Windows\CurrentVersion')
print('Значение ProgramFilesDir:')
value, reg_type = winreg.QueryValueEx(key, 'ProgramFilesDir')
print(value)
winreg.CloseKey(key)Значение ProgramFilesDir: C:\Program Files
Пояснение: доступ к реестру Windows через winreg. Позволяет читать и изменять настройки системы. Требует прав администратора.