將腳本輸出管道傳輸至消息平臺
hermes send 是一個小巧、可腳本化的命令行工具(CLI),用於向 Hermes 已配置的任何消息平臺推送消息。你可以將其視為用於通知的跨平臺 curl——你無需運行網關,無需大型語言模型(LLM),也無需在每個腳本中重新粘貼機器人令牌。
適用場景包括:
- 系統監控(內存、磁盤、GPU 溫度、長時間運行的作業完成)
- CI/CD 通知(部署完成、測試失敗)
- 需要向你發送結果通知的 Cron 腳本
- 從終端快速發送一次性消息
- 將任何工具的輸出管道傳輸到任意位置(
make | hermes send --to slack:#builds)
該命令複用 hermes gateway 已使用的相同憑據和平臺適配器,因此無需維護第二套配置界面。
快速開始
# Plain text to the home channel for a platform
hermes send --to telegram "deploy finished"
# Pipe in stdout from anything
echo "RAM 92%" | hermes send --to telegram:-1001234567890
# Send a file
hermes send --to discord:#ops --file /tmp/report.md
# Attach a subject/header line
hermes send --to slack:#eng --subject "[CI] build.log" --file build.log
# Thread target (Telegram topic, Discord thread)
hermes send --to telegram:-1001234567890:17585 "threaded reply"
# List every configured target
hermes send --list
# Filter by platform
hermes send --list telegram
參數參考
| 標誌 | 描述 |
|---|---|
-t, --to TARGET | 目標。參見 目標格式。 |
message(位置參數) | 消息文本。省略此項以從 --file 或標準輸入讀取。 |
-f, --file PATH | 從文件讀取正文。--file - 強制使用標準輸入。 |
-s, --subject LINE | 在正文前 prepend 一個標題/主題行。 |
-l, --list | 列出可用目標。可選的位置參數平臺過濾器。 |
-q, --quiet | 成功時不輸出 stdout(僅返回退出碼——非常適合腳本)。 |
--json | 輸出發送操作的原始 JSON 結果。 |
-h, --help | 顯示內置幫助文本。 |
目標格式
| 格式 | 示例 | 含義 |
|---|---|---|
platform | telegram | 發送到平臺配置的默認頻道 |
platform:chat_id | telegram:-1001234567890 | 特定的數字聊天 ID / 群組 / 用戶 |
platform:chat_id:thread_id | telegram:-1001234567890:17585 | 特定的線程或 Telegram 論壇主題 |
platform:#channel | discord:#ops | 人類友好的頻道名稱(根據頻道目錄解析) |
platform:+E164 | signal:+15551234567 | 基於電話號碼尋址的平臺:Signal、SMS、WhatsApp |
Hermes 附帶適配器的任何平臺均可作為目標:
telegram、discord、slack、signal、sms、whatsapp、matrix、
mattermost、feishu、dingtalk、wecom、weixin、email 等。
退出碼
| 代碼 | 含義 |
|---|---|
0 | 發送(或列表)成功 |
1 | 平臺級交付失敗(認證、權限、網絡問題) |
2 | 用法 / 參數 / 配置錯誤 |
退出碼遵循標準的 Unix 約定,因此你的腳本可以像處理 curl 或 grep 一樣根據退出碼進行分支判斷。
消息正文解析
hermes send 按以下順序解析消息正文:
- 位置參數 —
hermes send --to telegram "hi" --file PATH—hermes send --to telegram --file msg.txt- 管道標準輸入 —
echo hi | hermes send --to telegram
當標準輸入是 TTY(無管道)時,Hermes 不會等待輸入——你會收到明確的用法錯誤提示。這可以防止腳本因意外遺漏正文而掛起。
實際示例
監控:內存 / 磁盤警報
用一行可移植的代碼替換看門狗腳本中臨時的 curl https://api.telegram.org/... 調用:
#!/usr/bin/env bash
ram_pct=$(free | awk '/^Mem:/ {printf "%d", $3 * 100 / $2}')
if [ "$ram_pct" -ge 85 ]; then
hermes send --to telegram --subject "⚠ MEMORY WARNING" \
"RAM ${ram_pct}% on $(hostname)"
fi
由於 hermes send 複用你的 Hermes 配置,同一腳本可在安裝了 Hermes 的任何主機上運行——無需手動將機器人令牌導出到每臺機器的環境變量中。
對於可能在網關本身陷入困境時觸發的看門狗(如 OOM 警報、磁盤滿警報),請繼續使用最小化的 curl 調用而非 hermes send。如果因為系統負載過高導致 Python 解釋器無法加載,你仍然希望該警報能夠發出。
CI / CD:構建和測試結果
# In .github/workflows/deploy.yml or any CI script
if ./scripts/deploy.sh; then
hermes send --to slack:#deploys "✅ ${CI_COMMIT_SHA:0:7} deployed"
else
tail -n 100 deploy.log | hermes send \
--to slack:#deploys --subject "❌ deploy failed"
exit 1
fi
Cron:每日報告
# Crontab entry
0 9 * * * /usr/local/bin/generate-metrics.sh \
| /home/me/.hermes/bin/hermes send \
--to telegram --subject "Daily metrics $(date +%Y-%m-%d)"
長時間運行的任務:完成後通知
./train.py --epochs 200 && \
hermes send --to telegram "training done" || \
hermes send --to telegram "training failed (exit $?)"
使用 --json 和 --quiet 進行腳本編寫
# Hard-fail a script if delivery fails; don't clutter logs on success
hermes send --to telegram --quiet "keepalive" || {
echo "Telegram delivery failed" >&2
exit 1
}
# Capture the message ID for later editing / threading
msg_id=$(hermes send --to discord:#ops --json "build started" \
| jq -r .message_id)
hermes send 是否需要運行網關?
通常不需要。 對於任何基於機器人令牌的平臺——Telegram、Discord、Slack、Signal、SMS、WhatsApp Cloud API 以及大多數其他平臺——hermes send 會使用來自 ~/.hermes/.env 和 ~/.hermes/config.yaml 的憑據直接調用平臺的 REST 端點。它是一個獨立的子進程,消息交付後立即退出。
僅對於依賴持久適配器連接的插件平臺(例如,保持長生命週期 WebSocket 連接的自定義插件),才需要活躍的網關。在這種情況下,你會收到指向網關的明確錯誤;請使用 hermes gateway start 啟動網關並重試。
列出和發現目標
在向特定頻道發送消息之前,你可以檢查可用的目標:
# Every target across every configured platform
hermes send --list
# Just Telegram targets
hermes send --list telegram
# Machine-readable
hermes send --list --json
列表源自 ~/.hermes/channel_directory.json網關運行時每隔幾分鐘刷新一次該文件。如果你看到“尚未發現任何頻道”,請啟動一次網關(hermes gateway start`),以便其填充緩存。
人性化名稱(discord:#ops、slack:#engineering)會在發送時對此緩存進行解析,因此你無需記住數字 ID。
與其他方法的比較
| 方法 | 多平臺支持 | 複用 Hermes 憑證 | 需要網關 | 最佳適用場景 |
|---|---|---|---|---|
hermes send | ✅ | ✅ | 否(bot-token) | 以下所有場景 |
向每個平臺發送原始 curl 請求 | 需分別編寫腳本 | 手動配置 | 否 | 關鍵監控任務 |
帶有 --deliver 的 cron 任務 | ✅ | ✅ | 否 | 定時代理任務 |
send_message 代理工具 | ✅ | ✅ | 否 | 在代理循環內部使用 |
hermes send 被有意設計為儘可能簡單的接口。如果你需要代理決定發送什麼內容,請在聊天或 cron 任務中使用 send_message 工具。如果你需要運行由 LLM 生成內容的定時任務,請使用 cronjob(action='create', prompt=...) 並設置 deliver='telegram:...'。如果你只需要管道傳輸原始字符串,請使用 hermes send。
相關資源
- 使用 Cron 自動化一切 — 輸出自動分發到任意平臺的定時任務。
- 網關內部機制 —
hermes send與 cron 分發共享的分發路由器。 - 消息平臺設置 — 每個平臺的一次性配置。