手機連線 Hermes agent 的 3 種方式
Hermes agent 執行於 VPS 時,可透過 Tailscale 私有網路、公開 HTTPS 端點或 SSH 從手機存取,並在手機遺失時撤銷權限。
從手機連線至 Hermes agent 的 3 種方式
若要從手機連線至 Hermes agent,請使用其 Web 儀表板。真正需要決定的是由什麼元件放在儀表板前方。第一種方式是私有 mesh network,讓儀表板只監聽 Tailscale 位址,不讓任何連接埠直接面向網際網路。第二種方式是使用具備 TLS(傳輸層安全性)與登入機制的反向代理公開端點。此時,該登入機制是保護伺服器終端機的唯一措施。第三種方式是透過終端機應用程式使用 SSH(安全殼層)。這種方式設定最少,但會提供最多存取權限。
本指南承接在自己的 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 應用程式。原生用戶端是 hermes desktop(別名為 hermes gui),這是一個適用於 macOS、Windows 和 Linux 的 Electron 應用程式。它可以連線至遠端 agent,而不是本機 agent:在 Settings 的 Gateway 中,將遠端 URL 設為 http://<server-address>:9119;或在啟動前匯出 HERMES_DESKTOP_REMOTE_URL=http://<server-address>:9119。這能解決第二台筆電的使用需求,但無法支援手機。
手機使用的介面是 hermes dashboard,也就是瀏覽器介面。它可管理設定、工作階段、cron jobs、skills、日誌和訊息平台,並內建終端機:伺服器會在 PTY(pseudo-terminal)後方啟動 hermes --tui,再將輸出串流至頁面。窄螢幕上,工作階段切換器會折疊成滑出面板,因此版面仍適合手機使用。
預設情況下,儀表板會監聽 127.0.0.1:9119,並在伺服器本身開啟瀏覽器分頁。這對無頭 VPS(virtual private server)沒有幫助。請停用瀏覽器啟動功能,再查看 socket:
hermes dashboard --no-open
ss -lntp | grep 9119監聽 127.0.0.1:9119 時,只能從伺服器連線。監聽 0.0.0.0:9119 時,凡是該機器連接的網路都能連線,包括公用網路。這一行會決定服務的暴露程度,因此請直接查看,不要自行假設。
選項 1:使用 Tailscale 建立私有網狀網路
除非有特殊原因,否則請選擇此方案。Tailscale 是建構在 WireGuard 上的網狀 VPN(虛擬私人網路)。每台註冊的裝置都會取得固定位址,並直接與其他裝置通訊。手機也會加入同一個網狀網路,因此儀表板完全不需要公開連接埠。
在伺服器上:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale ip -4在手機上安裝 Tailscale 應用程式,並使用相同的帳戶登入。接著在伺服器上執行 tailscale status,即可依名稱列出手機。現在,將儀表板繫結至 tailscale ip -4 顯示的位址:
hermes dashboard --host 100.101.102.103 --port 9119 --no-open繫結至網狀網路位址,而不是 0.0.0.0,表示監聽 socket 只存在於 Tailscale 介面上。掃描公開 IP 位址時,因為沒有任何程式在 9119 上監聽,所以不會發現任何服務。此時防火牆不再是唯一的防護措施。再次使用 ss -lntp | grep 9119 確認。
繫結位址也會決定驗證方式,這正是許多人忽略的部分。在 127.0.0.1 上,儀表板沒有登入機制。使用其他任何位址時,都必須啟用驗證閘門;如果未設定 provider,伺服器會拒絕啟動。專案將這種行為稱為失敗關閉。第一次以互動方式執行時,程式會立即要求設定使用者名稱與密碼,並將其儲存為 dashboard.basic_auth,位置在 ~/.hermes/config.yaml。您也可以改用 ~/.hermes/.env 設定相同的 provider,專案自己的實作範例就是這樣做的:
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,之後不要再修改。它會簽署工作階段 cookie,因此修改後會讓所有裝置登出。同一個檔案也存放模型 API 金鑰,請使用 chmod 600 ~/.hermes/.env 保護其私密性。
在信任驗證機制前,先從網狀網路上的另一台機器檢查閘門:
curl -s http://100.101.102.103:9119/api/status | jq '.auth_required, .auth_providers'true 後接 ["basic"] 表示閘門已啟用,且由該 password provider 負責回應。專案自己的文件明確說明,這個 provider 適用於受信任的網路或 VPN,不適合面向公開網際網路的儀表板。在網狀網路中,您正是處於前述情境。
若要在 tailnet 內使用 HTTPS,請將連接埠交給 Tailscale:
sudo tailscale serve --bg localhost:9119
sudo tailscale serve statusTailscale 會使用針對該機器 MagicDNS 名稱簽發的憑證終止 TLS,因此瀏覽器不再顯示警告,工作階段 cookie 也會取得 Secure 旗標。請先在 Tailscale 管理主控台的 DNS 頁面啟用 MagicDNS 與 HTTPS Certificates,並在此查看相關確認訊息:您的機器名稱與 tailnet DNS 名稱會發布至公開的 certificate transparency 登錄,任何人都能讀取。
這個方案的實際代價是協調伺服器。手機與 VPS 之間的流量會進行端對端加密,不會經過 Tailscale;但決定哪些裝置屬於網狀網路的帳戶並不位於您的硬體上。如果這點很重要,請使用 Headscale,自架的 Tailscale 控制伺服器 自行執行 control plane,並使用 tailscale up --login-server https://headscale.example.com 將用戶端指向該伺服器。如果您想放棄網狀網路,改為手動設定對等端,請參閱 純 WireGuard 與 Tailscale 的比較,瞭解必須放棄哪些功能。
選項 2:公開 HTTPS 端點,以及其中的陷阱
有時無法使用 mesh。工作手機可能不允許安裝 VPN client。此時可將 dashboard 放在 reverse proxy 後方。讓 dashboard 維持在 loopback 上,並由 Caddy 管理憑證:
hermes.example.com {
reverse_proxy 127.0.0.1:9119
}Caddy 會自行取得並續期憑證,其 reverse_proxy 可直接轉送 WebSocket 升級請求,無須額外指令;dashboard 的內嵌終端機需要這項功能。使用 nginx 時,必須自行加入 Upgrade 和 Connection 標頭,而 在 nginx 上使用 Certbot 發行 Let's Encrypt 憑證涵蓋這項工作的 TLS 部分。告訴 Hermes 其公開名稱,讓登入回呼指向正確的主機:
dashboard:
public_url: "https://hermes.example.com"現在來看陷阱。驗證閘道是根據繫結位址判斷,而不是根據請求來源的位址判斷。dashboard 若繫結至 127.0.0.1 並位於 proxy 後方,看到的會是 loopback,因而判定不需要登入,讓 proxy 放行的任何人都能存取。檢查實際公開的內容:
curl -s https://hermes.example.com/api/status | jq '.auth_required'如果輸出 false,表示只要一個 URL,網際網路上的使用者就能連到伺服器上的終端機。不需要利用漏洞,日誌中也不會出現任何警告。有兩種修正方式,至少應採用其中一種。你可以在 proxy 中加入驗證,透過 forward auth 在前方使用 Authentik 作為自架單一登入服務提供者;或者設定 dashboard 自己的 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 埠和 SSH,對其他連線全部關閉,並偶爾查看存取日誌。
選項 3:從行動終端機使用 SSH 與 mosh
這是最省力的方式:在手機上安裝終端機應用程式,將 SSH 金鑰載入其中,然後使用 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)運作,並同步終端機狀態,而不是傳送位元組串流。因此,從 Wi-Fi 切換到行動網路時,工作階段仍可持續:
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 帳號,僅使用金鑰驗證;在將金鑰放入隨身攜帶的裝置前,先完成強化 VPS 上的 SSH。
行動網路會造成什麼問題
會有 4 種,而且都不是能靠設定排除的錯誤。
儀表板會在你未注意時將你登出。 實際時間取決於登入提供者。使用者名稱與密碼提供者預設會核發持續 12 小時的工作階段,由 session_ttl_seconds 在 dashboard.basic_auth 下設定。Nous Portal OAuth 提供者會核發 TTL(存留時間)為 15 分鐘的存取權杖,目前的 API 契約沒有 refresh token。權杖過期後,頁面會收到 401 回應,並導回 /login。使用 15 分鐘的權杖時,開啟儀表板,將手機放入口袋 20 分鐘,回來時會看到登入畫面,而且原本輸入的內容已遺失。這不是故障。重新登入即可。
嵌入式終端機無法在背景分頁中持續執行。 伺服器會在 PTY 後方啟動 TUI(文字使用者介面),並在分頁關閉時正常回收;重新開啟分頁時,則會啟動新的終端機。行動瀏覽器會捨棄背景分頁以回收記憶體,因此切換到其他應用程式一段時間後,該終端機就會結束。聊天記錄是安全的,因為工作階段儲存在伺服器上,而 hermes sessions list 仍會顯示這些記錄。終端機本身無法重新連線。如果需要能持續存在的工作階段,請透過 SSH 使用 tmux。
閒置連線會無聲中斷。 行動電信業者會捨棄閒置的 TCP 連線,以回收 NAT(網路位址轉譯)表格項目;螢幕關閉後,手機也幾乎會停止處理網路活動。閒置一段時間的 WebSocket 通常在你解鎖手機時早已中斷,頁面要等你觸碰後才會重新連線。這就是為什麼在手機上使用 mosh 比 SSH 更順暢:mosh 原本就沒有需要維持的連線。
不會推送任何通知。 儀表板和 SSH 工作階段都無法喚醒手機。裝置上沒有 Hermes 應用程式,因此沒有通往平台推送服務的路徑。長時間執行的代理程式完成後,你要到下次查看時才會知道。
通知會透過訊息閘道送達
最後一項問題的解法是使用閘道。這是完全不同的代理程式連線方式。hermes gateway可將代理程式連接到 Telegram、Discord、Slack、WhatsApp、Signal 和電子郵件等訊息平台。接著,您可以在手機上已具備推播通道的應用程式中與代理程式交談。這些應用程式會處理背景傳送,也能應對網路中斷。
hermes gateway setup
hermes gateway install
hermes gateway statushermes gateway install會將閘道註冊為 systemd 服務,因此重新開機後會恢復執行。安裝程式的閘道階段可以代為執行這個步驟,但安裝程式不會為 hermes dashboard建立 unit,因此重新啟動後 dashboard 不會自行恢復。請為您依賴的元件建立 unit;在 VPS 上建立 systemd 服務與計時器說明了檔案本身的寫法。
排程工作也可以用相同方式推送結果,不需要進行對話:
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您也可以使用以程式碼為基礎的配對方式,不必貼上數字 ID。這是聊天式 DM 平台的預設方式,也可以在 ~/.hermes/config.yaml中透過 unauthorized_dm_behavior: pair明確設定。未知帳戶傳送訊息給代理程式時,會收到 8 個字元的程式碼。在您核准前,不會發生其他動作:
hermes pairing list
hermes pairing approve telegram ABC12DEF
hermes pairing revoke telegram 123456789程式碼會在 1 小時後到期。使用者每 10 分鐘可以要求 1 次。失敗 5 次後,該帳戶會遭到鎖定。
降低手機遭竊後的影響範圍
能連線到代理程式的手機,就能在伺服器上執行命令,而手機可能遺失。現在就決定持有手機的人能執行哪些操作。
請保持核准機制開啟。approvals.mode 預設為 smart,會要求輔助模型判斷風險,並只自動核准低風險命令。將其設為 off,等同於使用 --yolo 執行所有操作;HERMES_YOLO_MODE=1 則透過環境變數達成相同效果。不要讓能與代理程式通訊的手機處於這種狀態。設定 approvals.cron_mode: deny,讓排程工作無法在你睡覺時自行核准操作。
approvals:
mode: smart
cron_mode: deny縮小代理程式可造成破壞的範圍。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 的寫入,也封鎖對自身 secret store(例如 ~/.hermes/.env)的寫入。磁碟其他位置的專案 .env 檔案會被封鎖讀取,但仍可寫入。無論核准設定為何,它也會拒絕一份固定的破壞性命令清單。請將這些視為最低限度的防護,而不是完整方案。請以一般使用者身分執行代理程式,絕不要使用 root。相同原則也適用於任何無人看管而持續執行的 coding agent;在 VPS 上安全執行 Claude Code 會更詳細說明這項做法。
接著,請在需要之前先記下撤銷權限的步驟。從 Tailscale 管理主控台移除裝置後,mesh 存取權會立即中斷。變更 HERMES_DASHBOARD_BASIC_AUTH_SECRET 並重新啟動後,所有裝置上的 dashboard 工作階段都會失效,因為該值會簽署工作階段 cookie。從 ~/.ssh/authorized_keys 刪除手機的公開金鑰即可終止 SSH。hermes pairing revoke telegram <user-id> 會移除 messaging account。若裝置上存有任何可讀取 provider key 的資料,請使用 hermes auth logout <provider> 撤銷這些 key,並在上游重新簽發。
請實際檢查結果,不要只是假設設定有效。以下命令應在你自己的伺服器上執行;輸出內容取決於你的環境:
tailscale status
hermes pairing list
hermes logs gateway -n 100
hermes status --deep日誌位於 ~/.hermes/logs/。發生事件後請讀取日誌;沒有事件時,也應偶爾讀取。
FAQ
Hermes 是否有適用於 iOS 或 Android 的官方行動應用程式?
沒有。Hermes 儲存庫提供命令列介面、Web 儀表板,以及適用於 macOS、Windows 和 Linux 的 Electron 桌面用戶端。Hermes 沒有官方的 iOS 或 Android 建置版本。使用手機時,您可以在瀏覽器中開啟 Web 儀表板、使用 SSH 用戶端,或透過 hermes gateway 連接的訊息平台操作。市面上確實有第三方行動用戶端,但這些是會持有您代理程式憑證的第三方程式碼,安裝前請先閱讀原始碼。
為什麼 Hermes 儀表板會在手機上將我登出?
這取決於登入提供者。Nous Portal OAuth 提供者核發 TTL 為 15 分鐘的存取權杖,而目前的 API 契約沒有更新權杖。因此權杖過期時,頁面會收到 401,並導向 /login。在手機上將瀏覽器切換到背景會讓這個問題更加明顯,因為只要在其他應用程式中停留 20 分鐘,就足以觸發這種情況。使用者名稱與密碼提供者預設使用 12 小時的工作階段,這項設定由 session_ttl_seconds 指定。使用此提供者時,請將 HERMES_DASHBOARD_BASIC_AUTH_SECRET 設為穩定的隨機值,讓工作階段簽署金鑰在重新啟動後維持不變,這樣也能排除另一個導致登出的原因。
可以安全地將 Hermes 儀表板放到公開網際網路嗎?
只有在您已自行驗證驗證機制後才可以。驗證閘門會依繫結位址啟用,因此繫結至 127.0.0.1 且位於反向代理後方的儀表板,不會要求來自網際網路的登入。執行 curl -s https://your-host/api/status | jq '.auth_required',並查看輸出結果。請使用 OAuth 或 OIDC,而不要使用使用者名稱與密碼,因為專案文件指出,密碼提供者適用於受信任的網路與 VPN。使用私有 mesh 可以完全避開這個問題,因此通常是較好的預設選擇。
需要 Tailscale 帳戶嗎?還是可以自行代管控制平面?
可以自行代管。Headscale 是 Tailscale 協調伺服器的開放實作,而官方 Tailscale 用戶端可透過 tailscale up --login-server https://headscale.example.com 連線至該伺服器。之後,允許加入 mesh 的裝置清單由您自行管理。代價是您必須自行執行並備份該伺服器;伺服器停止運作期間,您無法註冊裝置或重新驗證裝置。
代理程式完成工作時,如何在手機上收到通知?
請使用訊息閘道。儀表板與 SSH 都無法喚醒手機,因為裝置上沒有 Hermes 應用程式可接收推播通知。請透過 hermes gateway setup 將代理程式連接至 Telegram、Signal、Discord 或其他支援的平台,再由該平台自己的應用程式傳送通知。cron 工作也可以使用 hermes send -t telegram -s "Job done" -f /path/to/report.txt 傳送單則訊息,而且不會呼叫模型。