执行 networksetup -listnetworkserviceorder 查看真实网络服务优先级顺序,而非 -listallnetworkservices 中带 * 的活跃服务;修改 DNS、代理等需精确匹配服务名并验证生效。

查看当前网络服务列表和启用状态
执行 networksetup -listallnetworkservices 能看到所有服务名(比如 Wi-Fi、USB 10/100/1000 LAN),但注意:输出里带 * 号的才是当前活跃服务。很多人误以为排第一的就是默认,其实 macOS 会按服务顺序自动 fallback,真正生效的是系统判定的“首选服务”——它不等于列表首项,也不等于带 * 的那个。
更关键的是,networksetup -listnetworkserviceorder 才显示真实优先级顺序。你会看到类似:
(Hardware Port: Wi-Fi, Device: en0)<br>(Hardware Port: USB 10/100/1000 LAN, Device: en7)这个顺序决定了 DNS 查询、路由选择的先后。改错顺序,可能让本该走有线的流量偷偷走了 Wi-Fi。
开关指定网络服务(Wi-Fi / 以太网)
用 networksetup -setairportpower 控制 Wi-Fi 是最稳妥的,它调用系统底层接口,不会导致 en0 接口消失或 DHCP 租约异常。直接 ifconfig en0 down 看似快,但后续 up 时可能卡在 renew DHCP,甚至触发 Network Preferences 里的感叹号警告。
以太网服务不能用 “airport” 命令,得用通用开关:
• 关闭: networksetup -setnetworkserviceenabled "USB 10/100/1000 LAN" off
• 开启: networksetup -setnetworkserviceenabled "USB 10/100/1000 LAN" on
注意服务名必须完全匹配 -listallnetworkservices 输出,大小写、空格、标点一个都不能错。MacBook Pro 上常见服务名含 “Thunderbolt” 或 “AX88179A”,复制粘贴最安全。
- 服务名含空格时,命令里必须用英文双引号包裹
- 关闭后,对应设备(如
en7)的 IP 地址会立即清空,但接口本身仍存在 - 开启服务不自动重获 IP,需额外跑
ipconfig getifaddr en7确认是否已分配
修改 DNS 和搜索域(绕过 GUI 手动配置)
想让终端脚本自动切 DNS(比如开发时切到内部 DNS),别碰 scutil 或改 /etc/resolv.conf——macOS 12+ 已屏蔽后者,前者操作链太长易出错。正确姿势是用 networksetup 直接写入网络服务层:
networksetup -setdnsservers "Wi-Fi" 192.168.1.1 8.8.8.8
这条命令会覆盖整个服务的 DNS 列表,不是追加。如果只想清空,传 empty:networksetup -setdnsservers "Wi-Fi" empty
- DNS 修改后不会立即生效,需触发一次网络刷新:运行
networksetup -detectnewhardware或断开再连一次服务 - 搜索域用
networksetup -setsearchdomains "Wi-Fi" example.com internal.local,空格分隔,不支持通配符 - 若服务名含特殊字符(如括号),同样要加双引号,否则 shell 解析失败
设置代理(HTTP / HTTPS / FTP)及常见失效原因
代理配置最容易踩坑。设 HTTP 代理:networksetup -setwebproxy "Wi-Fi" 127.0.0.1 8888
设 HTTPS 代理(必须单独设):networksetup -setsecurewebproxy "Wi-Fi" 127.0.0.1 8888
但你会发现 Safari 或 curl 不走代理——因为默认没启用。必须补这句:networksetup -setwebproxystate "Wi-Fi" on
同理,HTTPS 代理也要:networksetup -setsecurewebproxystate "Wi-Fi" on
- 代理端口必须是数字,传字符串(如 "8888")会静默失败
- 关闭代理别只关 state,记得清空服务器:用
networksetup -setwebproxy "Wi-Fi" "" 0 - 某些企业环境会通过 MDM 锁定代理设置,此时命令执行成功但实际无效,检查
networksetup -getwebproxy "Wi-Fi"返回是否带 “Enabled: Yes”
networksetup 的每个操作都作用于「网络服务」而非物理接口,服务名拼错、大小写不对、空格遗漏,都会让命令看似成功实则无效果。最省事的验证方式是执行完立刻跟一句 networksetup -getinfo "服务名",看输出里的 IP、DNS、Proxy 是否已更新——别等跑完脚本才发现全白忙。

















