1. Mac系统消息自定义发送方案解析
在MacOS系统中,原生并没有提供直接发送系统级通知消息的功能,但通过组合系统自带工具和命令行技巧,我们可以实现类似Windows系统"msg *"命令的效果。这个需求常见于以下场景:
- 局域网内多台Mac设备间的简易通讯
- 自动化脚本执行完成后的状态提醒
- 需要引起用户立即注意的重要事件通知
实现原理主要依赖两个核心组件:
- AppleScript的消息弹窗能力
- Terminal命令行与osascript的桥接
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础实现方案
2.1 单次消息发送
最简单的实现方式是使用osascript执行AppleScript代码:
bash复制osascript -e 'display notification "您的存储空间即将用尽" with title "系统提醒"'
参数说明:
display notification:指定通知类型with title:设置通知标题(可选)- 第二个字符串参数是消息正文
2.2 带按钮交互的增强版
如果需要用户确认操作,可以使用dialog形式:
bash复制osascript -e 'display dialog "确定要执行清理操作吗?" buttons {"取消","确定"} default button "确定"'
执行后会返回button returned:确定或button returned:取消,可以通过管道传递给其他命令实现条件判断。
3. 高级应用技巧
3.1 定时发送消息
结合launchd实现定时提醒:
- 创建plist配置文件:
xml复制<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.reminder</string>
<key>ProgramArguments</key>
<array>
<string>osascript</string>
<string>-e</string>
<string>display notification "记得休息一下!" with title "健康提醒"</string>
</array>
<key>StartInterval</key>
<integer>3600</integer>
</dict>
</plist>
- 保存为
~/Library/LaunchAgents/com.user.reminder.plist - 加载配置:
bash复制launchctl load ~/Library/LaunchAgents/com.user.reminder.plist
3.2 网络消息广播
通过SSH实现局域网内多台Mac的消息广播:
bash复制#!/bin/bash
MESSAGE="服务器将于10分钟后维护"
for IP in 192.168.1.{100..120}; do
ssh username@$IP "osascript -e 'display notification \"$MESSAGE\" with title \"系统广播\"'" &
done
注意:需要提前配置好SSH免密登录
4. 图形化工具封装
4.1 使用Automator创建工作流
- 打开Automator → 新建"快速操作"
- 添加"运行AppleScript"动作
- 输入脚本内容:
applescript复制on run {input, parameters}
display dialog "自定义消息:" default answer "" buttons {"取消","发送"} default button "发送"
set userInput to text returned of result
display notification userInput with title "我的消息"
return input
end run
- 保存为"发送消息"
- 可通过Spotlight快速调用
4.2 第三方工具推荐
- Terminal-Notifier:
bash复制brew install terminal-notifier
terminal-notifier -title "提醒" -message "会议即将开始" -sound default
- SwiftDialog(需安装Homebrew):
bash复制brew install swiftdialog
dialog --title "确认" --message "是否继续安装?" --button1text "是" --button2text "否"
5. 实际应用案例
5.1 开发环境监控脚本
bash复制#!/bin/zsh
# 检查内存使用率
MEM_USED=$(vm_stat | grep "Pages active" | awk '{print $3}' | tr -d '.')
MEM_TOTAL=$(sysctl -n hw.memsize)
MEM_PERCENT=$(( ($MEM_USED * 4096) * 100 / $MEM_TOTAL ))
if [ $MEM_PERCENT -gt 80 ]; then
osascript -e "display notification \"内存使用率已达${MEM_PERCENT}%\" with title \"资源警报\" sound name \"Sosumi\""
fi
5.2 自动化构建通知
在CI/CD脚本中添加:
bash复制build_status=$?
if [ $build_status -eq 0 ]; then
terminal-notifier -title "构建成功" -message "最新版本已部署" -appIcon "path/to/icon.png"
else
terminal-notifier -title "构建失败" -message "请检查日志" -sound "Basso"
fi
6. 常见问题排查
-
通知不显示:
- 检查系统偏好设置 → 通知与焦点模式 → 确保终端/脚本编辑器有通知权限
- 尝试重启通知中心:
killall NotificationCenter
-
SSH远程执行报错:
bash复制# 在目标机器上执行: sudo systemsetup -setremotelogin on -
中文显示乱码:
- 确保脚本文件编码为UTF-8
- 在AppleScript中添加:
use scripting additions
-
通知声音不生效:
- 检查系统声音设置
- 确认使用的sound name有效(如
default、Basso、Glass等)
7. 安全注意事项
-
接收远程消息时应当验证发送者身份:
bash复制# 在~/.ssh/authorized_keys中添加限制: command="osascript -e 'display notification \"...\"'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-rsa AAAAB3N... -
敏感信息不应通过明文通知发送
-
定期审计自动化消息脚本的执行权限
-
避免过度使用系统通知影响用户体验
通过组合这些技术,我们可以构建出既满足功能需求又兼顾系统安全的自定义消息方案。在实际项目中,我通常会根据接收者的技术能力选择适当的实现方式——对普通用户使用图形化工具,对技术人员则提供命令行接口。
