macos shortcuts 可通过调用 shell 脚本实现分层网络诊断:依次检测默认网关连通性、公共 dns 解析(绕过系统配置)、外网 https 可达性,并结构化输出结果;需赋予脚本执行权限并在系统隐私设置中授权 shortcuts 完全磁盘访问。

macOS Shortcuts 本身不支持直接执行底层网络诊断命令(如 ping、curl、nslookup),也无法获得系统级权限调用 networksetup 或读取路由表。但你可以通过 Shortcuts + 脚本桥接 的方式,实现“一键触发网络连通性检查”,并获得结构化反馈。关键在于:Shortcuts 负责触发与展示,真实检测逻辑交给 shell 脚本完成。
网络连通性检查必须分层验证
只 ping 一个地址极易误判。企业/办公场景下常见问题包括:
- DNS 解析失败(网页打不开,但
ping 8.8.8.8成功) - 网关可达但外网 HTTPS 被拦截(
curl -I https://baidu.com超时) - 代理或 iNode 安全模块干扰(进程存活但实际断连)
所以脚本需组合三项检测:
- ✅ 默认网关连通性(
route -n get default | awk '{print $2}'+ping -c 1 -W 1) - ✅ 公共 DNS 解析(
dig +short google.com @8.8.8.8) - ✅ 外网 HTTPS 可达(
curl -s --connect-timeout 3 -I https://www.php.cn/link/deee9fe5195586bf4545518a76aff2f7 -o /dev/null)
Shortcuts 如何调用并呈现结果
-
先准备一个可执行的诊断脚本(例如
/usr/local/bin/netcheck.sh):#!/bin/bash # 检查网关 gateway=$(route -n get default 2>/dev/null | awk '/gateway/ {print $2}') if [ -n "$gateway" ] && ping -c 1 -W 1 "$gateway" &>/dev/null; then gw="✅ 网关可达" else gw="❌ 网关不可达" fi
检查 DNS(绕过系统配置)
if dig +short google.com @8.8.8.8 >/dev/null 2>&1; then dns="✅ DNS 正常" else dns="❌ DNS 异常" fi
检查 HTTPS 连通性
if curl -s --connect-timeout 3 -I https://www.php.cn/link/deee9fe5195586bf4545518a76aff2f7 -o /dev/null 2>/dev/null; then web="✅ 外网可用" else web="❌ 外网不可达" fi
echo "$gw|$dns|$web"
赋予执行权限:`sudo chmod +x /usr/local/bin/netcheck.sh`
2. **在 Shortcuts 中新建自动化流程**:
- 添加动作:「运行脚本」→ 选择「Shell」→ 输入路径 `/usr/local/bin/netcheck.sh`
- 接着添加「文本」动作,把输出按 `|` 分割:
- 使用「分割文本」→ 分隔符设为 `|`
- 得到三个变量:`项目 1`(网关)、`项目 2`(DNS)、`项目 3`(外网)
- 最后用「显示通知」或「显示结果」汇总,例如:
`网络诊断结果:\n${项目 1}\n${项目 2}\n${项目 3}`
> ⚠️ 注意:首次运行时系统会弹出权限提示,需前往「系统设置 → 隐私与安全性 → 完全磁盘访问」中允许 Shortcuts。
### 适配 Sonoma 及后续系统的关键点
- 不要依赖 `airport` 命令(已移除),全部改用 `networksetup -getairportnetwork en0` 获取当前 WiFi 名称(如需扩展判断)
- 若需自动重连 WiFi,Shortcuts 无法直接执行 `networksetup -setairportpower`,但可调用另一个 shell 脚本完成,再由 Shortcuts 触发该脚本
- 所有脚本建议以 `/bin/zsh` 开头,并在 Shortcuts 中明确指定解释器(避免 Catalina 之后默认 zsh 与脚本兼容问题)
### 实用增强建议
- 在脚本末尾追加日志:`echo "$(date): $gw $dns $web" >> /var/log/netcheck.log`,便于回溯异常时间点
- 若用于 iNode 环境,可在检测失败后自动终止 `iNodeMon` 进程:`pkill -f "iNodeMon"`(需脚本有管理员权限)
- Shortcuts 可设置为「快捷指令中心」里的主屏小组件,一点即查,无需打开应用
不复杂但容易忽略。











