如何從手機連線到 Hermes agent?3 種安全方式
Hermes agent 執行於 VPS 時,可用 Tailscale 私有 mesh、具 TLS 與登入的 HTTPS 端點,或 SSH 從手機連線,並在手機遺失時撤銷存取權限。
讓手機連線到 Hermes agent 的 3 種方式
若要從手機連線到 Hermes agent,請使用其 Web 儀表板;真正需要決定的是儀表板前方採用什麼方式。第一種方式是私有 mesh network,讓儀表板只監聽 Tailscale 位址,且不讓任何埠對外連線。第二種方式是透過具備 TLS(傳輸層安全性)與登入機制的反向代理公開端點;此登入機制是保護伺服器終端機的唯一措施。第三種方式是使用終端機應用程式透過 SSH(secure shell)連線,設定最少,但會提供最多存取權限。
本指南承接 在自己的 VPS 上執行 Hermes agent 的內容。agent 已完成安裝,也能在命令列回應;現在你希望能從手機使用它。
以下命令以標籤 v2026.8.3 為基準。該版本發布於 3 August 2026,並在 release notes 中標示為 v0.20.0。Hermes 經常發布新版本,因此請將機器固定在某個標籤,而不要跟隨 main。安裝程式接受 commit:
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash -s -- --commit 3c27eb6234bf
hermes versionhermes version 會顯示實際安裝的內容。請先與標籤比對,再信任本頁中的任何 flag。
Repository 會發布哪些內容,以及不會發布哪些內容
Hermes repository 中沒有 iOS 或 Android app。原生 client 是 hermes desktop(別名為 hermes gui),這是一個適用於 macOS、Windows 和 Linux 的 Electron application。它可以連線到 remote agent,而不是 local agent:在 Settings 的 Gateway 下,將 remote URL 設為 http://<server-address>:9119;或在啟動前匯出 HERMES_DESKTOP_REMOTE_URL=http://<server-address>:9119。這可以解決第二台 laptop 的使用需求,但無法用於手機。
手機上使用的介面是 hermes dashboard,也就是 browser interface。它可管理設定、sessions、cron jobs、skills、logs 和 messaging platforms,並內嵌 terminal:server 會在 PTY(pseudo-terminal)後方啟動 hermes --tui,再將輸出串流到頁面。在窄螢幕上,session switcher 會折疊成滑出式面板,因此版面仍適合手機使用。
根據預設,dashboard 會監聽 127.0.0.1:9119,並在 server 本身開啟 browser tab。這對 headless VPS(virtual private server)沒有作用。請在不開啟 browser 的情況下啟動它,並查看 socket:
hermes dashboard --no-open
ss -lntp | grep 9119監聽 127.0.0.1:9119 的 listener 只能從 server 存取。監聽 0.0.0.0:9119 的 listener 則可從該機器連接的所有網路存取,包括公開網路。這一行會直接決定服務的暴露程度,因此請實際查看,不要自行假設。
選項 1:使用 Tailscale 建立私有 mesh
除非有特殊理由,否則請選擇此方案。Tailscale 是建構於 WireGuard 之上的 mesh VPN(虛擬私人網路)。每台加入的裝置都會取得穩定的位址,並與其他裝置直接通訊。手機也會加入同一個 mesh,因此 dashboard 完全不需要公開連接埠。
在伺服器上:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale ip -4在手機上安裝 Tailscale app,並使用相同帳戶登入。接著在伺服器上執行 tailscale status,即可依名稱列出手機。現在,將 dashboard 綁定至 tailscale ip -4 顯示的位址:
hermes dashboard --host 100.101.102.103 --port 9119 --no-open與其綁定至 0.0.0.0,不如綁定至 mesh 位址。如此一來,監聽 socket 只會存在於 Tailscale 介面上。掃描你的公開 IP 位址時,不會在 9119 找到任何服務,因為該連接埠沒有服務監聽。因此,防火牆不再是唯一的防護。再次執行 ss -lntp | grep 9119 予以確認。
綁定位址也會決定驗證方式,這是許多人忽略的部分。在 127.0.0.1 上,dashboard 沒有登入機制。在任何其他位址上,驗證閘門都是必要的;若未設定 provider,伺服器會拒絕啟動。專案將這種行為稱為 fail closed。第一次請以互動模式執行,系統會立即提供設定使用者名稱與密碼的選項。結果會寫入 ~/.hermes/.env:
HERMES_DASHBOARD_BASIC_AUTH_USERNAME=you
HERMES_DASHBOARD_BASIC_AUTH_PASSWORD_HASH=scrypt$16384$8$1$...
HERMES_DASHBOARD_BASIC_AUTH_SECRET=a-long-random-string使用 openssl rand -hex 32 產生該 secret,之後不要再修改。它會簽署 session cookie,因此修改後會使所有裝置登出。同一個檔案也存放 model API keys,請使用 chmod 600 ~/.hermes/.env 限制其存取權限。
在信任此設定前,先從 mesh 上的另一台機器檢查驗證閘門:
curl -s http://100.101.102.103:9119/api/status | jq '.auth_required, .auth_providers'true 後接 ["basic"] 表示驗證閘門已啟用,且由該 password provider 回應。專案自己的文件明確說明,該 provider 適用於受信任的網路或 VPN,不適合面向公開網際網路的 dashboard。在 mesh 中,你正是處於前述情境。
若要在 tailnet 內使用 HTTPS,請將連接埠交由 Tailscale 處理:
sudo tailscale serve --bg localhost:9119
sudo tailscale serve statusTailscale 會使用簽發給該機器 MagicDNS 名稱的憑證終止 TLS,瀏覽器因此不再顯示警告,session cookie 也會取得 Secure 旗標。請先在 Tailscale 管理主控台的 DNS 頁面啟用 MagicDNS 與 HTTPS Certificates,並在該處閱讀確認訊息:你的機器名稱與 tailnet DNS 名稱會發布至公開的 certificate transparency ledger,任何人都能讀取。
這個方案真正的成本在於 coordination server。手機與 VPS 之間的流量會採用端對端加密,且不會經過 Tailscale;但決定哪些裝置屬於 mesh 的帳戶並不位於你的硬體上。若這點很重要,請使用 Headscale,自架的 Tailscale control server 自行執行 control plane,再使用 tailscale up --login-server https://headscale.example.com 將用戶端指向該服務。若你想捨棄 mesh,改為手動設定 peers,請參閱 plain WireGuard 與 Tailscale 的比較,了解這樣會放棄哪些功能。
選項 2:公開 HTTPS 端點,以及其中的陷阱
有時無法使用 mesh。工作手機可能不允許安裝 VPN client。此時,請將儀表板置於反向代理後方。讓儀表板保持監聽 loopback,並讓 Caddy 管理憑證:
hermes.example.com {
reverse_proxy 127.0.0.1:9119
}Caddy 會自行取得並續期憑證,其 reverse_proxy 可在不需額外指令的情況下轉送 WebSocket upgrade,這是儀表板內嵌終端機所需的功能。使用 nginx 時,必須自行加入 Upgrade 和 Connection 標頭;在 nginx 上使用 Certbot 申請 Let’s Encrypt 憑證則涵蓋這項工作的 TLS 部分。告訴 Hermes 其公開名稱,讓登入回呼指向正確的主機:
dashboard:
public_url: "https://hermes.example.com"現在來看陷阱。驗證閘道是根據繫結位址判斷,而不是根據請求來源的位址判斷。若儀表板繫結至 127.0.0.1 並位於代理後方,它看到的會是 loopback,因而判定不需要登入,接著服務任何獲代理放行的使用者。請確認實際公開的內容:
curl -s https://hermes.example.com/api/status | jq '.auth_required'如果輸出為 false,表示只要一個 URL,網際網路上的使用者就能存取伺服器上的終端機。這不涉及任何 exploit,日誌中也不會出現警告。這裡有兩種修正方式,至少應採用其中一種。第一種是在代理中加入驗證,透過 forward auth 將 Authentik 作為自架單一登入提供者置於其前方;第二種是設定儀表板本身的 OIDC(OpenID Connect)提供者:
HERMES_DASHBOARD_OIDC_ISSUER=https://auth.example.com/application/o/hermes/
HERMES_DASHBOARD_OIDC_CLIENT_ID=hermes-dashboard
HERMES_DASHBOARD_OIDC_SCOPES="openid profile email"即使正確完成設定,此選項仍有無法降低的最低風險。公開登入頁面是任何人都能連線並發動攻擊的頁面,而其後方是 VPS 上的 shell。使用者名稱和密碼對此而言防護力有限,因此文件建議公開繫結時使用 OAuth 或 OIDC。請對登入進行速率限制,維持 ufw 僅允許 proxy ports 和 SSH,並封鎖其他所有連線,並定期查看存取日誌。
從行動終端機使用 SSH 與 mosh
這是最省力的方式:在手機上安裝終端機應用程式,將 SSH key 載入其中,然後使用 agent 自己的文字介面。
ssh you@vps.example.com
tmux new -A -s phone
hermes --tuitmux new -A -s phone會連線到名為 phone 的工作階段;如果該工作階段不存在,則建立新的工作階段。如此一來,即使連線中斷,agent 仍會繼續執行。下次連線時,也會回到相同位置。這與從手機操作 Claude Code使用相同模式。
在行動網路上使用純 SSH 並不方便,因為手機變更網路位址或進入睡眠時,連線就會中斷。mosh 可解決這個問題。它透過 UDP(user datagram protocol)運作,並同步終端機狀態,而不是同步位元組串流。因此,從 wifi 切換到行動網路時,工作階段仍可持續:
sudo apt install -y mosh
sudo ufw allow 60000:61000/udp在手機上執行 mosh you@vps.example.com。mosh 會透過現有的 SSH 登入啟動 mosh-server,接著將工作階段切換到 60000 到 61000 範圍內的 UDP,因此必須開放這個連接埠範圍。
安全性方面的代價很直接。SSH 工作階段就是 shell,而 shell 能執行該帳號具備權限的所有操作。此時,agent 的核准提示會成為遭竊且未鎖定的手機與檔案之間最後一道防線。請為此用途建立專用的非 root 帳號,僅使用 key 驗證,並在將 key 放到隨身攜帶的裝置前,先完成VPS 上的 SSH 強化。
行動網路上的限制
有 4 項,而且都不是能透過設定消除的錯誤。
您未查看時,儀表板會將您登出。 存取 token 的 TTL(存活時間)為 15 分鐘,且目前的 API contract 沒有 refresh token。token 過期後,頁面會收到 401 回應,並導回 /login。開啟儀表板後把手機放入口袋 20 分鐘,回來時會看到登入畫面,剛才輸入的內容也會遺失。這不是故障。重新登入即可。
內嵌終端機無法在背景分頁中持續運作。 伺服器會在 PTY 後方啟動 TUI(文字使用者介面),分頁關閉時會正常清理並回收該程序;重新開啟時則會建立新的程序。行動瀏覽器會為了回收記憶體而丟棄背景分頁,因此切換到其他 app 一段時間後,該終端機就會結束。聊天記錄仍然安全,因為工作階段儲存在伺服器上,且 hermes sessions list 仍會顯示這些工作階段。終端機本身無法重新連接。若需要能持續存在的工作階段,請透過 SSH 使用 tmux。
閒置連線會靜默中斷。 行動電信業者會丟棄閒置的 TCP 連線,以回收 NAT(網路位址轉換)表格項目;螢幕關閉後,手機也幾乎會完全停止處理網路活動。靜默一段時間的 WebSocket,在您解鎖手機時通常早已中斷,而頁面要等到您觸碰它後才會重新連線。這就是在手機上使用 mosh 比 SSH 更順暢的原因:mosh 原本就不依賴可能中斷的連線。
不會推送任何通知。 儀表板與 SSH 工作階段都無法喚醒手機。裝置上沒有 Hermes app,因此沒有通往平台推送服務的路徑。長時間執行的 agent 工作完成後,您要到下次查看時才會知道。
通知會透過訊息閘道送達
上一項問題的解法是使用閘道。這是完全不同的 agent 存取方式。hermes gateway 可將 agent 連接至 Telegram、Discord、Slack、WhatsApp、Signal 與 email 等訊息平台。之後,您可以直接在手機上已具備推播通道的應用程式中與 agent 對話。這些應用程式會處理背景傳遞,也能應對網路中斷。
hermes gateway setup
hermes gateway install
hermes gateway statushermes gateway install 會將閘道註冊為 systemd 服務,因此重新開機後會自動恢復。Hermes installer 不會替您建立任何服務 unit,因此 hermes dashboard 在重新啟動後不會自行恢復。請為您依賴的各個元件建立 unit;在 VPS 上建立 systemd 服務與 timer 說明了檔案本身的寫法。
排程工作也能以相同方式推送結果,不需要進行對話:
hermes send -t telegram -s "Backup report" -f /home/you/report.txt這裡的授權原則是預設拒絕。未設定 allowlist 且 GATEWAY_ALLOW_ALL_USERS 未設定時,所有使用者都會被拒絕,這是正確的起點。請在 ~/.hermes/.env 中指定允許的帳號:
TELEGRAM_ALLOWED_USERS=123456789
GATEWAY_ALLOWED_USERS=123456789您也可以在 ~/.hermes/config.yaml 中設定 unauthorized_dm_behavior: pair,改用以 code 為基礎的配對方式,不必貼上數字 ID。未知帳號向 agent 傳送訊息後,會收到 8 個字元的 code;在您核准前,不會發生其他動作:
hermes pairing list
hermes pairing approve telegram ABC12DEF
hermes pairing revoke telegram 123456789Code 會在 1 小時後過期。使用者每 10 分鐘可要求 1 組 code。失敗 5 次後,該帳號會被鎖定。
限制遭竊手機的影響範圍
能連線到你的 agent 的手機,就能在你的伺服器上執行命令,而手機可能遺失。現在就決定持有手機的人能執行哪些操作。
保持核准功能開啟。approvals.mode 預設為 smart,會要求輔助模型判斷風險,並只自動核准低風險命令。將其設為 off,等同於使用 --yolo 執行所有操作;HERMES_YOLO_MODE=1 則透過環境變數達成相同效果。不要讓能與 agent 通訊的手機處於這種狀態。設定 approvals.cron_mode: deny,讓排程工作無法在你睡覺時自行核准操作。
approvals:
mode: smart
cron_mode: deny縮小 agent 能夠破壞的範圍。terminal.backend: docker 會在容器中執行命令,移除 Linux capabilities,只保留一小組允許的項目,設定 no-new-privileges,並限制處理程序數量,讓容器成為隔離邊界,而不是依賴提示詞。terminal.cwd 固定工作目錄。HERMES_WRITE_SAFE_ROOT 將 write_file 與 patch 限制在你指定的目錄;對這些目錄以外的寫入會直接遭到阻擋,無法透過核准覆寫。
export HERMES_WRITE_SAFE_ROOT=/home/you/projects:/home/you/.hermesHermes 已經禁止寫入 ~/.ssh、~/.aws、~/.kube 與 /etc/sudoers,拒絕在磁碟任何位置寫入 .env 檔案,並且無論核准設定為何,都會拒絕一組明確列出的破壞性命令。將這些限制視為最低防線,而不是完整的安全方案。以一般使用者身分執行 agent,絕不要使用 root。相同原則也適用於任何無人看管、持續執行的 coding agent;在 VPS 上安全執行 Claude Code 會進一步說明這些做法。
接著,先寫下撤銷權限的步驟,避免需要時才開始尋找。從 Tailscale admin console 移除裝置後,mesh 存取權會立即中斷。變更 HERMES_DASHBOARD_BASIC_AUTH_SECRET 並重新啟動後,所有裝置上的 dashboard 工作階段都會失效,因為該值會簽署工作階段 cookie。從 ~/.ssh/authorized_keys 刪除手機的 public key 後,SSH 連線就會中止。hermes pairing revoke telegram <user-id> 會移除 messaging account。如果裝置上有任何能讀取 provider keys 的內容,請使用 hermes auth logout <provider> 撤銷這些金鑰,並在上游服務重新建立新的金鑰。
不要只是假設設定有效,應實際檢查結果。以下命令應在你自己的主機上執行,輸出內容會依你的設定而異:
tailscale status
hermes pairing list
hermes logs gateway -n 100
hermes status --deep日誌位於 ~/.hermes/logs/ 底下。發生事件後請讀取日誌;即使沒有發生事件,也應偶爾檢查。
FAQ
iOS 或 Android 是否有 Hermes 官方行動應用程式?
沒有。Hermes repository 提供 command line interface、web dashboard,以及適用於 macOS、Windows 和 Linux 的 Electron desktop client。Hermes 沒有第一方 iOS 或 Android build。使用手機時,您可以在瀏覽器中開啟 web dashboard、使用 SSH client,或透過 hermes gateway 連接 messaging platform。第三方 mobile client 確實存在,但這些是會持有您 agent 憑證的第三方程式碼,因此安裝前請先閱讀原始碼。
為什麼 Hermes dashboard 會在手機上將我登出?
Access token 的 TTL 為 15 分鐘,而目前的 API contract 沒有 refresh token。Token 過期後,頁面會收到 401,並導向 /login。在手機上將瀏覽器切換至背景會讓這個問題更加明顯,因為在其他應用程式中停留 20 分鐘就足以觸發。將 HERMES_DASHBOARD_BASIC_AUTH_SECRET 設為穩定的隨機值,讓 session signing key 在重新啟動後維持不變,即可排除第二個造成登出的原因。
是否能安全地將 Hermes dashboard 放到公開網際網路?
只有在您自行驗證過 authentication 的情況下才可以。Auth gate 會依 bind address 決定是否啟用,因此,若 dashboard 綁定至 127.0.0.1 並位於 reverse proxy 後方,就不會要求網際網路使用者登入。執行 curl -s https://your-host/api/status | jq '.auth_required',並讀取其輸出結果。請使用 OAuth 或 OIDC,不要使用 username 和 password,因為專案文件指出,password provider 僅適用於受信任的網路和 VPN。使用 private mesh 可以完全避開這個問題,因此是較佳的預設選擇。
是否需要 Tailscale 帳號,還是可以自行代管 control plane?
可以自行代管。Headscale 是 Tailscale coordination server 的開放實作,官方 Tailscale client 可透過 tailscale up --login-server https://headscale.example.com 連接至該伺服器。之後,允許加入 mesh 的裝置清單由您自行管理。代價是您必須執行並備份該伺服器;伺服器停止運作期間,您無法註冊裝置或重新驗證裝置。
Agent 完成工作時,如何在手機上收到通知?
請使用 messaging gateway。Dashboard 和 SSH 都無法喚醒手機,因為裝置上沒有 Hermes app 可接收 push。使用 hermes gateway setup 將 agent 連接至 Telegram、Signal、Discord 或其他支援的平台,再由該平台自己的 app 傳送通知。Cron job 也可以透過 hermes send -t telegram -s "Job done" -f /path/to/report.txt 傳送單則訊息;此方式不會呼叫 model。