Создание утилит для администрирования: использование 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. Позволяет читать и изменять настройки системы. Требует прав администратора.

Создание системных утилит на Python - comments

En
создание системных утилит python (python)