Программирование

Как добавить текст в /etc/hosts с помощью sudo

Узнайте, почему sudo echo 'текст' >> /etc/hosts не работает и как правильно добавлять строки в защищенные файлы с помощью tee или sudo sh -c. Полное руководство для Linux.

How can I append text to a privileged file—say, /etc/hosts—using sudo without actually switching to root? For instance, why does sudo echo "something" >> /etc/privilegedFile fail, and what’s the right way to perform such an append operation with sudo permissions?

The command sudo echo "text" >> /etc/hosts fails because the redirection (>>) is performed by the user‑level shell, not by the sudo‑elevated echo process.
To append a line with root privileges you must run the redirection in a root shell (or use a utility that performs the write itself, such as tee).


Contents


Почему sudo echo ... >> /etc/hosts не работает

sudo запускает только команду, указанную после него (echo).
Перенаправление >> выполняется оболочкой, которая запущена от вашего обычного пользователя, поэтому она не имеет прав на запись в /etc/hosts.
Эта проблема описана, например, на Server Fault и Super User:

“The shell redirect happens in the user’s security context, not sudo context.”
Server Fault


Вариант 1: tee с sudo

Самый надёжный способ — отправить вывод в sudo tee с флагом -a (append) и перенаправить tee в /dev/null, чтобы не выводить лишнюю информацию:

bash
echo "127.0.0.1   mycustomhost.local" | sudo tee -a /etc/hosts > /dev/null

Преимущества:

  • tee выполняется с правами root, поэтому он сам открывает файл для записи.
  • Можно использовать переменные и сложные строки без экранирования.
  • Работает в большинстве оболочек и надёжно в контейнерах, если файловая система не Read‑Only.

“Using tee is the canonical solution for appending to privileged files.”
Stack Overflow


Вариант 2: sudo sh -c или sudo bash -c

Если нужен один‑шаговый синтаксис, можно обернуть команду в sudo sh -c:

bash
sudo sh -c 'echo "127.0.0.1   mycustomhost.local" >> /etc/hosts'

Здесь sudo запускает sh с правами root, и внутри оболочки происходит реальное перенаправление.
Аналогично можно использовать sudo bash -c.

“You need to spawn a new shell for this to work.”
Super User


Другие нюансы и ограничения

Сценарий Что происходит Как исправить
Контейнеры (Docker, etc.) Файловая система может быть Read‑Only → ошибка Read-only file system Запустить контейнер с --privileged или смонтировать /etc/hosts в writable mode
Кэширование имени хоста В некоторых системах редактирование /etc/hosts может требовать перезапуска служб Перезапустить systemd-resolved или network-manager после изменения
Права на файл Если /etc/hosts неожиданно получит права root:root 644 → доступность для чтения, но запись только root Проверить ls -l /etc/hosts и при необходимости задать chmod 644

Заключение

  • Причина ошибки: перенаправление выполняется от имени обычного пользователя, а не от root.
  • Надёжный способ: использовать sudo tee -a или sudo sh -c 'echo … >> /etc/hosts'.
  • Контейнеры: убедитесь, что файловая система не Read‑Only, иначе используйте монтирование или --privileged.
  • Проверка: после изменения проверьте содержимое и доступность файла.

Таким образом, чтобы добавить строку в /etc/hosts без перехода в режим root, применяйте один из вышеописанных методов.

Авторы
Проверено модерацией
Модерация