ntfy 如何用 CLI 订阅主题并为每条消息执行自定义命令
2026/9/13 9:07:22 网站建设 项目流程

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 publishntfy 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/ntfy

sudo 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 publishntfy 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 TOPIC

TOPIC是主题名。这样运行时,每条到达的消息都会打印出它的 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(别名pubsendtrigger)向同一主题发一条消息(文档示例):

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是过滤器,可按messagetitlepriority(逗号分隔列表,逻辑或)和tags(逗号分隔列表,逻辑与)过滤消息,例如上面的priority: high,urgent表示只有 high 或 urgent 优先级的消息才触发命令。

如果大部分(或全部)订阅使用相同凭据,可在client.yml中设置default-userdefault-passworddefault-token(二者不能同时设置);还可以设置default-command,当某个订阅没有提供命令时使用它作为默认命令。订阅自身的 user/password/token 或 command 会覆盖默认值。

文档在这里有一条明确警告:default-userdefault-passworddefault-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.ymlsubscribe配置块也支持在每个订阅项上单独指定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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询