可在macos中通过监听ssid变化+networksetup命令+launchd定时脚本实现自动代理切换:先用airport获取当前ssid,匹配目标后调用networksetup设置http/https/socks代理,并需在隐私设置中授予终端完全磁盘访问权限。
在 macos 中实现“连接特定 wi-fi(ssid)时自动切换代理设置”,不能靠系统原生界面直接完成,但可通过监听网络变化 + 脚本 + 系统命令组合实现。核心思路是:检测当前 ssid 变化 → 匹配目标名称 → 调用 networksetup 修改对应服务的代理配置。
获取当前 SSID 并判断是否匹配目标
macOS 没有直接输出 SSID 的命令,需从 airport 工具提取:
- 路径通常为
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport - 执行:
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | awk '/ SSID:/ {print $2}' - 注意:空格、特殊字符(如中文 SSID)可能导致解析失败,建议用更稳健写法:
ssid=$(/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I 2>/dev/null | grep ' SSID:' | sed 's/^[[:space:]]*SSID:[[:space:]]*//')
用 networksetup 配置代理(支持 HTTP/HTTPS/SOCKS)
先确认你要控制的网络服务名(如 “Wi-Fi”、“Thunderbolt Bridge”):
- 列出所有服务:
networksetup -listallnetworkservices - 启用 HTTP 代理(端口 8080):
networksetup -setwebproxy "Wi-Fi" 127.0.0.1 8080 - 禁用 HTTP 代理:
networksetup -setwebproxystate "Wi-Fi" off - 同理可设 HTTPS(
-setsecurewebproxy)或 SOCKS(-setsocksfirewallproxy) - 若需绕过本地地址,加参数:
-setwebproxy "Wi-Fi" 127.0.0.1 8080 YES "127.0.0.1,localhost"
监听网络变更并触发脚本(推荐使用 launchd)
macOS 不提供实时 SSID 变更事件,但可通过轮询 + 状态缓存模拟。更可靠方式是监听网络接口状态变化(如 en0 上线),再查 SSID:
- 创建一个 shell 脚本(如
~/bin/proxy-switcher.sh),包含 SSID 判断与 proxy 设置逻辑 - 用
launchd定期运行(例如每 15 秒):
新建~/Library/LaunchAgents/local.proxy-switcher.plist,内容含:<key>StartInterval</key><integer>15</integer> - 确保脚本有执行权限:
chmod +x ~/bin/proxy-switcher.sh - 加载任务:
launchctl load ~/Library/LaunchAgents/local.proxy-switcher.plist
安全与权限注意事项
修改网络设置需管理员权限,networksetup 在较新 macOS(12+)中会弹出隐私授权提示:
- 首次运行前,需在「系统设置 → 隐私与安全性 → 完全磁盘访问」中添加终端或脚本所在 shell(如
zsh、bash或你的自动化工具) - 若用
launchd后台运行,建议用用户级 agent(放在~/Library/LaunchAgents/),避免 root 权限复杂化 - 脚本中避免硬编码密码;如需认证代理,考虑用钥匙串读取:
security find-generic-password -w -s "MyProxyAuth"
不复杂但容易忽略:每次修改后,Safari / Chrome 不会自动重载代理设置,需手动刷新或重启浏览器;部分应用(如 curl、git)走系统代理,部分(如 Electron 应用)可能读取自身配置,需单独适配。











