ntfy 如何用 CLI 订阅主题并为每条消息执行自定义命令
【免费下载链接】ntfySend push notifications to your phone or desktop using PUT/POST项目地址: https://gitcode.com/GitHub_Trending/nt/ntfy
当你希望某条 ntfy 消息到达时,机器上能自动跑一段处理逻辑(弹桌面通知、执行脚本、记录日志),可以借助 ntfy CLI 完成。ntfy 的服务器端和客户端是同一个ntfy二进制,CLI 内置了ntfy subscribe命令,它有两种工作模式:ntfy subscribe TOPIC把每条到达的消息以 JSON 打印出来;ntfy subscribe TOPIC COMMAND则对每条消息执行一次 COMMAND,并把消息字段以环境变量形式传给该命令。本文覆盖安装 CLI、为每条消息挂载命令、用一条测试消息验证,以及如何同时订阅多个主题、以 systemd 服务常驻运行。
一、安装 ntfy CLI
适用环境:Linux(amd64、armv6、armv7、arm64)、macOS、Windows。注意 macOS 上只支持 CLI(ntfy publish和ntfy subscribe),不支持运行 ntfy 服务器。
主路径是 Linux 二进制包(以 amd64 为例,版本 v2.27.0,来自 安装文档):
wget https://github.com/binwiederhier/ntfy/releases/download/v2.27.0/ntfy_2.27.0_linux_amd64.tar.gz tar zxvf ntfy_2.27.0_linux_amd64.tar.gz sudo cp -a ntfy_2.27.0_linux_amd64/ntfy /usr/local/bin/ntfysudo cp会把二进制安装到/usr/local/bin/ntfy,只需前两条命令即可用于 CLI 订阅;安装文档中同一小节末尾的sudo ntfy serve是用于启动服务器,只使用 CLI 时不需要执行。
其他可选安装方式(详见 安装文档):
- Debian/Ubuntu 或 Fedora/RHEL 官方源/仓库安装(会同时部署服务器服务);
brew install ntfy,Homebrew 提供的仅是 CLI,支持 Linux 和 macOS;- Windows 下载 ZIP 或
scoop install ntfy。
二、客户端配置文件(可选)
安装后可选地创建客户端配置,位置因平台和用户而异:
- Linux 非 root 用户:
~/.config/ntfy/client.yml - Linux root 用户:
/etc/ntfy/client.yml - macOS 非 root 用户:
~/Library/Application Support/ntfy/client.yml - Windows:
%AppData%\ntfy\client.yml
仓库内的 配置骨架 带完整注释,可直接拷下来改。如果订阅的是 ntfy.sh 公共服务器,配置文件可以不改;如果自建了服务器,需要修改default-host,它用于展开ntfy publish和ntfy subscribe中的短主题名:
# Base URL used to expand short topic names in the "ntfy publish" and "ntfy subscribe" commands. default-host: https://ntfy.myhost.com其中https://ntfy.myhost.com是文档示例地址,替换为你自己服务器的实际地址。
三、订阅主题并执行命令
ntfy subscribe(别名sub)的调用方式决定行为:
1. 先以 JSON 流查看消息
ntfy subscribe TOPICTOPIC是主题名。这样运行时,每条到达的消息都会打印出它的 JSON 表示,适合后面接一个想流式读取 JSON 的命令。除非传了--poll,该命令会一直挂起不退出;加--poll则只查询最新消息后退出,可在脚本中使用。文档示例输出如下(文档示例):
$ ntfy sub mytopic {"id":"nZ8PjH5oox","time":1639971913,"event":"message","topic":"mytopic","message":"hi there"} {"id":"sekSLWTujn","time":1639972063,"event":"message","topic":"mytopic","priority":5,"message":"Oh no!"} ...2. 为每条消息执行一条自定义命令
ntfy subscribe TOPIC COMMAND这样运行时,每来一条消息就执行一次 COMMAND。文档给出的几个例子:
ntfy sub mytopic 'notify-send "$m"' ntfy sub topic1 /my/script.sh ntfy sub topic1 'echo "Message $m was received. Its title was $t and it had priority $p"'消息字段以环境变量传给命令,可在脚本里直接使用:
| 变量 | 别名 | 说明 |
|---|---|---|
$NTFY_ID | $id | 唯一消息 ID |
$NTFY_TIME | $time | 消息送达的 Unix 时间戳 |
$NTFY_TOPIC | $topic | 主题名 |
$NTFY_MESSAGE | $message、$m | 消息正文 |
$NTFY_TITLE | $title、$t | 消息标题 |
$NTFY_PRIORITY | $priority、$prio、$p | 消息优先级(1=最低,5=最高) |
$NTFY_TAGS | $tags、$tag、$ta | 消息标签(逗号分隔列表) |
$NTFY_RAW | $raw | 原始 JSON 消息 |
这些是环境变量,通常不需要过多担心引号问题——只要用双引号包住变量引用即可。
3. 验证:发一条测试消息
在另一个终端用ntfy publish(别名pub、send、trigger)向同一主题发一条消息(文档示例):
ntfy publish mytopic "This is a message"判断标准:JSON 模式下,订阅终端会多打印一行包含该消息内容的 JSON;命令模式下,COMMAND 会被执行一次,例如上面的echo例子会输出类似Message This is a message was received.的结果,notify-send "$m"则会弹出一条桌面通知。如果始终没有任何输出,先确认两端连的是同一个服务器(default-host是否一致)以及主题名是否相同。
四、同时订阅多个主题:--from-config
当需要一次订阅多个主题、且每个主题执行不同命令时,用配置模式:
ntfy subscribe --from-config该命令读取配置文件中的subscribe配置块。下面的例子改编自 配置骨架 中的注释示例:
default-host: https://ntfy.sh default-user: phill default-password: mypass subscribe: - topic: mytopic command: /usr/local/bin/mytopic-triggered.sh - topic: myserver.com/anothertopic command: 'echo "$message"' if: priority: high,urgent - topic: secret command: 'notify-send "$m"' user: phill password: mypass - topic: token_topic token: tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2各订阅项的含义:command是该主题收到的消息要执行的命令(可以是脚本路径,也可以是内联 shell 脚本,订阅文档 给出了一个多行内联脚本读取 CPU 温度并输出告警的完整例子);if是过滤器,可按message、title、priority(逗号分隔列表,逻辑或)和tags(逗号分隔列表,逻辑与)过滤消息,例如上面的priority: high,urgent表示只有 high 或 urgent 优先级的消息才触发命令。
如果大部分(或全部)订阅使用相同凭据,可在client.yml中设置default-user和default-password或default-token(二者不能同时设置);还可以设置default-command,当某个订阅没有提供命令时使用它作为默认命令。订阅自身的 user/password/token 或 command 会覆盖默认值。
文档在这里有一条明确警告:default-user、default-password和default-token会发送给每个没有自带凭据的主题(即使该主题不需要认证),所以要确保所订阅的服务器/主题使用 HTTPS,防止用户名密码泄露。
五、让订阅常驻:ntfy-client systemd 服务(可选)
如果希望订阅在开机或登录后自动运行,可以使用仓库内的ntfy-clientsystemd 服务,单位文件见 系统服务 和 用户服务。二者默认都不启用,需要手动启用。
系统服务以ntfy用户运行,开机启动。编辑/etc/ntfy/client.yml后以 root 执行:
sudo systemctl enable ntfy-client sudo systemctl restart ntfy-client系统服务受常规 Linux 权限限制,不能在你的 X 会话里以主用户身份执行命令(即无法调用notify-send弹桌面通知)。
用户服务在用户登录桌面环境时运行,能访问桌面环境(可执行notify-send)和用户主目录下的命令。编辑~/.config/ntfy/client.yml后执行(不加 sudo):
systemctl --user enable ntfy-client systemctl --user restart ntfy-client所以:需要桌面通知或依赖用户目录的脚本,选用户服务;只需静默执行命令(写日志、调脚本),系统服务即可。
六、订阅需要认证的主题(按需)
如果服务器启用了访问控制,部分主题的读/写受保护,只有持正确凭据的用户能订阅。此时用 Basic Auth:
ntfy subscribe \ -u phil:mypass \ ntfy.example.com/mysecrets-u后是username:password,主题名前面可带服务器主机以指向别的服务器。自建服务器场景下,文档特别提醒务必使用 HTTPS,避免被窃听暴露密码。也可以把凭据写进配置的单个订阅项里:
- topic: secret command: 'notify-send "$m"' user: phill password: mypass另外,client.yml的subscribe配置块也支持在每个订阅项上单独指定token,用于以访问令牌认证的主题。
七、边界与限制
- 不传
--poll时,ntfy subscribe会一直挂起;需要"取一次最新就退出"的脚本场景使用--poll。 - macOS 只有 CLI 可用,不能在上面运行 ntfy 服务器;服务器需要部署在 Linux 或 Windows 上。
- 系统服务(systemd system service)无法在用户的 X 会话中执行命令,需要桌面交互时改用用户服务。
- 设置默认凭据后,凭据会对所有未自带凭据的订阅生效,文档要求所订阅的服务器/主题使用 HTTPS。
- CLI 并不是收发消息的唯一方式:消息也可以用
curl直接发送(见 发布文档),订阅也可走 HTTP API;是否选 CLI 取决于使用场景。
【免费下载链接】ntfySend push notifications to your phone or desktop using PUT/POST项目地址: https://gitcode.com/GitHub_Trending/nt/ntfy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考