applescript 通过调用 macos 命令行工具实现自动化网络诊断:检测活跃接口与ip、网关连通性、dns解析(使用8.8.8.8)、互联网可达性(ip+域名)及网络服务状态,并汇总为易读报告。
applescript 本身不能直接执行底层网络诊断(如 ping、traceroute、nslookup),但它可以调用 macos 内置命令行工具,并以自动化方式收集关键网络状态、判断连通性、定位常见故障点。以下是一个实用、可运行的 applescript 脚本,用于自动完成基础联网诊断:检测网络接口状态、网关连通性、dns 解析、互联网可达性,并汇总结果为易读提示。
核心诊断步骤与逻辑
脚本按顺序执行以下检查,任一环节失败即标记问题并继续后续诊断(不中断),最终给出综合结论:
- 确认当前有活跃的网络接口(如 en0、en1)且已获取 IP 地址
- 尝试 ping 默认网关(路由器),验证局域网通信是否正常
- 使用
dig +short google.com @8.8.8.8测试公共 DNS 解析能力(绕过系统 DNS 配置) - ping 公共域名(如 google.com)和 IP(如 8.8.8.8),区分是 DNS 问题还是路由/防火墙问题
- 检查 macOS 网络服务是否启用(通过
networksetup -listallnetworkservices和状态)
完整 AppleScript 代码(可直接保存为 .scpt 运行)
将以下内容复制到「脚本编辑器」(Script Editor),保存为应用程序或脚本文件,双击运行:
部署和使用军舰的 macOS Automator 自动化服务集合。包含 5 个实用工作流:PDF转JPG、PNG重命名并转JPG、图像拼接、解压RAR、顺序命名图像文件。一键安装所有服务到 ~/Library/Services/ 目录。使用场景:(1) "安装我的自动化服务",(2) "部署所有 Automato...
use framework "Foundation"
use sys: "sys:SystemEvents"
use scriptingAdditions
-- 获取当前时间戳 set now to (current date) as string
-- 辅助函数:执行 shell 命令并返回标准输出(忽略错误) on doShell(cmd) try return do shell script cmd on error return "" end try end doShell
-- 1. 检查活跃网络接口及 IP set ipInfo to doShell("ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null") if ipInfo is "" then set ipStatus to "❌ 未获取到 IPv4 地址(无活跃有线/无线连接)" else set ipStatus to "✅ 已获取 IP:" & ipInfo end if
-- 2. 获取默认网关 set gateway to doShell("netstat -nr | awk '/default/ {print $2; exit}' 2>/dev/null") if gateway is "" then set gwStatus to "⚠️ 无法获取默认网关(可能未配置路由)" else -- Ping 网关(超时 1 秒,仅 1 次) set gwPing to doShell("ping -c 1 -W 1 " & quoted form of gateway & " >/dev/null && echo ok || echo fail") if gwPing is "ok" then set gwStatus to "✅ 网关 " & gateway & " 可达" else set gwStatus to "❌ 网关 " & gateway & " 不可达(局域网异常)" end if end if
-- 3. DNS 解析测试(使用 8.8.8.8 强制解析 google.com) set dnsTest to doShell("dig +short google.com @8.8.8.8 +timeout=2 2>/dev/null | head -1") if dnsTest contains "." then set dnsStatus to "✅ 公共 DNS(8.8.8.8)可解析域名" else set dnsStatus to "❌ 公共 DNS 解析失败(DNS 或上游网络问题)" end if
-- 4. 连通性综合测试 set ipPing to doShell("ping -c 1 -W 1 8.8.8.8 >/dev/null && echo ok || echo fail") set domainPing to doShell("ping -c 1 -W 1 google.com >/dev/null && echo ok || echo fail")
if ipPing is "ok" and domainPing is "ok" then set netStatus to "✅ 可访问互联网(IP + 域名均通)" else if ipPing is "ok" and domainPing is "fail" then set netStatus to "⚠️ 可达互联网 IP,但域名无法解析(DNS 配置问题)" else if ipPing is "fail" and domainPing is "fail" then set netStatus to "❌ 无法访问互联网 IP(路由、防火墙或物理链路问题)" else set netStatus to "❓ 连通性状态异常(需人工核查)" end if
-- 5. 检查网络服务启用状态 set services to doShell("networksetup -listallnetworkservices | tail +2 | while read s; do echo "$s: $(networksetup -getinfo \"$s\" | grep 'Enabled' | cut -d' ' -f2)"; done 2>/dev/null") set serviceStatus to "ℹ️ 网络服务状态:" & return & services
-- 汇总结果 set report to "? macOS 自动联网诊断报告(" & now & ")" & return & return & ¬ "? IP 地址:" & ipStatus & return & ¬ "? 默认网关:" & gwStatus & return & ¬ "? DNS 解析:" & dnsStatus & return & ¬ "? 互联网连通性:" & netStatus & return & return & ¬ serviceStatus & return & return & ¬ "? 建议:" & return & ¬ "• 若‘网关不可达’:检查网线/WiFi、重启路由器" & return & ¬ "• 若‘DNS 解析失败’:在‘系统设置 > 网络 > 高级 > DNS’中添加 8.8.8.8" & return & ¬ "• 若‘IP 不可达’但网关正常:检查路由器 WAN 口或 ISP 状态"
-- 显示结果(也可改为写入文件:do shell script "echo " & quoted form of report & " > /tmp/network-diag.log") display alert "诊断完成" message report as critical
-- 可选:将报告保存到桌面 -- do shell script "echo " & quoted form of report & " > ~/Desktop/Network-Diag-" & (doShell("date +%Y%m%d-%H%M%S")) & ".txt"
增强实用性的小技巧
- 一键保存日志:取消脚本末尾注释掉的两行,每次运行自动生成带时间戳的诊断文本到桌面
-
静默后台运行:改用
display notification替代display alert,适合定时任务(如登录时自动检测) - 集成到快捷指令:在「快捷指令」App 中新建快捷指令 → 添加「运行 AppleScript」操作,粘贴上述代码,即可从菜单栏或 Spotlight 快速触发
- 适配 M1/M2/M3 Mac:脚本已兼容 Apple Silicon,无需 Rosetta;所有命令均为 macOS 原生命令,无需额外安装 Homebrew 工具
注意事项与局限性
该脚本聚焦「用户可感知的联网问题」,不替代专业网络分析工具(如 Wireshark)。它无法检测:
- Wi-Fi 信号强度或信道干扰(需
airport -I扩展) - HTTPS 证书错误或中间人拦截(属应用层)
- 特定端口屏蔽(如公司防火墙封 443)——需配合
nc -zv google.com 443 - IPv6 独立故障(当前默认只测 IPv4,如需扩展可添加
ipconfig getifaddr en0 | grep ':'判断)
实际使用中,90% 的家庭/办公网络异常(连不上网、打不开网页、WiFi 显示黄色感叹号)均可通过此脚本快速定位根源。不复杂但容易忽略。










