Скрипт для изменения файла hosts: инструкция и готовые примеры

Ручное редактирование файла hosts через «Блокнот» упирается в две постоянные проблемы: система требует права администратора, а при массовой настройке нескольких компьютеров одни и те же строки приходится вбивать вручную на каждой машине. Скрипт для изменения файла hosts решает обе задачи: он автоматически дописывает нужные записи, делает резервную копию и одинаково отрабатывает на любом количестве ПК.

Ниже — готовые примеры скриптов для Windows (bat и PowerShell) и для Linux/macOS (bash), а также правила безопасной правки: где лежит файл, как проверить результат и что делать, если изменения не применяются.

Где находится файл hosts и как устроены его записи

Путь к файлу зависит от операционной системы. В Windows это C:\Windows\System32\drivers\etc\hosts, в Linux и macOS — /etc/hosts. Файл не имеет расширения, и это частая причина ошибки: «Блокнот» при сохранении может незаметно дописать .txt, после чего система перестаёт видеть файл.

Каждая строка имеет формат: сначала IP-адрес, затем через пробел или табуляцию — имя хоста. Символ # превращает строку в комментарий. Пример записи: 192.168.1.10 myserver.local. Система проверяет hosts раньше, чем обращается к DNS-серверу, поэтому записи здесь имеют приоритет.

Скрипт на bat (командный файл Windows)

Самый простой вариант — пакетный файл с расширением .bat или .cmd. Он подходит, когда нужно быстро дописать одну-две строки без установки дополнительных инструментов. Сохраните текст ниже в файл, например add-host.bat, и запустите его от имени администратора.

@echo off

set HOSTS=%SystemRoot%\System32\drivers\etc\hosts

:: Резервная копия с датой в имени

copy "%HOSTS%" "%HOSTS%.bak_%DATE:~0,2%%DATE:~3,2%%DATE:~6,4%" >nul

:: Проверка, нет ли уже такой записи

findstr /c:"myserver.local" "%HOSTS%" >nul

if %errorlevel%==0 (

echo Zapis uzhe suschestvuet

pause

exit /b 0

)

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

echo 192.168.1.10 myserver.local >> "%HOSTS%"

echo Gotovo

pause

Обратите внимание на конструкцию с findstr: она не даёт скрипту плодить дубликаты при повторном запуске. Без этой проверки каждый запуск будет дописывать строку заново, и файл постепенно превратится в свалку одинаковых записей.

  • 📄 Сохраняйте bat-файл в кодировке без кириллицы в комментариях либо добавьте chcp 65001 первой строкой — иначе русский текст может отобразиться «кракозябрами».
  • 🔑 Запускайте скрипт через правый клик → «Запуск от имени администратора», иначе правка завершится ошибкой доступа.
  • 🧾 Оператор >> дописывает в конец файла, а одиночный > полностью перезаписывает hosts — перепутать их опасно.
📊 Какой способ правки hosts вы используете чаще всего
Bat-скрипт
PowerShell
Ручное редактирование в редакторе
Bash на Linux/macOS

Скрипт на PowerShell

PowerShell удобнее для сложных сценариев: массового добавления записей из списка, проверки прав, аккуратной работы с кодировкой. Пример ниже добавляет сразу несколько хостов и пропускает уже существующие.

$hostsPath = "$env:SystemRoot\System32\drivers\etc\hosts"

$entries = @(

"192.168.1.10 myserver.local",

"192.168.1.11 db.local"

)

Copy-Item $hostsPath "$hostsPath.bak" -Force

$content = Get-Content $hostsPath -Raw

foreach ($line in $entries) {

$hostname = ($line -split "\s+")[1]

if ($content -notmatch [regex]::Escape($hostname)) {

Add-Content $hostsPath $line

Write-Host "Dobavleno: $line"

} else {

Write-Host "Propushcheno (uzhe est): $hostname"

}

}

Если система блокирует запуск скриптов, проверьте политику выполнения командой Get-ExecutionPolicy. Для разового запуска можно выполнить в консоли powershell -ExecutionPolicy Bypass -File script.ps1 — это не меняет политику постоянно. Подробности действующих ограничений стоит сверить с документацией Microsoft для вашей версии Windows.

☑️ Перед запуском скрипта правки hosts

Выполнено: 0 / 5

Скрипт на bash для Linux и macOS

В Unix-системах файл /etc/hosts принадлежит root, поэтому скрипт запускается через sudo. Логика та же: копия, проверка дубликатов через grep, добавление строки.

#!/bin/bash

HOSTS=/etc/hosts

ENTRY="192.168.1.10 myserver.local"

HOSTNAME="myserver.local"

sudo cp "$HOSTS" "$HOSTS.bak.$(date +%Y%m%d)"

if grep -q "$HOSTNAME" "$HOSTS"; then

echo "Zapis uzhe suschestvuet"

else

echo "$ENTRY" | sudo tee -a "$HOSTS" > /dev/null

echo "Zapis dobavlena"

fi

Здесь используется связка echo ... | sudo tee -a, а не прямой sudo echo >>. Дело в том, что перенаправление >> выполняется оболочкой до применения sudo, и запись в системный файл от имени обычного пользователя будет отклонена. Команда tee с флагом -a дописывает в файл уже с повышенными правами.

Проверка результата и сброс кэша DNS

После отработки скрипта запись может не подействовать сразу — система и браузер кэшируют DNS-ответы. В Windows выполните в командной строке:

ipconfig /flushdns

Затем проверьте результат: ping myserver.local должен показать IP-адрес из вашей записи. Если пингуется другой адрес — возможно, запись с таким именем уже есть выше в файле (hosts читается сверху вниз, срабатывает первое совпадение), либо браузер держит собственный кэш, и его нужно перезапустить.

⚠️ Внимание: в macOS и некоторых Linux-дистрибутивах команда сброса DNS-кэша отличается и зависит от версии системы. Универсальной команды нет — сверьтесь с документацией вашей ОС перед выполнением.

Типичные ошибки при работе скриптов с hosts

ОшибкаПричинаРешение
«Отказано в доступе»Скрипт запущен без прав администратора/rootЗапуск от имени администратора или через sudo
Запись не действуетDNS-кэш или дубликат записи выше в файлеСбросить кэш, проверить порядок строк
Файл «не виден» системеСохранён как hosts.txtУбрать расширение .txt, включить показ расширений
Крякозябры в комментарияхКодировка файла не совпадает с кодировкой консолиИспользовать chcp 65001 или писать латиницей
Файл перезаписан пустымИспользован > вместо >>Восстановить из резервной копии .bak
⚠️ Внимание: некоторые антивирусы отслеживают изменения hosts и могут блокировать работу скрипта или откатывать правки — это защита от вредоносов, перенаправляющих сайты. Если скрипт «молча» не срабатывает, проверьте журнал вашего антивируса и добавьте исключение только при полной уверенности в содержимом скрипта.
Зачем вообще править hosts скриптом

Типовые сценарии — развёртывание одинаковых записей на парке машин, временная блокировка рекламных доменов перенаправлением на 127.0.0.1, настройка локальных имён для разработки и тестирования сайтов до смены DNS, быстрый откат конфигурации через восстановление .bak-копии.

Безопасность и откат изменений

Главное правило автоматизации: любой скрипт, правящий hosts, должен начинаться с создания резервной копии. Восстановление тогда занимает секунды — достаточно переименовать hosts.bak обратно в hosts. Без копии испорченный файл придётся восстанавливать вручную, вспоминая, какие записи там были.

Не запускайте чужие скрипты правки hosts, не прочитав их содержимое. Перенаправление популярных доменов на чужой IP — классический приём фишинга: вместо банка или почты вы попадёте на поддельную страницу. Перед запуском просмотрите файл в любом текстовом редакторе и убедитесь, что понимаете каждую строку.

  • 🛡️ Храните эталонную копию hosts отдельно от рабочей папки скриптов.
  • 🔍 После правки сверяйте содержимое командой type %SystemRoot%\System32\drivers\etc\hosts в Windows или cat /etc/hosts в Linux.
  • 🚫 С осторожностью относитесь к «готовым спискам блокировки» из интернета — они могут содержать лишние или вредные перенаправления.

Частые вопросы

Почему скрипт отработал без ошибок, но запись не появилась?

Возможные причины: антивирус заблокировал изменение и откатил файл, скрипт писал в другой путь, либо запись добавилась, но DNS-кэш показывает старый результат. Проверьте содержимое файла напрямую и выполните ipconfig /flushdns.

Можно ли изменять hosts без прав администратора?

Нет, штатными средствами — нельзя. Файл защищён системой, и это сделано намеренно: иначе любая программа могла бы незаметно перенаправлять ваши сайты. Скрипт всегда нужно запускать с повышенными привилегиями.

Как удалить запись скриптом, а не добавить?

В PowerShell можно прочитать файл, отфильтровать строки без нужного имени и записать результат обратно. В bash для этого используется sudo sed -i '/myserver.local/d' /etc/hosts. Перед удалением так же делайте резервную копию.

Работает ли файл hosts для поддоменов и масок?

Нет, hosts не поддерживает маски вида *.example.com. Каждый поддомен нужно прописывать отдельной строкой. Для массовых масок подойдёт локальный DNS-сервер, а не правка hosts.

Что делать, если файл hosts испорчен?

Восстановите его из резервной копии, созданной скриптом. Если копии нет — создайте новый пустой файл без расширения по стандартному пути и добавьте строку 127.0.0.1 localhost; остальные записи придётся внести заново.