推荐用sudo nano /etc/hosts或sudo vim /etc/hosts编辑,或脚本化执行sudo tee -a /etc/hosts > /dev/null

直接编辑 /etc/hosts 文件就能生效,但格式错一行就整行被忽略,甚至影响其他解析行为。
怎么安全地添加映射记录
推荐用终端命令打开编辑器,避免图形界面插入不可见字符:
-
用 nano 编辑:运行
sudo nano /etc/hosts,在文件末尾新增一行 -
用 vim 编辑:运行
sudo vim /etc/hosts,按i进入插入模式后添加 -
脚本化追加(更稳妥):用
tee -a避免覆盖风险,例如:sudo tee -a /etc/hosts > /dev/null 127.0.0.1 dev.local api.dev.local<br> 0.0.0.0 tracker.example.com<br> EOF
写对格式是关键
系统按行严格解析,以下规则必须遵守:
- 每行开头是 IP 地址,后面跟一个或多个域名,**用英文空格分隔**(不能用 Tab、逗号、中文标点或全角空格)
- 注释必须独占一行,且以
#开头,前面不能有空格;127.0.0.1 example.com # 注释这种写法部分系统会截断 - 屏蔽域名建议用
0.0.0.0而非127.0.0.1,避免本地服务意外响应 - IPv6 映射需单独写
::1行,只配 IPv4 不保证 IPv6 请求走 hosts
为什么改了却没效果
不是改完就一定起作用,常见卡点在这几处:
-
/etc/nsswitch.conf 中 hosts 行不正确:必须包含
files且排在dns前面,例如hosts: files dns;如果写成hosts: dns,hosts 文件完全不被读取 -
应用层缓存干扰:Chrome 浏览器、某些 curl 版本自带 DNS 缓存,需手动清空(如访问
chrome://net-internals/#dns) -
验证方式不对:nslookup 和 dig 默认跳过 hosts,应改用
getent hosts dev.local或host dev.local -
容器或 Java 应用绕过:Docker 默认不共享宿主机 hosts;Java 程序可能缓存 DNS 结果,需加 JVM 参数
-Dnetworkaddress.cache.ttl=0
怎么确认配置真生效了
别只靠 ping,它只测连通性,不反映解析路径:
-
getent hosts dev.local—— 最可靠,走系统实际解析链路 -
host dev.local—— 会查 hosts(只要 nsswitch 配置正确) - 启动一个本地服务监听
127.0.0.1:8080,再执行curl -v http://dev.local:8080,看请求是否抵达该端口 - 检查本机 hostname 是否有对应映射:运行
hostname,确保/etc/hosts里有一行含该名字,否则hostname -f会失败











