Помимо прочего, я пытаюсь изменить свое имя хоста с помощью скрипта. В основном сценарий sed
s значения ubuntu
из /etc/hostname
и /etc/hosts
.
Я пробовал это на Ubuntu 16.04.4 в прошлом и работал хорошо.
Теперь, 16.04.6 (или просто случайно), я получаю ошибки с тем же скриптом. Так же, как я меняю hostname
, изменение hosts
файлы занимает много времени (вероятно, потому что sudo
пытается связаться с новым хостом, который еще не помещен в hosts
файл, но я не знал sudo
использует такую информацию), и я получаю сообщение об ошибке:
sudo: unable to resolve host xxxx
Иногда также sudo: unable to resolve host ubuntu
. Следующие команды скрипта имеют те же проблемы или не работают.
Но, очевидно, невозможно изменить сразу значения обоих файлов.
Почему это случилось? Что-то новенькое в этой версии дистрибутива Linux? Я читал, что у других людей была такая же проблема, но со мной никогда раньше не случалось, я всегда мог редактировать оба файла с помощью sudo без каких-либо других неудобств.
Из справочной страницы sudoers (5):
Спецификация пользователя определяет, какие команды пользователь может запускать (и как пользователь) на указанные хосты. По умолчанию команды запускаются от имени пользователя root, но это можно изменить для каждой команды.
Файл конфигурации Sudo (/ etc / sudoers) позволяет указать, какие команды может запускать пользователь, от имени другого пользователя (пользователей) и на какой машине (ах). Это полезно, если у вас много машин, так как вы можете развернуть один и тот же файл sudoers на разных машинах. Вероятно, у вас есть строка, в которой имя хоста указано как ubuntu (бывшее имя хоста). Запустить visudo
укажите строку и отредактируйте ее, указав новое имя хоста.
sudo
использует libnss в glibc для определения имен хостов. Обычно (с 16.04) nscd
это работает. Возможно, вы столкнетесь с истечением срока его кеша. Соответствующая конфигурация в /etc/nscd.conf
:
enable-cache hosts yes
positive-time-to-live hosts 3600
negative-time-to-live hosts 20
check-files hosts yes
persistent hosts yes
check-files
будет вызвано nscd
чтобы «периодически проверять ... время модификации ... / etc / hosts».
Я игнорирую сложности, связанные с нестандартной конфигурацией в /etc/nsswitch.conf
.
У вас должно быть как старое, так и новое имя хоста в /etc/hosts
пока старый больше не кешируется. Остановка ncsd
и если persistent
является yes
затем удаление /var/cache/nscd/hosts
, а затем запустив nscd
должно сработать.
/etc/hostname
используется только во время загрузки и в данном случае не имеет значения.
Кстати, вы также должны установить имя хоста с помощью hostnamectl
и / или hostname
который информирует ядро и любые службы, которые запрашивают у ядра имя хоста, например, через uname
системный вызов нового имени хоста. hostnamectl
выполняет всевозможные другие настройки имени хоста, потому что systemd.