Hermes Agent führt bereits Shell-Befehle auf einer entfernten Kiste aus. Sein SSH-Terminal-Backend zeigt auf einen Host und führt jeden Befehl über ssh aus. Für einen einzelnen Server ist das in Ordnung. Sobald du mehr als einen hast oder keinen privaten Schlüssel auf der Maschine haben willst, die den Agenten betreibt, ist das Backend das falsche Werkzeug. Das sauberere Setup ist, Hermes mit einem entfernten MCP-Server zu verbinden, der deine Server für ihn erreicht – kein Schlüssel auf der Agent-Maschine, viele Hosts, Regeln pro Verbindung und ein Audit-Log. Dieser Beitrag behandelt beides: wie das SSH-Backend heute funktioniert und wie du stattdessen Termalin als MCP-Server verdrahtest.
Offenlegung: Wir bauen Termalin. Die Hermes-Agent-Details unten stammen aus den öffentlichen Docs und dem Issue-Tracker, geprüft am 15. Oktober 2026.
Wie Hermes Agent SSH heute nutzt
Hermes Agent führt seine Tools über ein Terminal-Backend aus. Eines dieser Backends ist SSH. Du stellst es in ~/.hermes/config.yaml ein:
terminal:
backend: ssh
Die Zugangsdaten kommen in ~/.hermes/.env:
TERMINAL_SSH_HOST=my-server.example.com
TERMINAL_SSH_USER=ubuntu
TERMINAL_SSH_PORT ist standardmäßig 22, und TERMINAL_SSH_KEY ist ein Pfad zu einem privaten Schlüssel (ohne Angabe wird der Systemstandard genutzt). Die Docs beschreiben den Mechanismus schlicht: Es „führt Befehle auf einem entfernten Server über SSH aus“, nutzt die Verbindung mit ControlMaster und einem 5-minütigen Idle-Keepalive wieder, und jeder Befehl ist ein frisches ssh … bash -c.
Drei Tatsachen folgen aus diesem Design, und sie sind der Grund, warum Leute sich nach etwas anderem umsehen:
- Ein Backend bedeutet ein Host.
TERMINAL_SSH_HOSTundTERMINAL_SSH_USERsind beide erforderlich, und das Backend hat keinen Bestand mehrerer Hosts. Für einen zweiten Server konfigurierst du neu. - Ein privater Schlüssel liegt auf der Hermes-Maschine, entweder als Datei oder über den
ssh-agentdes Systems. Alles, was diese Maschine lesen kann, kann den Schlüssel nutzen, und der Schlüssel öffnet jeden Host, der ihm vertraut. - Hermes kopiert seine eigenen Zugangsdaten auf die entfernte Kiste. Die Docs halten fest, dass Hermes bei den Backends SSH, Modal und Daytona deinen
~/.hermes/-Zustand – Zugangsdaten-Dateien, Skills, Cache – für die Sitzung in die entfernte Sandbox schiebt und am Ende geänderte Zustandsdateien zurücksynchronisiert.
Die Docs bringen ein faires Argument für das SSH-Backend: Weil der Agent auf einer anderen Kiste läuft, „kann er seinen eigenen Code nicht verändern“. Diese Isolation ist real, und wir kommen unten darauf zurück.
Die Probleme, auf die Leute stoßen
Der hermes-agent-Tracker hat ein erkennbares Bündel offener Issues rund um diese SSH-Pfade. Nach Nummer zitiert, ohne zu überhöhen, was jedes für dich bedeutet:
- Das SSH-Backend scheitert mit „path too long for Unix domain socket“, wenn du benannte Profile nutzt (#133436).
/reloadleert zwischengespeicherte SSH-Umgebungen nach einer Konfigurationsänderung nicht (#71085).- Der Desktop-SSH-Modus hat seine eigenen: eine macOS-Verbindungsprüfung, die rund eine Sekunde nach dem Start scheitert (#80836), sowie Hänger und Timeouts von Windows-OpenSSH (#118983, #138378, #127320).
- Ein Retry-Sturm beim Start von rund 25 SSH-Logins pro Minute (#134197).
hermes updatescheitert in Netzen, die Port 22 blockieren (#133439).
Einige davon betreffen eher die Desktop-App als das Backend, und manche sind vielleicht schon behoben, wenn du das liest. Worauf es ankommt, ist das Muster: Das SSH-Backend ist eine dünne Hülle um eine einzelne ssh-Verbindung, also erbt es jede scharfe Kante dieser Verbindung – inklusive der Anforderung, dass Port 22 erreichbar ist.
Eine schlüssellose Alternative: Termalin als entfernter MCP-Server
Hermes Agent unterstützt MCP. Es kann mit stdio-Servern und mit entfernten HTTP-Servern sprechen, entweder über einen Bearer-Header oder OAuth. Das ist die Gelegenheit. Statt dem Agenten einen Schlüssel und einen Host zu geben, richtest du ihn auf einen entfernten MCP-Server, der deine Flotte bereits zu erreichen weiß.
Termalin ist ein SSH-Client mit gehostetem MCP-Server. Jeder Server, den du erreichbar machen willst, betreibt einen Connector – eine Ein-Zeilen-Installation, die sich nach draußen wählt und nie auf einem Port lauscht, sodass sie hinter NAT und CGNAT funktioniert und Port 22 nicht offen sein muss. Beim Anbinden vertraut das sshd des Servers Termalins SSH-Zertifizierungsstelle. Jeder Login nutzt dann ein kurzlebiges Zertifikat, das auf dein Konto begrenzt ist. Kein langlebiger Schlüssel liegt auf der Kiste, und keiner wird an den Agenten gegeben.
MCP-Server stehen unter dem obersten mcp_servers-Eintrag in ~/.hermes/config.yaml. Es gibt zwei Wege zur Authentifizierung. Auf einem VPS – dem üblichen Ort, an dem Hermes läuft – ist der API-Schlüssel einfacher, fang also dort an.
Option A – API-Schlüssel (am besten auf einem VPS)
Erstell einen API-Schlüssel im Termalin-Web-Kabinett, grenz ihn auf die Server ein, die dieser Agent anfassen soll, setz ihn auf nur lesend oder auf eine Liste erlaubter Befehle und gib ihm ein Ablaufdatum. Leg ihn in ~/.hermes/.env:
TERMALIN_API_KEY=tk_live_your_key_here
Füg dann den Server hinzu. Hermes löst ${VAR}-Referenzen beim Verbinden zum Server auf, auch innerhalb von headers:
# ~/.hermes/config.yaml
mcp_servers:
termalin:
url: "https://termal.in/api/v1/mcp"
headers:
Authorization: "Bearer ${TERMALIN_API_KEY}"
Prüf die Verbindung und lade MCP dann in einer Sitzung neu:
hermes mcp test termalin
/reload-mcp
Streamable HTTP ist der Standard-Transport für url-Server, und genau das spricht termal.in, du brauchst also keine transport:-Zeile.
Option B – OAuth-Anmeldung (für einen Laptop)
Läuft Hermes auf deiner eigenen Maschine mit Browser, vermeidet OAuth das Speichern eines Schlüssels:
# ~/.hermes/config.yaml
mcp_servers:
termalin:
url: "https://termal.in/mcp"
auth: oauth
hermes mcp login termalin
Beim ersten Verbinden gibt Hermes eine Autorisierungs-URL aus, öffnet deinen Browser, wenn es kann, und wartet auf den OAuth-Callback auf einem lokalen Loopback-Port. Termalins Anmeldung akzeptiert diesen Loopback-Redirect (http://127.0.0.1:<port>/callback), auth: oauth funktioniert also auf unserer Seite.
Auf einem Headless-VPS kann der Loopback-Callback deinen Laptop nicht erreichen. Zwei Umwege funktionieren mit Termalin: Füg die Redirect-URL am Hermes-Prompt wieder ein, oder leite den Port mit ssh -N -L <port>:127.0.0.1:<port> user@host weiter und schließ die Anmeldung im Browser deines Laptops ab. Hermes hat auch einen Device-Code-Flow, aber Termalins Anmeldung bietet ihn nicht an – auf einem Server ist der API-Schlüssel in Option A der einfachere Weg.
Was du bekommst, sobald es verbunden ist
Nach hermes mcp test termalin (oder hermes mcp login termalin) und /reload-mcp erscheinen Termalins Tools für den Agenten: hosts_list, um zu sehen, welche Server es erreichen darf, ssh_exec und ssh_exec_many, um Befehle auf einem oder vielen auszuführen, sftp_list / sftp_read / sftp_write für Dateien, server_metrics und alerts_list für die Gesundheit und job_start / job_status / job_stop / job_list für Arbeit, die einen einzelnen Aufruf überdauert.
Die praktischen Unterschiede zum SSH-Backend:
- Viele Server auf einmal.
ssh_exec_manyführt denselben Befehl über eine Gruppe von Hosts aus. Es gibt kein Ein-Host-Limit und kein Neukonfigurieren, um die Kiste zu wechseln. - Regeln pro Verbindung. In der KI-Apps-Karte setzt du eine Befehlsrichtlinie für diese Verbindung: voller Zugriff, eine Liste erlaubter Befehle oder nur lesend. Fang mit nur lesend an, weite später aus.
- Ein Audit-Log. Jeder Befehl, den der Agent ausführt, ist als der des Agenten markiert, aufgezeichnet und im Live-Watch-Grid sichtbar. „Das hat der Agent getan“ ist ein Filter, keine Rekonstruktion. Siehe auditieren, was ein Agent tut (auf Englisch).
- Hintergrundjobs. Eine lange Migration oder ein Build läuft als Job, sodass eine langsame Aufgabe die Sitzung nicht blockiert oder in einen festen Timeout läuft.
- Kein offener Port. Der Connector wählt sich nach draußen, was auch die Problemklasse „Port 22 blockiert“ umgeht.
Zugriff zu widerrufen ist ein Schalter, keine Schlüsselrotation über jeden Host. Zur Begründung dieses Handels siehe warum du einem Agenten deinen SSH-Schlüssel nicht geben solltest und Blast Radius (beide auf Englisch).
Wann du stattdessen beim SSH-Backend bleibst
Das ist kein Fall, in dem eine Option jede Zeile gewinnt.
- Hast du genau eine Kiste, hältst ohnehin einen Schlüssel auf der Hermes-Maschine und willst nichts weiter dazwischen, ist das SSH-Backend am wenigsten aufzusetzen.
- Der Isolationspunkt der Docs gilt: Auf einem separaten Host zu laufen bedeutet, dass der Agent seinen eigenen Code nicht bearbeiten kann. Der MCP-Weg behält diese Eigenschaft ebenfalls, da Befehle auf deinen Servern ausgeführt werden, nicht auf der Agent-Maschine – aber wenn das SSH-Backend dir das schon gibt und mehr nicht nötig ist, gibt es keinen Grund zu wechseln.
- Termalins MCP- und Monitoring-Tools brauchen einen Pro-Tarif (10 $/Monat oder 8 $/Monat bei jährlicher Abrechnung – 96 $/Jahr) oder die 14-tägige Testphase und einen Connector auf jedem Server. Ein einzelner Schlüssel und das SSH-Backend kosten nichts.
Nimm Termalin, wenn du mehrere Server hast, wenn du keinen Schlüssel auf der Agent-Maschine willst, wenn die Server hinter NAT sitzen oder wenn du Regeln pro Verbindung und eine Audit-Spur brauchst. Bleib beim SSH-Backend, wenn ein Schlüssel auf einem Host wirklich alles ist, was du brauchst.
Fehlerbehebung
- Die Tools erscheinen nicht. Führ
hermes mcp test termalinaus, bestätige, dass dieurlstimmt undTERMALIN_API_KEYin~/.hermes/.envgesetzt ist. Dann/reload-mcpin der Sitzung. 401vom Endpoint. Der API-Schlüssel fehlt, ist falsch oder abgelaufen. Erstell im Kabinett einen neuen und aktualisiere~/.hermes/.env.- Die
${TERMALIN_API_KEY}-Referenz wird wörtlich gesendet. Hermes löst${VAR}beim Verbinden auf; stell sicher, dass die Variable in~/.hermes/.env(oder der Shell, die Hermes gestartet hat) steht, und verbinde neu. - OAuth auf einem Headless-VPS wird nie fertig. Der Loopback-Callback kann deinen Laptop nicht erreichen. Leite den Port mit
ssh -N -L <port>:127.0.0.1:<port> user@hostweiter, oder füg die Redirect-URL am Prompt wieder ein. Auf einem Server ist der API-Schlüssel-Weg einfacher. - Falscher Transport.
url-Server nutzen standardmäßig Streamable HTTP, wastermal.inverwendet. Setztransport: ssenur für Server, die ausschließlich SSE sprechen – nicht für diesen.
Häufige Fragen
Unterstützt Hermes Agent MCP? Ja. Es verbindet sich mit stdio-Servern und mit entfernten HTTP-Servern, über einen Bearer-Header oder OAuth, konfiguriert unter mcp_servers in ~/.hermes/config.yaml.
Kann ich das mit Hermes Agent auf einem VPS nutzen? Ja, und der API-Schlüssel-Weg ist dort der einfachste. Der OAuth-Flow braucht einen Browser oder einen der Headless-Umwege von oben.
Muss ich einen Port auf meinen Servern öffnen? Nein. Der Connector wählt sich nach draußen, funktioniert also hinter NAT und CGNAT ohne jeden eingehenden Port. Siehe SSH hinter NAT (auf Englisch).
Wird mein SSH-Schlüssel an den Agenten gegeben? Nein. Server werden mit kurzlebigen Zertifikaten erreicht, die pro Login ausgestellt werden. Kein langlebiger Schlüssel verlässt Termalin, und keiner wird in die Umgebung des Agenten gelegt.
Termalin ist ein plattformübergreifender SSH-Client mit gehostetem MCP-Server, einem Schlüsselverwahrer und einer Agenten-Richtlinie pro Host. Läuft bei dir ein anderer Agent? Dasselbe schlüssellose Setup funktioniert für OpenClaw, Codex (auf Englisch) und andere – oder lade die App herunter, um zu starten.