AI 코딩 에이전트가 서버에서 무엇을 실행하는지 보는 방법

에이전트가 운영 서버에서 일하는데 터미널에는 도구를 호출하고 있다는 말뿐입니다. 어떤 명령을 실행했고, 서버는 무엇을 돌려줬을까요? 트랜스크립트를 보면 나중에는 알 수 있습니다. 그것을 실행되는 동안 보이게 만든 방법, 처음에 시도했다가 실패한 것, 그리고 저희 앱 없이 같은 것을 얻는 방법을 정리했습니다.

DevOps 에이전트에게 운영 API가 왜 느린지 묻습니다. 에이전트가 일을 시작합니다. 터미널에는 도구를 호출한다는 줄이 하나, 또 하나, 또 하나 뜹니다. 호출 여섯 번 뒤, 디스크가 97 % 찼다고 알려 주고 로그 디렉터리를 정리하겠다고 제안합니다.

그 서버에서 실제로 무엇을 실행했을까요? 어떤 du를, 어떤 find를 쳤을까요? 벌써 뭔가를 지웠을까요? 답은 있습니다. 하지만 세션 트랜스크립트 안에 JSON으로 적혀 있고, 그걸 읽는 건 일이 끝난 뒤입니다. 노트북이라면 괜찮습니다. 운영 서버에서는 일이 끝난 뒤면 "잠깐, 그 폴더 말고"라고 말하기엔 너무 늦습니다.

저희는 AgentsRoom을 만듭니다. 코딩 에이전트를 실행하고, 서버와 데이터베이스와 클러스터에 닿는 도구를 쥐여 주는 데스크톱 앱입니다. 이 글은 그 호출들을 실행되는 동안 보이게 만든 과정, 실패한 버전, 성공한 버전을 받치는 숫자, 그리고 저희 앱을 쓰지 않을 때 같은 것을 얻는 방법에 대한 이야기입니다.

짧은 답

  • CLI가 보여 주는 건 도구가 실행됐다는 사실이지, 반대편의 세션이 아닙니다. 전체 명령과 그 출력은 디스크의 트랜스크립트로 갑니다.
  • 실시간으로 보려면 각 호출이 시작되는 순간 무언가가 기록해야 합니다. 세션이 끝날 때가 아니라요.
  • 연결마다 로그 하나는 됩니다. 명령마다 터미널 탭 하나는 안 됩니다. 한 세션에서 원격 명령 166개를 측정했습니다.
  • 그 로그는 내 컴퓨터에 두세요. 운영 호스트의 명령줄에는 비밀 정보와 고객 데이터가 실려 있습니다.
  • 저희 앱 없이: 모든 셸 명령을 파일에 덧붙이는 Claude Code hook으로 대부분을 해결할 수 있고, 나머지는 트랜스크립트가 채워 줍니다.

서버에서는 트랜스크립트만으로 부족한 이유

Claude Code, Codex, 그리고 다른 CLI도 모든 것을 기록하긴 합니다. Claude Code는 ~/.claude/projects/ 아래에 세션마다 JSONL 파일 하나를, Codex는 ~/.codex/sessions/ 아래에 하나를 씁니다. 도구 호출은 전부 입력과 결과와 함께 그 안에 있습니다.

문제는 완전성이 아니라 시점과 형태입니다. 트랜스크립트는 CLI가 세션을 재개하려고 쓰는 것입니다. 읽는 건 에이전트가 멈춘 뒤이고, JSON 줄을 뒤져야 합니다. 에이전트 셋이 동시에 일하면 파일 셋을 읽어야 합니다. 그리고 실제로 눈을 두고 있는 곳인 에이전트의 터미널에는 각 호출이 접힌 요약으로만 나옵니다.

노트북의 코드라면 나중에 읽는 것이 평범한 리뷰 흐름입니다. 커밋하기 전에 diff를 보면 됩니다. 서버에는 diff가 없습니다. systemctl restart나 DELETE는 실행되는 순간 효과가 납니다.

처음에 시도한 것, 그리고 명령 166개

에이전트를 위한 저희의 첫 원격 도구는 터미널 탭에서 연결을 여는 방식이었습니다. 옳아 보였습니다. 사용자가 세션을 볼 수 있었으니까요. 그런데 예상하지 못한 방식으로 실패했습니다.

이 도구는 에이전트가 방금 연 탭에서 무슨 일이 일어났는지 읽을 방법을 주지 않았습니다. 그래서 어느 사용자의 프로젝트에서 에이전트가 이 도구를 더는 쓰지 않았습니다. 그 세션의 집계는 이렇습니다. 저희 연결 도구 호출 16번, 그리고 에이전트 자신의 셸 도구로 실행한 sshpass 명령 166개. 에이전트는 사용자에게 비밀번호를 물었고, 사용자는 그걸 채팅에 붙여 넣었습니다. 운영 서버의 자격 증명이 트랜스크립트에 평문으로, 각 명령이 도는 동안 ps aux에, 그리고 /tmp 아래의 파일에 남았습니다.

교훈은 "에이전트는 무모하다"가 아니었습니다. 에이전트는 통하는 유일한 방법을 썼을 뿐입니다. 안전하지만 에이전트가 일을 못 하게 하는 도구는 우회당하고, 그 우회는 도구가 아예 없는 것보다 나쁩니다.

그래서 ssh_exec을 만들었습니다. 에이전트가 명령 하나를 보내면 AgentsRoom이 비밀번호를 앱 안에 둔 채 저장된 연결에서 그 명령을 실행하고, 출력과 종료 코드를 돌려줍니다. 에이전트는 자격 증명을 볼 일이 없고, sshpass 줄을 만들 이유도 없습니다.

보안 문제는 그렇게 해결됐고, 대신 가시성 문제가 생겼습니다. ssh_exec마다 탭을 열었다면 그 세션은 탭 166개를 만들었을 겁니다. 그래서 ssh_exec은 탭을 하나도 열지 않았고, 두 달 동안 그 명령들을 볼 수 있는 곳은 또다시 에이전트의 대화뿐이었습니다.

연결마다 로그 하나

2026년 10월 29일에 내놓은 버전(AgentsRoom 1.242.0)은 규칙 하나를 지킵니다. 명령마다 탭을 만들지 않는다. 대신 모든 호출이 연결마다 하나씩 있는 로그에 쌓입니다.

  • 오른쪽 패널의 활동 탭은 파일, 변경사항, 테스트 옆에 있습니다. 에이전트가 건드린 연결을 카드(마지막 명령, 에이전트, 시각, 상태)로 보여 주고, 최근 호출 40개를 타임라인에 띄웁니다. 에이전트별로 거를 수 있고, 명령, 연결 이름, 출력을 검색할 수 있습니다.
  • 연결의 로그는 터미널처럼 읽힙니다. 에이전트 · 시각, 그다음 $ 명령, 그다음 출력, 그다음 완료 · 종료 코드 0 · 1.2 s. SSH 출력은 실시간으로 흘러가고, 위로 스크롤하지 않는 한 화면이 맨 아래를 따라갑니다. 버튼 하나로 로그 전체를 텍스트로 복사합니다.
  • 에이전트 헤더의 필은 그 에이전트가 건드린 서버, 데이터베이스, 클러스터마다 하나씩 있고, 호출 중에는 초록 점이 붙습니다. 클릭하면 그 로그가 열립니다.
  • 에이전트 작업 중 배지는 서버, 데이터베이스, Kubernetes 창에서 해당 연결의 행에 붙고, 호출이 실행되는 동안에만 보입니다.

로그는 읽기 전용입니다. 직접 서버에 입력하고 싶다면 지금처럼 서버 창의 SSH 탭으로 들어가면 됩니다. 기능 전체 페이지는 AI 에이전트를 위한 SSH 연결이고, 데이터베이스 쪽은 데이터베이스 연결에 있습니다.

기록되는 것과 기록되지 않는 것

호출로그에 남는가이유
ssh_exec (SSH, AWS SSM, WinRM)예핵심 사례: 원격 서버에서 도는 명령인데 자기 탭이 없음
ssh_transfer예서버로 또는 서버에서 복사한 파일은 그 서버에 대한 행동
db_query, db_schema예에이전트가 쓴 그대로의 SQL과 결과의 첫 몇 행
kube_kubectl예인자가 붙은 kubectl 줄로 표시
commands_run, ssh_connect아니요이미 지켜볼 수 있는 터미널 탭을 엶
에이전트 자신의 셸 도구(직접 친 ssh, psql, kubectl)아니요AgentsRoom을 거치지 않음: 에이전트의 터미널과 트랜스크립트에 있음

마지막 줄이 솔직한 한계입니다. 로그는 저희 도구를 거친 것만 봅니다. 모든 원격 행동이 거기에 나타나길 원한다면, 에이전트에게 도구 쪽이 더 쉬운 길이어야 합니다. 그것이 명령 166개의 교훈입니다.

하나 더: 명령이 도는 동안 출력이 흘러가는 건 SSH뿐입니다. 내 컴퓨터의 진짜 터미널을 거치기 때문입니다. WinRM, SQL, kubectl의 결과는 호출이 끝날 때 나타납니다.

로그를 유지하는 비용

저희 사용자들은 에이전트를 한꺼번에 많이 돌립니다. 어떤 컴퓨터에서는 프로젝트 18개에 걸쳐 에이전트 45개, 다른 컴퓨터에서는 콘솔 48개입니다. 에이전트마다, 출력 조각마다 세는 것은 모두 이 숫자만큼 곱해지므로, 로그에는 엄격한 상한이 있습니다.

  • 프로젝트당 호출 120개, 오래된 것부터 버립니다.
  • 호출당 출력 32,000자, 끝부분을 남깁니다. 오류와 종료 코드가 있는 곳이 거기니까요.
  • 호출당 명령 또는 SQL 2,000자.
  • 실시간 출력은 호출당 120 ms마다 업데이트 메시지 하나, 터미널 출력 조각마다 하나가 아닙니다.
  • 쉬는 동안 타이머 없음. 어떤 에이전트도 원격 도구를 부르지 않는 동안 로그 비용은 0입니다.

기록은 한 지점에서 일어납니다. 모든 CLI의 도구 호출이 거쳐 가는 브리지입니다. 그래서 Claude Code든 Codex든 Antigravity CLI든, 앱이 실행하는 다른 어떤 CLI든 프로바이더별 코드 없이 똑같이 동작합니다.

저희가 고른 한계: 아무것도 컴퓨터 밖으로 나가지 않는다

로그는 데스크톱 앱의 메모리에 보관되고, 앱을 종료하면 사라집니다. 저희 서버로 동기화되지 않습니다. 저희로서는 드문 일입니다. AgentsRoom의 거의 모든 것은 계정을 따라 여러 컴퓨터를 넘나들기 때문입니다.

이것만은 그렇지 않습니다. 일부러입니다. 서버에서 실행한 env의 출력에는 비밀 정보가 들어 있습니다. 고객 테이블에 날린 SELECT에는 고객 데이터가 들어 있습니다. 그런 것들을 보이게 하려고 만든 도구가 그것을 새로운 어딘가로 복사까지 해서는 안 됩니다.

휴대폰에서도 에이전트 프로필에서 같은 로그를 따라 볼 수 있습니다(모바일 앱 2.47 이상). 스트림은 종단 간 암호화된 연결을 통해 컴퓨터에서 휴대폰으로 가고, 비밀 정보는 나가기 전에 가려지며(API 키, KEY=value 쌍, URL 속 비밀번호, 토큰), 서버에는 아무것도 저장되지 않습니다. 같은 호출은 예전처럼 에이전트의 대화에서도 계속 읽을 수 있습니다.

Claude Code 감사 로그는 다른 것입니다

"Claude Code 감사 로그"를 검색했다면 아마 Claude Enterprise용 Anthropic Compliance API를 찾았을 겁니다. 활동 피드, 감사 로그 이벤트, 그리고 Enterprise 계정에 로그인한 로컬 세션이라면 세션 트랜스크립트까지 있습니다. 관리자와 컴플라이언스 팀을 위해 만들어졌고, 조직 전체를 다루며, 일이 끝난 뒤에 읽습니다.

이것이 답하는 질문은 "회사에서 누가 Claude로 무엇을 했는가"입니다. "지금 내 에이전트가 데이터베이스 서버에서 어떤 명령을 실행하고 있는가"에는 답하지 않습니다. 둘은 공존할 수 있고, 컴플라이언스 요건이 있는 회사에서 일한다면 두 번째에 무엇을 쓰든 첫 번째는 아마 필요합니다.

AgentsRoom을 쓰지 않는다면

CLI가 이미 제공하는 것만으로도 상당 부분을 얻을 수 있습니다.

모든 셸 명령을 시작되는 순간 기록하세요. Claude Code hook은 각 도구 호출 전에 명령을 실행할 수 있습니다. hook 가이드에 그 패턴이 나옵니다. Bash 도구에 거는 PreToolUse hook으로, jq -r .tool_input.command의 결과를 로그 파일에 흘려 넣는 방식입니다. 두 번째 터미널에서 그 파일에 tail -f를 걸면, 에이전트가 명령을 보내는 순간 하나하나 보입니다. ssh 줄도 포함해서요.

출력이 필요할 땐 트랜스크립트를 읽으세요. hook이 주는 건 명령이지, 서버가 무엇을 답했는지가 아닙니다. 그건 ~/.claude/projects/ 아래의 세션 파일(Codex라면 ~/.codex/sessions/)에 모든 호출의 전체 결과로 들어 있습니다.

서버에 에이전트 전용 계정을 만드세요. 전용 사용자를 두면 모든 연결이 서버의 인증 로그에서 누구의 것인지 드러납니다. 서버에서 auditd가 돈다면, 그 사용자의 execve에 거는 규칙 하나로 그 사용자가 띄우는 프로세스를 전부 서버 쪽에서 기록할 수 있습니다. 에이전트가 건너뛸 수 없는 곳이죠.

자격 증명을 에이전트의 손이 닿지 않는 곳에 두세요. 접속할 유일한 방법이 에이전트가 당신에게 물어봐야 하는 비밀번호라면, 채팅에 sshpass 줄이 보이게 됩니다. 에이전트가 절대 읽지 않는 키를 쓰거나, 비밀 정보를 대신 쥐고 있는 도구를 쓰세요. 프롬프트에 넣지 않고 에이전트에게 비밀 정보를 건네는 방법은 따로 가이드로 정리했습니다.

이 구성이 주지 못하는 것은 셋을 잇는 연결입니다. 어떤 에이전트가, 어떤 연결에서, 어떤 실시간 출력을 내는지를 한곳에서 보는 것. 그게 저희가 만든 부분입니다.

실제로 자주 받는 질문

Claude Code가 원격 서버에서 무엇을 하는지 작업 중에 볼 수 있나요?

터미널에는 도구 호출과, 호출이 끝난 뒤의 짧은 결과만 보입니다. 전체 명령과 그 출력은 디스크에 있는 세션 트랜스크립트에 기록되고, 그건 나중에 읽게 됩니다. 실행되는 동안 보려면 각 호출을 시작하는 순간 기록하는 무언가가 필요합니다. 모든 Bash 명령을 로그 파일에 쓰는 Claude Code의 hook이나, 에이전트 대신 원격 호출을 실행하고 실시간으로 보여 주는 앱입니다. 후자가 AgentsRoom의 활동 탭이 하는 일입니다.

Claude Code는 실행한 명령의 기록을 어디에 남기나요?

세션 트랜스크립트에 남깁니다. ~/.claude/projects/ 아래에 있는 JSONL 파일로, 프로젝트마다 폴더 하나, 세션마다 파일 하나입니다. 도구 호출 하나하나가 입력과 결과를 담은 한 줄입니다. Codex도 ~/.codex/sessions/ 아래에 세션마다 비슷한 파일을 둡니다. 둘 다 빠짐없이 기록하지만, 둘 다 CLI가 세션을 재개하려고 쓰는 것이지 사람이 훑어보라고 쓰는 것이 아닙니다.

이게 Claude Code 감사 로그와 같은 건가요?

아닙니다. 그 이름으로 사람들이 찾는 감사 로그는 Anthropic이 Enterprise 요금제에서 Compliance API로 제공하는 조직 단위 기록입니다. 활동 피드, 감사 이벤트, 그리고 로그인된 세션이라면 트랜스크립트까지 있고, 관리자가 나중에 읽습니다. 이것이 답하는 질문은 조직 안에서 누가 무엇을 했느냐입니다. 한 서버의 명령을 실시간으로 보는 화면은 다른 사람을 위한 다른 도구입니다.

에이전트가 실행하는 명령마다 터미널 탭을 하나씩 열면 되지 않나요?

그 길을 실제로 가 봤고 측정도 했습니다. 운영 장애를 처리하던 에이전트 하나가 한 세션에서 원격 명령 166개를 실행했습니다. 명령마다 탭을 열면 10분만 지나도 탭 바를 쓸 수가 없습니다. 효과가 있는 것은 연결마다 로그 하나를 두고, 호출 하나하나를 명령, 실시간 출력, 종료 코드, 소요 시간을 담은 항목으로 쌓는 방식입니다.

AgentsRoom이 명령과 그 출력을 서버로 보내나요?

아닙니다. 로그는 데스크톱 앱의 메모리에 있고, 프로젝트당 호출 120개가 상한이며, 앱을 종료하면 사라집니다. 휴대폰에서는 에이전트 프로필에서 따라 볼 수 있습니다(모바일 앱 2.47 이상). 스트림은 종단 간 암호화된 연결을 통해 컴퓨터에서 휴대폰으로 가고, 비밀 정보는 가려지며, 서버에는 아무것도 저장되지 않습니다.

활동 탭에 나오지 않는 에이전트 명령은 무엇인가요?

AgentsRoom 도구를 거치는 호출만 기록됩니다. ssh_exec, ssh_transfer, db_query, db_schema, kube_kubectl입니다. 에이전트가 자기 셸 도구로 실행한 명령, 예를 들어 직접 친 ssh나 psql 줄은 그 에이전트의 터미널과 트랜스크립트에는 있지만 로그에는 없습니다. commands_run과 ssh_connect는 일부러 뺐습니다. 둘 다 이미 지켜볼 수 있는 터미널 탭을 열기 때문입니다.

요약

서버에서 일하는 에이전트에게는 당신에게서 두 가지가 필요합니다. 당신의 비밀번호를 거치지 않고 일할 방법, 그리고 에이전트가 일하는 동안 당신이 그걸 볼 방법입니다. 두 번째 없이 첫 번째만 있으면 일이 끝난 뒤 JSON을 읽게 됩니다. 첫 번째 없이 두 번째만 있으면 sshpass 줄을 붙여 넣는 에이전트에게 우회당합니다.

저희가 도달한 답은 연결마다 하나씩, 상한이 있고, 내 컴퓨터에 머무는 로그였습니다. 써 보고 싶다면 AgentsRoom은 무료로 내려받을 수 있고, SSH 연결 페이지에서 설정을 단계별로 보여 줍니다. CLI만으로 계속하고 싶다면 PreToolUse hook과 tail -f부터 시작하세요. 5분이면 되고, 마지막 도구 호출 여섯 번이 무엇이었는지 다시는 궁금해할 일이 없을 겁니다.

AgentsRoom 다운로드

모든 AI 에이전트를, 모든 프로젝트에서, 하나의 창으로 실행하세요.

무료AgentsRoom 다운로드

컴패니언 앱: 이동 중에도 에이전트를 모니터링

Claude, Codex, Antigravity CLI 또는 다른 AI 공급자를 사용하세요.

확장 프로그램 설치
Chrome Web Store

버그와 요청을 공개 백로그로 바로 보내세요.

멀티 프로젝트
멀티 프로바이더
멀티 에이전트
실시간 상태
파일 diff & 커밋
모바일 앱
라이브 프리뷰
에이전트 팀
브라우저 자동화
백로그 기반 개발
프롬프트 라이브러리
스킬 라이브러리
모든 기능 보기

계속 읽기