内容提要
作者利用Hammerspoon解决双Mac工作流中的两个痛点:一是通过监听5900端口动态控制Mac mini锁屏,屏幕共享时防止锁屏,断开后恢复锁定;二是实现SMB智能挂载,优先USB-C直连,回退Tailscale,并用AppleScript免密认证,静默预检避免弹窗,从而提升远程控制与数据共享体验。
延伸解读
锁屏策略的取舍
作者通过监听5900端口动态控制锁屏,解决了远程操作时频繁输密码与物理安全之间的矛盾。这种方案比单纯关闭锁屏更安全,也比设置超长闲置时间更灵活。但需注意,该逻辑依赖端口状态判断,若屏幕共享连接异常断开(如网络闪断),可能短暂保持防锁屏状态,直到下次检测。此外,若其他程序占用5900端口,可能误触发防锁屏。
SMB挂载的自动化细节
作者利用AppleScript的mount volume命令复用Apple ID凭据,避免了开启不安全的Windows文件共享,同时通过1秒端口预检防止系统弹窗和长时间阻塞。这种方案比传统mount_smbfs更安全且体验更好。但需注意,预检仅检测端口连通性,不保证SMB服务完全可用;且依赖Hammerspoon常驻运行,若未启动则无法自动挂载。
多通道切换的实用价值
优先USB-C直连、回退Tailscale的设计,充分利用了不同网络环境的带宽优势。通过hs.network.reachability监听网络状态,实现插线即挂载、断线自动切换,减少了手动操作。但需注意,Tailscale通道的带宽和稳定性取决于网络环境,且挂载路径可能因系统命名规则(如TiPlus-1)而略有不同,代码已做兼容处理。
Q&A
如何用 Hammerspoon 实现远程屏幕共享时防止 Mac 锁屏?
在 Mac mini 上运行 Hammerspoon,通过监听 5900 端口(屏幕共享的 VNC 端口)的连接状态。当检测到 ESTABLISHED 连接时,调用 hs.caffeinate.set("displayIdle", true, true) 阻止屏幕变暗和锁屏;当连接断开时,释放 displayIdle,恢复系统默认锁屏策略。代码中每 3 秒检测一次端口状态。
Hammerspoon 如何实现 SMB 多通道智能挂载,优先 USB-C 直连并回退 Tailscale?
在 MacBook Air 上运行 Hammerspoon,定义服务器列表 servers = {"169.254.169.99", "mini"},优先尝试 USB-C 直连 IP,若不通则回退到 Tailscale 主机名。挂载前先用 nc -z -w 1 检测 445 端口,若端口不通则静默跳过,避免弹窗和阻塞。通过 hs.osascript 调用 AppleScript 的 mount volume 命令进行挂载,并利用 hs.network.reachability 监听网络变化,自动触发挂载。
为什么作者选择用 Hammerspoon 而不是 Shell 脚本或 launchd 来解决问题?
作者认为用 Shell 脚本配 launchd 守护进程或安装多个常驻软件比较臃肿,而 Hammerspoon 是 macOS 系统的 Lua 胶水层,体积极小,能直接调用系统底层的电源管理、网络事件和 AppleScript 接口,用几十行 Lua 配置就能解决两个痛点,非常轻量方便。
在 SMB 挂载中,如何避免在脚本中硬编码密码并保持安全?
通过 hs.osascript 调用 AppleScript 的 mount volume 命令,利用两台 Mac 绑定的 Apple ID 凭据进行认证,无需在脚本中硬编码密码,也无需开启不安全的「Windows 文件共享」,从而保持最高安全级别。
Hammerspoon 如何避免 SMB 挂载时因网络不通导致的卡死和弹窗?
在发起挂载前,先用 nc -z -w 1 测试目标的 445 端口,如果网络不通,1 秒内静默跳过,彻底避免系统弹窗和数分钟的线程阻塞。
作者的双 Mac 工作流中,两台设备如何连接?
在工位时,两台 Mac 通过一条 40 Gbps 的高速 USB-C 线直连,建立高带宽的 Direct IP 连接;外出时,则通过 Tailscale 组网连接。
Hammerspoon 如何监听网络变化并自动触发 SMB 挂载?
通过 hs.network.reachability 监听每个服务器主机的可达性,当网络状态变为可达时,延迟 1 秒后自动调用挂载函数,实现插上网线或网络连通瞬间自动挂载。