termal.in

← 블로그

구글 Gemini CLI를 SSH로 내 서버에 안전하게 연결하기

· Termalin Team geminimcpai-agentssshtutorial

구글의 Gemini CLI는 터미널 속 유능한 에이전트이고, 다른 코딩 에이전트들처럼 결국 노트북을 떠나 진짜 서버에 닿아야 합니다. 서비스를 재시작하고, 로그를 따라가고, 상자에서 직접 배포를 돌립니다. 솔깃한 지름길은 ssh를 직접 실행하게 두는 것입니다. CLI는 이미 셸 명령을 실행하므로, ~/.ssh나 돌고 있는 ssh-agent에 키가 잠금 해제된 채 놓여 있으면, 그럴 의도였든 아니든 ssh prod가 됩니다. 그게 한 줄로 요약한 문제 전부입니다. 기본적으로 서버 전체 액세스를 넘겨준 것입니다.

Gemini CLI에는 더 깔끔한 길이 기본으로 들어 있습니다. MCP(영어)를 쓰는데, Claude Code, Cursor, Codex가 쓰는 바로 그 프로토콜입니다(모두 영어). Termalin은 MCP 서버가 내장된 SSH 클라이언트이므로, Gemini가 그 서버를 가리키게 하면 Gemini가 내 호스트에서 실제로 일하면서도 에이전트는 키를 전혀 쥐지 않습니다. 약 20분, 호스트 하나면 됩니다.

필요한 것

  • Termalin — 데스크톱 앱. Free 요금제면 충분합니다. Gemini가 대화하는 상대가 그 내장 MCP 서버입니다.
  • Gemini CLI — 같은 머신에.
  • 호스트 하나 — Termalin에 저장된, 첫 실행에는 부담 없는 것.

1단계 — 에이전트 액세스를 켜고 정책 정하기

에이전트 액세스는 기본적으로 꺼져 있습니다. Termalin에서 **설정 → 에이전트 액세스 (MCP)**를 열어 켜고, Gemini가 닿을 수 있는 호스트를 체크하세요. 그 목록 밖의 것은 에이전트에게는 존재하지 않습니다. 새 호스트는 내가 앱에서 내리는 결정이지, 에이전트가 말로 구슬려 들어갈 수 있는 것이 아닙니다.

내부적으로 Termalin은 MCP 서버를 위한 호스트 인벤토리를 에이전트 전용 인증 항목으로만 기록합니다 — 비밀번호나 키는 그 파일에 들어가지 않습니다 — 그리고 인증은 앱의 키 커스터디언(사용자 대신 키를 보관하고 서명하는 구성 요소)이 맡습니다. 한 번 잠금 해제하면 Termalin이 에이전트를 대신해 서명합니다. Gemini가 읽을 키 파일이 없으니 샐 것도 없고, 위의 ~/.ssh 뒷문도 함께 닫힙니다.

그 김에 호스트마다 에이전트 정책을 정하세요. 전체 액세스, 명령 허용 목록, 또는 차단입니다. 신경 쓰이는 것은 무엇이든 허용 목록으로 시작하세요 — 최소 권한 구성은 짧은 글 하나로 따로 있습니다(영어).

2단계 — Gemini 설정에 서버 등록하기

Gemini CLI는 설정 파일의 mcpServers 객체에서 MCP 서버를 읽습니다. 모든 프로젝트에 적용되는 ~/.gemini/settings.json, 또는 프로젝트 로컬 .gemini/settings.json입니다. 번들된 termalin-mcp 바이너리를 가리키는 항목 하나를 추가하세요:

{
  "mcpServers": {
    "termalin": {
      "command": "<path>/termalin-mcp"
    }
  }
}

그게 연동의 전부입니다. Gemini CLI를 재시작하면(또는 MCP 서버를 다시 로드하면) 도구들이 에이전트에 나타납니다. hosts_list, ssh_exec, 지속 세션(session_open / session_exec), SFTP 읽기·쓰기, 포트 포워딩입니다. Gemini에서 /mcp를 실행해 서버가 연결됐는지 확인하고 노출된 도구를 보세요. 전체 도구 목록(영어)이 하나하나를 문서화합니다.

MCP를 아예 연결하고 싶지 않다면 더 가벼운 선택지가 있습니다. Termalin에는 로컬 터미널 탭이 있어서, gemini를 입력해 CLI를 SSH 세션 옆 앱 안에서 바로 돌릴 수 있습니다. 그러면 Gemini가 같은 창에 들어옵니다. 하지만 Gemini가 커스터디언을 거쳐 내 서버에서 동작하게 하는 것은 위의 MCP 설정이고, 그게 바로 키를 에이전트의 손이 닿지 않는 곳에 두는 부분입니다.

3단계 — 진짜 잡일을 맡기기

데모는 건너뛰세요. 진짜를 건네세요:

staging-1 배포는 끝났는데 헬스 체크가 계속 들쭉날쭉합니다. 왜 그런지 알아내서 고쳐 주세요.

Gemini는 hosts_list를 호출해 staging-1을 발견하고, 세션을 열어 실마리를 당기기 시작합니다. 서비스 상태, 마지막 로그 100줄, 실행 중인 것과의 설정 차이입니다. 수정안을 제안하고, 내가 정한 정책 안에서 적용하고, 체크가 초록색이 되는 것을 확인합니다.

이것을 조마조마함이 아니라 편안함으로 만드는 것은, 그중 무엇도 숨겨져 있지 않다는 점입니다. Gemini가 여는 모든 세션은 Termalin에 라이브 터미널 탭으로 나타나고, **워치 그리드(영어)**는 열린 모든 세션을 나란히 놓고 에이전트가 모는 타일을 빛나게 합니다. 명령이 실행되며 떨어지는 것을 지켜보고, 언제든 끼어들 수 있습니다.

경계는 어디에 있나

중요한 것에 겨누기 전에 알아 둘 기본값:

  • 내 키는 Gemini의 환경에 결코 들어가지 않습니다. 커스터디언이 서명하고, 에이전트는 요청합니다. 액세스 해지는 설정의 토글이지, 서버 무리 전체에 걸친 키 교체가 아닙니다.
  • 그 손이 닿는 범위는 호스트 목록입니다. 1단계에서 체크한 것이고, 호스트마다의 명령 정책이 거기서 실행할 수 있는 것을 한정합니다. 프로덕션에 ‘전체’를 주면 여전히 완전한 셸입니다. 신중하게 설정하세요.
  • 내 세션에 입력하는 것은 별개입니다. 기본적으로 Gemini는 자기 세션을 엽니다. 이미 열어 둔 세션에 들어오는 것은 그 자체로 별도의 동의 토글입니다.
  • 모든 명령은 기록에 남습니다. 녹화는 출력만 담고 키 입력은 절대 담지 않으며, 각 에이전트 명령은 감사 로그에 에이전트의 것으로 표시(영어)되고 출처 기기와 IP가 함께 남습니다.

Gemini가 클라우드에서 돌 때

Gemini가 내 데스크톱이 없는 곳 — CI 작업, 클라우드 샌드박스 — 에서 돈다면, 로컬 바이너리에는 닿지 못하지만 Termalin의 호스팅 MCP 엔드포인트에는 닿습니다. 웹 캐비닛에서 API 키를 발급하고, 맞는 서버로 범위를 좁히고, 읽기 전용이나 허용 목록으로 설정하고, 만료 기간을 주고, 에이전트가 https://termal.in/api/v1/mcp를 가리키게 하세요. Connector로 등록한 서버에 키 없이 닿으며, 실행마다 단기 인증서로 인증합니다 — 전체 CI/CD 패턴은 여기(영어)에 있습니다.

몸에 배게 하는 습관

첫 주는 빠른 동료를 온보딩하듯 대하세요. 워치 그리드를 열어 두고, 완료 상태가 분명한 잡일을 Gemini에게 맡기고, 무언가를 넓히기 전에 그것이 어떻게 거기에 이르는지 읽으세요. 바로 그 맞교환이 핵심입니다. Gemini는 내 서버에 실제로 손을 뻗고, 나는 한 번 나가면 되돌려 받을 수 없는 단 하나 — 키 — 를 계속 쥐고 있습니다.


Termalin은 내장 MCP 서버, 키 커스터디언, 호스트별 에이전트 정책을 갖춘 크로스 플랫폼 SSH 클라이언트입니다. 다운로드하거나, MCP 레퍼런스를 읽거나, 키를 다루는 방식을 보세요.

호스트 한 대에서 먼저 써 보세요.

Termalin은 여러분과 여러분의 에이전트를 위한 빠른 SSH 클라이언트입니다.

무료 요금제 · Pro 14일 무료 체험 · 요금