핵심 요약
Claude Sonnet 4.6의 Bash 도구는 진단·로그 수집·롤백 같은 운영 작업을 자연어로 위임할 수 있게 만든다. 다만 sudo 권한과 파이프 한 줄이 곧 장애로 이어진다. 6개월간 사내 5개 서버에 적용하면서 정착시킨 7가지 패턴을 정리한다. 비파괴 명령만 자동 허용, 위험 명령은 사전 검토 큐로 보내는 분리가 가장 큰 효용을 냈다.
1. 권한 격리 — agent 전용 user
에이전트는 절대 root로 돌리지 않는다. useradd -r -s /bin/bash agent로 만들고 /etc/sudoers.d/agent에 읽기 전용 명령만 NOPASSWD로 명시. journalctl, systemctl status, ss, ps, df, du, cat /var/log/* 정도가 안전 화이트리스트의 시작점이다.
2. 출력 후처리로 컨텍스트 보호
journalctl -n 1000은 토큰을 7만 개 잡아먹는다. 도구 래퍼에서 tail -200 | grep -vE '(?:DEBUG|TRACE)' 같은 필터를 강제. 캐시 친화적이지 않은 시간 stamp는 정규식으로 normalize. 입력 토큰을 35~50% 줄였다.
3. 위험 명령 가드 — 정규식 deny-list
DENY = r'\b(rm\s+-rf|dd\s+if=|mkfs|:\(\)\{|shutdown|reboot|chmod\s+777|chown\s+-R\s+/|truncate)'
if re.search(DENY, cmd):
return ask_human_approval(cmd)
발견 시 자동 실행을 막고 사용자 승인 대기 큐로 보낸다. false positive는 감수.
4. dry-run 우선 원칙
에이전트 시스템 프롬프트에 "파괴적 동작 전 반드시 dry-run 옵션을 먼저 시도"를 박는다. rsync는 --dry-run, terraform은 plan, DB 쿼리는 EXPLAIN. 작은 강제만으로 사고가 절반 이하로 줄었다.
5. 작업 디렉터리 chroot
FS 접근은 /srv/agent-workspace로 강제. 코드 수정이 필요하면 git clone → 작업 → PR. 직접 /etc, /var/lib을 만질 권한을 주지 않는다.
6. 감사 로그 — 모든 명령 영속화
def run(cmd):
log_db.insert(ts=now(), session=sid, cmd=cmd, by="claude-sonnet-4-6")
return subprocess.run(cmd, ...)
SQLite 한 줄이면 충분. 사고 분석 때 무엇이 언제 실행되었는지 답이 나온다.
7. 비용 — 캐시 브레이크포인트 배치
| 구성 | 일간 비용 | p50 응답 |
|---|---|---|
| 시스템 프롬프트만 캐시 | $18.4 | 3.2s |
| + 명령 도구 정의 캐시 | $11.2 | 2.7s |
| + 최근 5턴 누적 캐시 | $6.1 | 1.9s |
도구 정의가 길수록 캐시 효과가 크다. 1h TTL을 쓰면 야간 모니터링 같은 저빈도 워크로드도 절반 가격.
자주 묻는 질문
Q. ssh 비밀번호 입력은 어떻게 하나? 절대 stdin 자동 입력하지 말고 키 기반 인증으로 전환. ssh-agent 소켓을 에이전트 사용자에 전달.
Q. systemctl restart는 자동화해도 되나? 단일 서비스 한정으로 허용 가능. 단, restart 전후 health check를 도구 함수 자체에 박아 실패 시 자동 롤백.

댓글 0