在 macOS 中实现“进入某网段时自动挂载 NAS”的核心是利用 launchd 监听网络变化,通过 networksetup 和 ipconfig 获取当前 IP 与子网掩码并判断是否匹配目标网段,再触发 autofs 刷新挂载规则;需结合钥匙串安全读取凭证、加锁防重复挂载,并兼顾开机、唤醒及网络切换等场景。

在 macOS 中实现“进入某网段时自动挂载 NAS”,核心思路是监听网络变化,检测当前 IP 是否属于目标网段,再执行挂载命令。macOS 本身不提供网段触发机制,需借助系统事件(如网络接口状态变更)和脚本判断来模拟实现。关键在于可靠检测、安全挂载、避免重复,并兼顾开机/唤醒/网络切换等场景。
监听网络变化:用 networksetup 和 route 获取实时网段
macOS 没有类似 Linux 的 ifup/ifdown 钩子,但可通过监听 systemconfiguration 通知或轮询接口状态。更轻量、稳定的做法是利用 networksetup 结合 ipconfig 获取活跃接口的 IP 和子网掩码,再计算所属网段:
- 运行
networksetup -listallhardwareports找出当前活跃接口(如en0) - 用
ipconfig getifaddr en0获取 IP,ipconfig getnetmask en0获取掩码 - 用简单 shell 计算是否匹配目标网段(例如
192.168.5.0/24),可借助printf '%d' 0x$(printf '%02X' {1..4} | paste -sd'.')类方法做 IP 整数转换,或直接用 Python 一行判断(推荐,更可靠)
挂载 NAS:优先使用 autofs,脚本仅作兜底与触发
原生 autofs 是 macOS 官方支持的自动挂载方案,比纯脚本更健壮。建议主用 autofs 管理挂载点,脚本只负责“感知网段 → 启动/重启 autofs”:
- 配置
/etc/auto_master添加一行:/mnt/nas /etc/auto_nas -timeout=60 - 新建
/etc/auto_nas,写入:myshare -fstype=smbfs,soft,intr ://user:pass@nas.local/share - 脚本检测到目标网段后,执行
sudo automount -vc刷新规则,访问/mnt/nas/myshare即按需挂载 - 若必须用
mount_smbfs手动挂载,务必检查挂载点是否存在、是否已挂载,避免报错中断
触发时机:用 launchd 监听网络事件,而非轮询
轮询耗电且延迟高。macOS 推荐用 launchd 响应系统事件。虽然没有直接的“网段变更”事件,但可监听 com.apple.system.config.network_change(网络配置变更通知):
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 创建
~/Library/LaunchAgents/local.nas-auto-mount.plist - 在
WatchPaths或QueueDirectories不适用;改用StartOnMount+StartOnNetworkChange(macOS 12+ 支持) - 更通用做法:设
StartInterval为 30 秒,配合脚本内快速网段判断(毫秒级),实际影响极小 - 确保脚本有执行权限,且 launchd 能读取钥匙串凭据(如 SMB 密码需存入钥匙串并授权)
安全与容错:处理凭证、重复挂载和断网清理
自动挂载失败常因认证问题或路径冲突。需主动防御:
- SMB 用户名密码不要硬编码。用
security find-internet-password -s nas.local -w从钥匙串读取 - 挂载前加锁(
mkdir /tmp/.nas_mount_lock 2>/dev/null || exit),防止并发触发多次挂载 - 断开目标网段时,可选执行
umount -f /mnt/nas/myshare 2>/dev/null,但非必须 — autofs 默认超时自动卸载 - 首次运行建议手动测试挂载命令,确认
mount_smbfs或automount能成功,再交由脚本调用
不复杂但容易忽略。重点不是写多长的脚本,而是让判断快、挂载稳、触发准。用好 autofs + launchd + 钥匙串,就能做到“一进办公室 Wi-Fi,NAS 自动就位”。










