ᕕ( ᐛ )ᕗ Jimyag's Blog

macOS 修改主机名为什么 sudo hostname 不够

新机器上我执行过:

1
sudo hostname m5

但终端里过一段时间又显示成了 Mac,再看系统里的 hostname:

1
hostname

输出是:

1
Mac.lan

一开始以为是 shell prompt 缓存,后来发现不是。macOS 里有几套名字,hostname 只改了当前运行时状态,没有把系统里持久化的名字都补齐。

先把几个名字都看一遍

1
2
3
4
hostname
scutil --get HostName
scutil --get LocalHostName
scutil --get ComputerName

当时我的结果大概是:

1
2
3
4
hostname: Mac.lan
HostName:
LocalHostName: m5
ComputerName: m5

关键点是 HostName 是空的。ComputerNameLocalHostName 已经是 m5,但运行时 hostname 还是被系统或网络环境带成了 Mac.lan

这几个名字的用途不完全一样:

名称 用途
HostName 系统主机名,和 hostname 最相关
LocalHostName Bonjour / .local 发现用的名字
ComputerName 系统设置、Finder、共享里显示的名字

所以只执行 sudo hostname m5 不够。它能马上改当前会话里的 hostname,但重启、切网络、DHCP 更新后,还是可能被改回去。

我现在会这样设置

1
2
3
4
5
6
sudo scutil --set HostName m5
sudo scutil --set LocalHostName m5
sudo scutil --set ComputerName m5
sudo hostname m5
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder

前三条是持久化配置;sudo hostname m5 是让当前运行时立即生效。后面两条刷新本机缓存和 mDNS。

设置完再确认:

1
2
3
4
hostname
scutil --get HostName
scutil --get LocalHostName
scutil --get ComputerName

如果 hostname 显示 m5.lan,一般也可以接受,说明局域网给它补了搜索域。真正要看的是 scutil --get HostName 是否已经是 m5

还会变回去时查什么

如果三项 scutil 都是 m5,但后面又变成 Mac.lan,我会继续查这几处:

  1. 路由器或 DHCP 服务里是不是还记着旧名字。
  2. DNS 反查是不是把当前 IP 指回 Mac.lan
  3. 登录脚本、MDM、dotfiles 里有没有重新设置 hostname。
  4. prompt 是不是没有读 hostname,而是读了别的缓存或变量。

这次的直接原因就是 HostName 没有设置。以后换机器时,与其只跑 sudo hostname,不如把三项 scutil 一起设掉。

#MacOS #Shell #Network