除其他事项外,我正在尝试使用脚本更改主机名。基本上,脚本会将from和sed
的值作为。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 编辑这两个文件,没有任何不便。
答案1
sudo
使用 glibc 的 libnss 来确定主机名。通常(使用 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,因此还可以执行各种其他主机名设置。
答案2
来自 sudoers(5) 手册页:
用户规范确定用户可以运行哪些命令(以及以什么用户身份运行)指定主机默认情况下,命令以 root 身份运行,但这可以根据每个命令进行更改。
Sudo 配置文件 (/etc/sudoers) 允许指定用户可以以其他用户身份在哪台机器上运行哪些命令。如果您有很多机器,它很有用,因为您可以在不同的机器上部署相同的 sudoers 文件。您可能有一行将主机名指定为 ubuntu(以前的主机名)。运行该visudo
命令,识别该行并使用新主机名对其进行编辑。