Hermes Agent는 이미 원격 상자에서 셸 명령을 실행합니다. SSH 터미널 백엔드는 호스트 하나를 가리키고 각 명령을 ssh로 실행합니다. 서버 한 대라면 괜찮습니다. 둘 이상이 되거나, 에이전트를 돌리는 머신에 개인 키가 놓이는 것이 싫어지는 순간, 그 백엔드는 맞지 않는 도구입니다. 더 깔끔한 구성은 Hermes를 대신 서버에 닿아 주는 원격 MCP 서버에 연결하는 것입니다 — 에이전트 상자에 키 없이, 여러 호스트, 연결별 규칙, 그리고 감사 로그와 함께요. 이 글은 둘 다 다룹니다. SSH 백엔드가 오늘날 어떻게 동작하는지, 그리고 대신 Termalin을 MCP 서버로 어떻게 엮는지입니다.
밝혀 둡니다: 저희는 Termalin을 만듭니다. 아래 Hermes Agent 세부 내용은 2026년 10월 15일에 확인한 공개 문서와 이슈 트래커에서 가져온 것입니다.
Hermes Agent가 오늘날 SSH를 쓰는 방식
Hermes Agent는 도구를 터미널 백엔드를 통해 실행합니다. 그 백엔드 중 하나가 SSH입니다. ~/.hermes/config.yaml에서 설정합니다:
terminal:
backend: ssh
자격 증명은 ~/.hermes/.env에 들어갑니다:
TERMINAL_SSH_HOST=my-server.example.com
TERMINAL_SSH_USER=ubuntu
TERMINAL_SSH_PORT은 기본값이 22이고, TERMINAL_SSH_KEY는 개인 키 경로입니다(비워 두면 시스템 기본값을 씁니다). 문서는 그 작동을 담백하게 설명합니다. ‘원격 서버에서 SSH로 명령을 실행하고’, ControlMaster와 5분 유휴 keepalive로 연결을 재사용하며, 각 명령은 새로운 ssh … bash -c입니다.
그 설계에서 세 가지 사실이 따라 나오고, 사람들이 다른 것을 찾아 나서는 이유가 바로 그것들입니다:
- 백엔드 하나는 호스트 하나를 뜻합니다.
TERMINAL_SSH_HOST과TERMINAL_SSH_USER가 둘 다 필수이고, 백엔드에는 멀티 호스트 인벤토리가 없습니다. 두 번째 서버를 다루려면 다시 설정해야 합니다. - 개인 키가 Hermes 머신에 삽니다 — 파일로든, 시스템
ssh-agent를 통해서든요. 그 머신을 읽을 수 있는 무엇이든 그 키를 쓸 수 있고, 키는 그것을 신뢰하는 모든 호스트를 엽니다. - Hermes는 자기 자격 증명을 원격 상자로 복사합니다. 문서에 따르면 SSH·Modal·Daytona 백엔드에서는 Hermes가 세션 동안
~/.hermes/상태 — 자격 증명 파일, 스킬, 캐시 — 를 원격 샌드박스로 밀어 넣고, 종료 시 변경된 상태 파일을 다시 동기화합니다.
문서는 SSH 백엔드를 위한 타당한 논거도 내놓습니다. 에이전트가 다른 상자에서 돌기 때문에 ‘자기 코드를 수정할 수 없다’는 것입니다. 그 격리는 실제이고, 아래에서 다시 다룹니다.
사람들이 부딪히는 문제들
hermes-agent 트래커에는 이 SSH 경로들을 둘러싼 알아볼 만한 열린 이슈 무리가 있습니다. 각각이 내게 무엇을 뜻하는지 과장하지 않고, 번호로 인용합니다:
- 이름 있는 프로필을 쓰면 SSH 백엔드가 “path too long for Unix domain socket”으로 실패합니다(#133436).
- 설정을 바꾼 뒤에도
/reload가 캐시된 SSH 환경을 지우지 않습니다(#71085). - 데스크톱 SSH 모드에는 자체 문제 세트가 있습니다. 약 1초 만에 실패하는 macOS 프로브(#80836), 그리고 Windows OpenSSH 멈춤과 타임아웃(#118983, #138378, #127320)입니다.
- 분당 약 25회 SSH 로그인에 이르는 부팅 재시도 폭주(#134197).
- 포트 22를 막는 네트워크에서는
hermes update가 실패합니다(#133439).
이 중 일부는 백엔드가 아니라 데스크톱 앱에 관한 것이고, 일부는 이 글을 읽을 때쯤 이미 해결됐을 수 있습니다. 중요한 건 패턴입니다. SSH 백엔드는 ssh 연결 하나를 감싼 얇은 래퍼이므로, 그 연결의 날카로운 모서리를 전부 물려받습니다 — 포트 22가 닿아야 한다는 점까지요.
키 없는 대안: 원격 MCP 서버로서의 Termalin
Hermes Agent는 MCP를 지원합니다. stdio 서버와 원격 HTTP 서버 모두와, Bearer 헤더나 OAuth로 대화할 수 있습니다. 그게 길목입니다. 에이전트에게 키와 호스트 하나를 주는 대신, 내 서버 무리에 닿는 법을 이미 아는 원격 MCP 서버를 가리키게 하세요.
Termalin은 호스팅 MCP 서버를 갖춘 SSH 클라이언트입니다. 닿기를 원하는 서버마다 Connector — 바깥쪽으로 다이얼하고 포트에서 절대 수신 대기하지 않는 한 줄 설치 — 를 돌립니다. 그래서 NAT와 CGNAT 뒤에서도 되고, 포트 22를 열 필요가 없습니다. 등록하면 서버의 sshd가 Termalin의 SSH 인증 기관을 신뢰합니다. 이후 모든 로그인은 내 계정으로 범위가 좁혀진 단기 인증서를 씁니다. 장기 키가 상자에 놓이지 않고, 에이전트에게 건네지는 것도 없습니다.
MCP 서버는 ~/.hermes/config.yaml의 최상위 mcp_servers 키 아래에 들어갑니다. 인증 방법은 두 가지입니다. VPS — Hermes가 보통 돌아가는 곳 — 에서는 API 키가 더 간단하므로, 거기서 시작하세요.
옵션 A — API 키(VPS에 가장 좋음)
Termalin 웹 캐비닛에서 API 키를 만들고, 이 에이전트가 손대야 할 서버로 범위를 좁히고, 읽기 전용이나 허용 목록으로 설정하고, 만료 기간을 주세요. 그것을 ~/.hermes/.env에 넣으세요:
TERMALIN_API_KEY=tk_live_your_key_here
그런 다음 서버를 추가하세요. Hermes는 ${VAR} 참조를 서버 연결 시점에 해석하며, headers 안에서도 그렇습니다:
# ~/.hermes/config.yaml
mcp_servers:
termalin:
url: "https://termal.in/api/v1/mcp"
headers:
Authorization: "Bearer ${TERMALIN_API_KEY}"
연결을 확인한 다음, 세션 안에서 MCP를 다시 로드하세요:
hermes mcp test termalin
/reload-mcp
Streamable HTTP는 url 서버의 기본 전송 방식이고, termal.in이 쓰는 것도 그것이므로, transport: 줄은 필요 없습니다.
옵션 B — OAuth 로그인(노트북용)
Hermes가 브라우저가 있는 내 머신에서 돌아간다면, OAuth는 키를 저장하지 않아도 됩니다:
# ~/.hermes/config.yaml
mcp_servers:
termalin:
url: "https://termal.in/mcp"
auth: oauth
hermes mcp login termalin
첫 연결에서 Hermes는 인증 URL을 출력하고, 가능하면 브라우저를 열고, 로컬 루프백 포트에서 OAuth 콜백을 기다립니다. Termalin의 로그인은 그 루프백 리디렉션(http://127.0.0.1:<port>/callback)을 받아들이므로, auth: oauth는 저희 쪽에서 동작합니다.
헤드리스 VPS에서는 루프백 콜백이 노트북에 닿지 못합니다. Termalin과 함께 통하는 두 가지 우회가 있습니다. 리디렉션 URL을 Hermes 프롬프트에 되붙여 넣거나, ssh -N -L <port>:127.0.0.1:<port> user@host로 포트를 포워딩한 뒤 노트북 브라우저에서 로그인을 마무리하는 것입니다. Hermes에는 디바이스 코드 플로도 있지만 Termalin의 로그인은 그것을 제공하지 않습니다 — 서버에서는 옵션 A의 API 키가 더 간단한 길입니다.
연결되면 얻는 것
hermes mcp test termalin(또는 hermes mcp login termalin)과 /reload-mcp 뒤에는 Termalin 도구들이 에이전트에 나타납니다. 닿을 수 있는 서버를 보는 hosts_list, 하나 또는 여럿에서 명령을 실행하는 ssh_exec과 ssh_exec_many, 파일용 sftp_list / sftp_read / sftp_write, 상태용 server_metrics와 alerts_list, 그리고 호출 하나보다 오래 사는 작업을 위한 job_start / job_status / job_stop / job_list입니다.
SSH 백엔드와의 실질적인 차이는 이렇습니다:
- 한 번에 여러 서버.
ssh_exec_many는 같은 명령을 여러 호스트에 걸쳐 실행합니다. 호스트 하나 제한도, 상자를 바꾸려고 다시 설정하는 일도 없습니다. - 연결별 규칙. AI 앱 카드에서 이 연결에 명령 정책을 설정합니다. 전체 액세스, 허용 목록, 또는 읽기 전용입니다. 읽기 전용으로 시작해 나중에 넓히세요.
- 감사 로그. 에이전트가 실행하는 모든 명령이 에이전트의 것으로 표시되어 기록되고, 실시간 워치 그리드에 나타납니다. ‘에이전트가 이걸 했다’는 재구성이 아니라 필터입니다. 에이전트가 하는 일 감사하기(영어)를 보세요.
- 백그라운드 작업. 긴 마이그레이션이나 빌드가 작업(job)으로 돌아가므로, 느린 작업이 세션을 막거나 고정된 타임아웃에 걸리지 않습니다.
- 열린 포트 없음. Connector가 바깥쪽으로 다이얼하므로, ‘포트 22 막힘’ 부류의 문제도 비켜 갑니다.
액세스 해지는 모든 호스트에 걸친 키 교체가 아니라 토글 하나입니다. 그 맞교환 뒤에 있는 논리는 에이전트에게 SSH 키를 건네지 말아야 하는 이유(영어)와 폭발 반경(영어)을 보세요.
그래도 SSH 백엔드를 유지해야 할 때
이것은 한 선택지가 모든 항목에서 이기는 경우가 아닙니다.
- 상자가 정확히 하나이고, 이미 Hermes 머신에 키를 두고 있으며, 그 사이에 다른 무엇도 끼우고 싶지 않다면, SSH 백엔드가 설정할 게 가장 적습니다.
- 문서의 격리 논점은 유효합니다. 별도 호스트에서 돌린다는 것은 에이전트가 자기 코드를 수정할 수 없다는 뜻입니다. MCP 경로도 그 속성을 유지합니다 — 명령이 에이전트 상자가 아니라 내 서버에서 실행되기 때문입니다 — 하지만 SSH 백엔드가 이미 그것을 주고 그 이상이 필요 없다면, 바꿀 이유가 없습니다.
- Termalin의 MCP와 모니터링 도구는 Pro 요금제(월 $10, 연간 결제 시 월 $8 — 연 $96)나 14일 체험, 그리고 서버마다 Connector가 필요합니다. 키 하나와 SSH 백엔드는 비용이 들지 않습니다.
서버가 여럿일 때, 에이전트 상자에 키를 두고 싶지 않을 때, 서버가 NAT 뒤에 있을 때, 또는 연결별 규칙과 감사 추적이 필요할 때 Termalin을 쓰세요. 호스트 하나에 키 하나가 정말로 필요한 전부일 때는 SSH 백엔드를 유지하세요.
문제 해결
- 도구가 나타나지 않습니다.
hermes mcp test termalin을 돌리고,url이 맞는지,TERMALIN_API_KEY가~/.hermes/.env에 설정돼 있는지 확인하세요. 그런 다음 세션 안에서/reload-mcp. - 엔드포인트에서
401. API 키가 없거나, 틀렸거나, 만료됐습니다. 캐비닛에서 새로 만들고~/.hermes/.env를 업데이트하세요. ${TERMALIN_API_KEY}참조가 리터럴로 전송됩니다. Hermes는${VAR}를 연결 시점에 확장합니다. 그 변수가~/.hermes/.env(또는 Hermes를 띄운 셸)에 있는지 확인하고 다시 연결하세요.- 헤드리스 VPS에서 OAuth가 끝까지 완료되지 않습니다. 루프백 콜백이 노트북에 닿지 못합니다.
ssh -N -L <port>:127.0.0.1:<port> user@host로 포트를 포워딩하거나, 리디렉션 URL을 프롬프트에 되붙여 넣으세요. 서버에서는 API 키 경로가 더 간단합니다. - 잘못된 전송 방식.
url서버는 기본값이 Streamable HTTP이고,termal.in이 그것을 씁니다.transport: sse는 SSE만 말하는 서버에만 설정하세요 — 이 서버는 아닙니다.
자주 묻는 질문
Hermes Agent는 MCP를 지원하나요? 네. stdio 서버와 원격 HTTP 서버에, Bearer 헤더나 OAuth로 연결하며, ~/.hermes/config.yaml의 mcp_servers 아래에 설정합니다.
VPS의 Hermes Agent에서도 쓸 수 있나요? 네, 그리고 거기서는 API 키 경로가 가장 쉽습니다. OAuth 플로는 브라우저나 위의 헤드리스 우회 중 하나가 필요합니다.
내 서버에 포트를 열어야 하나요? 아니요. Connector가 바깥쪽으로 다이얼하므로, 인바운드 포트 없이 NAT와 CGNAT 뒤에서 됩니다. NAT 뒤 SSH(영어)를 보세요.
내 SSH 키가 에이전트에게 주어지나요? 아니요. 서버는 로그인마다 발급되는 단기 인증서로 닿습니다. 장기 키는 Termalin을 떠나지 않고, 에이전트 환경에 놓이는 것도 없습니다.
Termalin은 호스팅 MCP 서버, 키 커스터디언(사용자 대신 키를 보관하고 서명하는 구성 요소), 호스트별 에이전트 정책을 갖춘 크로스 플랫폼 SSH 클라이언트입니다. 다른 에이전트를 쓰시나요? 같은 키 없는 구성이 OpenClaw, Codex(영어) 등에도 통합니다 — 또는 앱 다운로드로 시작하세요.