Ручное редактирование файла 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 — перепутать их опасно.
Скрипт на 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
Скрипт на 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; остальные записи придётся внести заново.