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

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

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

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

  1. add <IP> <hostname> — Добавить запись в файл 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 <IP> <hostname>)")
    print("  remove   - Remove an entry (e.g., remove <hostname>)")
    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 позволяет создавать простые, но эффективные инструменты для решения повседневных задач.