WindowsHostsManager: Консольная утилита для работы с файлом hosts в Windows на Python

f82a21e585a807b8b23a2f345d76eaf8

Иногда возникает необходимость внести изменения в файл hosts в Windows. Вместе с этой потребностью родилась идея создать небольшую утилиту на Python, которая бы упростила процесс редактирования этого файла. В результате появился WindowsHostsManager — инструмент, созданный всего за 30 минут и предназначенный для удобного управления файлом hosts.

Описание программы

WindowsHostsManager — это простая консольная утилита, написанная на Python с использованием стандартных библиотек (os, sys, ctypes и shutil). Она предназначена исключительно для Windows и позволяет добавлять, удалять и просматривать записи в файле hosts, а также создавать резервные копии и восстанавливать файл из них.

Основные команды

  1. add  — Добавить запись в файл hosts. Пример: add 127.0.0.1 example.com

  2. remove — Удалить запись по имени хоста. Пример: remove example.com

  3. list — Показать все текущие записи в файле hosts.

  4. backup — Создать резервную копию файла hosts.

  5. restore — Восстановить файл hosts из резервной копии.

  6. clear — Очистить экран терминала.

  7. help — Показать список доступных команд.

  8. exit — Выйти из программы.

Примеры использования

Добавление записи:

Enter command: add 127.0.0.1 example.com
Вывод:
Added: 127.0.0.1 example.com

Удаление записи:

Enter command: remove example.com
Вывод:
Removed entries for: example.com

Просмотр всех записей:

Enter command: list
Вывод:
Current entries in hosts file:
127.0.0.1 localhost
127.0.0.1 example.com

Создание резервной копии:

Enter command: backup
Вывод:
Backup created: C:\Windows\System32\drivers\etc\hosts.back

Восстановление файла:

Enter command: restore
Вывод:
Are you sure you want to restore the hosts file from backup? (yes/no): yes
Hosts file restored from backup: C:\Windows\System32\drivers\etc\hosts.back

Важные замечания

Программа WindowsHostsManager автоматически запускается с правами администратора, поскольку для внесения изменений в файл hosts требуется наличие привилегий. В противном случае, программа перезапустится с запросом прав администратора.

Отличия от аналогов

Так как я сначала делаю, а потом думаю, то после проделанной работы я нашёл аналогичные программы. Первая — это HostsMan, вторая — Hosts Manager. Отличие моей программы от этих двух в том, что они имеют графический интерфейс (GUI), а моя утилита является чисто консольной.

Код программы

Программа написана всего за 30 минут, но уже обладает всеми необходимыми функциями для базового управления файлом hosts.

import os
import sys
import ctypes
import shutil

HOSTS_PATH = r'C:\Windows\System32\drivers\etc\hosts'
BACKUP_PATH = HOSTS_PATH + '.back'

def is_admin():
    try:
        return os.getuid() == 0
    except AttributeError:
        return ctypes.windll.shell32.IsUserAnAdmin() != 0

def read_hosts():
    with open(HOSTS_PATH, 'r') as file:
        return file.readlines()

def write_hosts(lines):
    with open(HOSTS_PATH, 'w') as file:
        file.writelines(lines)

def add_entry(ip, hostname):
    lines = read_hosts()
    entry = f"{ip} {hostname}\n"
    
    if entry not in lines:
        lines.append(entry)
        write_hosts(lines)
        print(f"Added: {entry.strip()}")
    else:
        print(f"Entry already exists: {entry.strip()}")

def remove_entry(hostname):
    lines = read_hosts()
    lines = [line for line in lines if not line.endswith(f"{hostname}\n")]
    write_hosts(lines)
    print(f"Removed entries for: {hostname}")

def list_entries():
    lines = read_hosts()
    if lines:
        print("Current entries in hosts file:")
        for line in lines:
            print(line.strip())
    else:
        print("No entries found in the hosts file.")

def print_help():
    print("Commands:")
    print("  add      - Add an entry (e.g., add  )")
    print("  remove   - Remove an entry (e.g., remove )")
    print("  list     - List all entries in the hosts file")
    print("  backup   - Create a backup of the hosts file")
    print("  restore  - Restore the hosts file from backup")
    print("  clear    - Clear the terminal screen")
    print("  help     - Show this help message")
    print("  exit     - Exit the application")

def clear_screen():
    os.system('cls' if os.name == 'nt' else 'clear')

def backup_hosts():
    try:
        shutil.copy2(HOSTS_PATH, BACKUP_PATH)
        print(f"Backup created: {BACKUP_PATH}")
    except IOError as e:
        print(f"Failed to create backup: {e}")

def restore_hosts():
    if os.path.exists(BACKUP_PATH):
        confirm = input("Are you sure you want to restore the hosts file from backup? (yes/no): ").strip().lower()
        if confirm == 'yes':
            try:
                shutil.copy2(BACKUP_PATH, HOSTS_PATH)
                print(f"Hosts file restored from backup: {BACKUP_PATH}")
            except IOError as e:
                print(f"Failed to restore hosts file: {e}")
        else:
            print("Restore operation canceled.")
    else:
        print("No backup file found.")

def main():
    while True:
        print("Enter command:", end=' ')
        command = input().strip().lower()

        if command.startswith('add'):
            _, ip, hostname = command.split(maxsplit=2)
            add_entry(ip, hostname)
        elif command.startswith('remove'):
            _, hostname = command.split(maxsplit=1)
            remove_entry(hostname)
        elif command == 'list':
            list_entries()
        elif command == 'backup':
            backup_hosts()
        elif command == 'restore':
            restore_hosts()
        elif command == 'help':
            print_help()
        elif command == 'clear':
            clear_screen()
        elif command == 'exit':
            print("Exiting the application...")
            break
        else:
            print("Invalid command. Type 'help' for a list of commands.")

if __name__ == "__main__":
    if not is_admin():
        print("This script needs to be run with administrator privileges.")
        ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1)
    else:
        main()

Репозиторий на GitHub

Исходный код утилиты WindowsHostsManager доступен в моём репозитории на GitHub. Вы можете скачать, протестировать и при необходимости изменить код под свои нужды. Буду рад, если оставите свои предложения или улучшения в разделе issues или pull requests.

Эта утилита — отличный пример того, как Python позволяет создавать простые, но эффективные инструменты для решения повседневных задач.

© Habrahabr.ru