Exec 도구
워크스페이스에서 쉘 명령을 실행합니다. process를 통한 포그라운드 + 백그라운드 실행을 지원합니다. process가 허용되지 않으면 exec는 동기적으로 실행되고 yieldMs/background를 무시합니다. 백그라운드 세션은 에이전트별로 범위가 지정됩니다; process는 동일한 에이전트의 세션만 봅니다.
파라미터
command(필수)workdir(기본값 cwd)env(키/값 재정의)yieldMs(기본값 10000): 지연 후 자동 백그라운드background(bool): 즉시 백그라운드timeout(초, 기본값 1800): 만료 시 종료pty(bool): 사용 가능한 경우 의사 터미널에서 실행 (TTY 전용 CLI, 코딩 에이전트, 터미널 UI)host(auto | sandbox | gateway | node): 실행 위치security(deny | allowlist | full):gateway/node에 대한 시행 모드ask(off | on-miss | always):gateway/node에 대한 승인 프롬프트node(string):host=node에 대한 노드 id/이름elevated(bool): elevated 모드 요청 (샌드박스를 구성된 호스트 경로로 탈출);security=full은 elevated가full로 해결될 때만 강제됩니다
참고:
host는 기본값이auto입니다: 세션에 샌드박스 런타임이 활성화된 경우 샌드박스, 그렇지 않으면 게이트웨이.auto는 기본 라우팅 전략이며 와일드카드가 아닙니다. 호출별host=node는auto에서 허용됩니다;host=gateway는 활성 샌드박스 런타임이 없을 때만 허용됩니다.- 추가 구성 없이
host=auto는 여전히 "그냥 작동"합니다: 샌드박스가 없으면 게이트웨이로 해결되고; 라이브 샌드박스가 있으면 샌드박스에 유지됩니다. elevated는 샌드박스를 구성된 호스트 경로로 탈출합니다: 기본값으로gateway, 또는tools.exec.host=node인 경우node(또는 세션 기본값이host=node). elevated 액세스가 현재 세션/프로바이더에 대해 활성화된 경우에만 사용 가능합니다.gateway/node승인은~/.openclaw/exec-approvals.json으로 제어됩니다.node는 페어링된 노드(컴패니언 앱 또는 헤드리스 노드 호스트)가 필요합니다.- 여러 노드를 사용할 수 있는 경우
exec.node또는tools.exec.node를 설정하여 하나를 선택하십시오. exec host=node는 노드에 대한 유일한 쉘 실행 경로입니다; 레거시nodes.run래퍼는 제거되었습니다.- 비 Windows 호스트에서 exec는
SHELL이 설정된 경우 사용합니다;SHELL이fish인 경우PATH에서bash(또는sh)를 선호하여 fish 호환되지 않는 스크립트를 방지한 후 둘 다 존재하지 않으면SHELL로 폴백합니다. - Windows 호스트에서 exec는 PowerShell 7(
pwsh) 검색을 선호합니다(Program Files, ProgramW6432, 그런 다음 PATH), Windows PowerShell 5.1로 폴백합니다. - 호스트 실행(
gateway/node)은 바이너리 하이재킹이나 삽입된 코드를 방지하기 위해env.PATH및 로더 재정의(LD_*/DYLD_*)를 거부합니다. - OpenClaw는 생성된 명령 환경(PTY 및 샌드박스 실행 포함)에
OPENCLAW_SHELL=exec를 설정하여 쉘/프로파일 규칙이 exec 도구 컨텍스트를 감지할 수 있도록 합니다. - 중요: 샌드박싱은 기본적으로 비활성화됩니다. 샌드박싱이 꺼져 있으면 암묵적
host=auto는gateway로 해결됩니다. 명시적host=sandbox는 여전히 게이트웨이 호스트에서 자동으로 실행하는 대신 실패 폐쇄합니다. 샌드박싱을 활성화하거나 승인과 함께host=gateway를 사용하십시오. - 스크립트 프리플라이트 검사(일반적인 Python/Node 쉘 구문 오류)는 유효
workdir경계 내부의 파일만 검사합니다. 스크립트 경로가workdir외부로 해결되면 해당 파일에 대한 프리플라이트를 건너뜁니다. - 지금 시작되는 장기 실행 작업의 경우 한 번 시작하고 자동 완료 웨이크가 활성화되고 명령이 출력을 내보내거나 실패할 때를 기다리십시오. 슬립 루프, 타임아웃 루프, 또는 반복 폴링으로 예약을 에뮬레이트하는 데
process를 사용하지 마십시오. - 나중에 또는 일정에 따라 발생해야 하는 작업의 경우
exec슬립/지연 패턴 대신 크론을 사용하십시오.
구성
tools.exec.notifyOnExit(기본값: true): true인 경우 백그라운드 exec 세션이 종료 시 시스템 이벤트를 대기열에 넣고 하트비트를 요청합니다.tools.exec.approvalRunningNoticeMs(기본값: 10000): 승인 게이팅 exec가 이보다 오래 실행될 때 단일 "실행 중" 알림을 내보냅니다 (0은 비활성화).tools.exec.host(기본값:auto; 샌드박스 런타임이 활성화된 경우sandbox로, 그렇지 않으면gateway로 해결)tools.exec.security(기본값: 샌드박스의 경우deny, 설정되지 않은 경우 게이트웨이 + 노드의 경우full)tools.exec.ask(기본값:off)- 게이트웨이 + 노드에 대한 승인 없는 호스트 exec가 기본값입니다. 승인/허용 목록 동작을 원한다면
tools.exec.*와 호스트~/.openclaw/exec-approvals.json모두를 강화하십시오; Exec 승인을 참조하십시오. - YOLO는
host=auto가 아닌 호스트 정책 기본값(security=full,ask=off)에서 옵니다. 게이트웨이 또는 노드 라우팅을 강제하려면tools.exec.host를 설정하거나/exec host=...를 사용하십시오. security=full및ask=off모드에서 호스트 exec는 구성된 정책을 직접 따릅니다; 추가 휴리스틱 명령 난독화 사전 필터가 없습니다.tools.exec.node(기본값: 설정되지 않음)tools.exec.strictInlineEval(기본값: false): true인 경우python -c,node -e,ruby -e,perl -e,php -r,lua -e,osascript -e같은 인라인 인터프리터 eval 형식은 항상 명시적 승인이 필요합니다.allow-always는 여전히 양성 인터프리터/스크립트 호출을 지속할 수 있지만 인라인 eval 형식은 매번 프롬프트됩니다.tools.exec.pathPrepend: exec 실행을 위해PATH에 앞에 추가할 디렉토리 목록 (게이트웨이 + 샌드박스만).tools.exec.safeBins: 명시적 허용 목록 항목 없이 실행할 수 있는 stdin 전용 안전 바이너리. 동작 세부 정보는 안전 빈을 참조하십시오.tools.exec.safeBinTrustedDirs:safeBins경로 확인을 위해 신뢰된 추가 명시적 디렉토리.PATH항목은 자동으로 신뢰되지 않습니다. 내장 기본값은/bin과/usr/bin입니다.tools.exec.safeBinProfiles: 안전 빈별 선택적 사용자 정의 argv 정책 (minPositional,maxPositional,allowedValueFlags,deniedFlags).
예시:
{
tools: {
exec: {
pathPrepend: ["~/bin", "/opt/oss/bin"],
},
},
}PATH 처리
host=gateway: 로그인 쉘PATH를 exec 환경에 병합합니다.env.PATH재정의는 호스트 실행에 대해 거부됩니다. 데몬 자체는 최소한의PATH로 실행됩니다:- macOS:
/opt/homebrew/bin,/usr/local/bin,/usr/bin,/bin - Linux:
/usr/local/bin,/usr/bin,/bin
- macOS:
host=sandbox: 컨테이너 내부에서sh -lc(로그인 쉘)를 실행하므로/etc/profile이PATH를 재설정할 수 있습니다. OpenClaw는 내부 환경 변수를 통해 프로파일 소싱 후env.PATH를 앞에 추가합니다(쉘 보간 없음);tools.exec.pathPrepend도 여기에 적용됩니다.host=node: 전달하는 비 차단된 환경 재정의만 노드로 전송됩니다.env.PATH재정의는 호스트 실행에 대해 거부되고 노드 호스트에서 무시됩니다. 노드에 추가 PATH 항목이 필요한 경우 노드 호스트 서비스 환경(systemd/launchd)을 구성하거나 표준 위치에 도구를 설치하십시오.
에이전트별 노드 바인딩(구성에서 에이전트 목록 인덱스 사용):
openclaw config get agents.list
openclaw config set agents.list[0].tools.exec.node "node-id-or-name"Control UI: 노드 탭에는 동일한 설정을 위한 작은 "Exec 노드 바인딩" 패널이 포함됩니다.
세션 재정의 (/exec)
/exec를 사용하여 host, security, ask, node에 대한 세션별 기본값을 설정하십시오. 인수 없이 /exec를 전송하면 현재 값이 표시됩니다.
예시:
/exec host=auto security=allowlist ask=on-miss node=mac-1인증 모델
/exec는 승인된 발신자에 대해서만 적용됩니다 (채널 허용 목록/페어링 및 commands.useAccessGroups). 세션 상태만 업데이트하며 구성을 작성하지 않습니다. exec를 하드 비활성화하려면 도구 정책을 통해 거부하십시오 (tools.deny: ["exec"] 또는 에이전트별). 호스트 승인은 security=full 및 ask=off를 명시적으로 설정하지 않는 한 여전히 적용됩니다.
Exec 승인 (컴패니언 앱 / 노드 호스트)
샌드박스화된 에이전트는 exec가 게이트웨이 또는 노드 호스트에서 실행되기 전에 요청별 승인을 요구할 수 있습니다. 정책, 허용 목록, UI 흐름은 Exec 승인을 참조하십시오.
승인이 필요한 경우 exec 도구는 즉시 status: "approval-pending" 및 승인 ID와 함께 반환됩니다. 승인(또는 거부 / 타임아웃)되면 게이트웨이는 시스템 이벤트(Exec finished / Exec denied)를 발생시킵니다. tools.exec.approvalRunningNoticeMs 후에도 명령이 여전히 실행 중이면 단일 Exec running 알림이 발생됩니다. 네이티브 승인 카드/버튼이 있는 채널에서 에이전트는 해당 네이티브 UI에 먼저 의존해야 하며 도구 결과가 채팅 승인을 사용할 수 없다거나 수동 승인이 유일한 남은 경로라고 명시적으로 말하는 경우에만 수동 /approve 명령을 포함해야 합니다.
허용 목록 + 안전 빈
수동 허용 목록 시행은 해결된 바이너리 경로만 일치합니다 (기본 이름 일치 없음). security=allowlist인 경우 쉘 명령은 모든 파이프라인 세그먼트가 허용 목록에 있거나 안전 빈인 경우에만 자동 허용됩니다. 체이닝(;, &&, ||) 및 리디렉션은 모든 최상위 세그먼트가 허용 목록을 충족하는 경우를 제외하고 허용 목록 모드에서 거부됩니다(안전 빈 포함). 리디렉션은 여전히 지원되지 않습니다. 지속적인 allow-always 신뢰는 해당 규칙을 우회하지 않습니다: 체인된 명령은 모든 최상위 세그먼트가 일치하도록 여전히 요구됩니다.
autoAllowSkills는 exec 승인의 별도 편의 경로입니다. 수동 경로 허용 목록 항목과 동일하지 않습니다. 엄격한 명시적 신뢰의 경우 autoAllowSkills를 비활성화 상태로 유지하십시오.
두 컨트롤을 다른 용도로 사용하십시오:
tools.exec.safeBins: 작고 stdin 전용인 스트림 필터.tools.exec.safeBinTrustedDirs: 안전 빈 실행 파일 경로를 위한 명시적 추가 신뢰된 디렉토리.tools.exec.safeBinProfiles: 사용자 정의 안전 빈을 위한 명시적 argv 정책.- 허용 목록: 실행 파일 경로에 대한 명시적 신뢰.
safeBins를 일반 허용 목록으로 취급하지 마십시오. 인터프리터/런타임 바이너리(예: python3, node, ruby, bash)를 추가하지 마십시오. 이것들이 필요하면 명시적 허용 목록 항목을 사용하고 승인 프롬프트를 활성화 상태로 유지하십시오. openclaw security audit는 명시적 프로파일이 없는 인터프리터/런타임 safeBins 항목에 대해 경고하고, openclaw doctor --fix는 누락된 사용자 정의 safeBinProfiles 항목을 스캐폴딩할 수 있습니다. openclaw security audit와 openclaw doctor는 jq 같은 광범위한 동작 빈을 safeBins에 명시적으로 다시 추가할 때도 경고합니다. 인터프리터를 명시적으로 허용 목록에 추가하는 경우 인라인 코드 eval 형식이 여전히 새 승인을 요구하도록 tools.exec.strictInlineEval을 활성화하십시오.
전체 정책 세부 정보 및 예시는 Exec 승인 및 안전 빈 대 허용 목록을 참조하십시오.
예시
포그라운드:
{ "tool": "exec", "command": "ls -la" }백그라운드 + 폴:
{"tool":"exec","command":"npm run build","yieldMs":1000}
{"tool":"process","action":"poll","sessionId":"<id>"}폴링은 온디맨드 상태 확인용입니다. 자동 완료 웨이크가 활성화된 경우 명령은 출력을 내보내거나 실패할 때 세션을 깨울 수 있습니다.
키 전송 (tmux 스타일):
{"tool":"process","action":"send-keys","sessionId":"<id>","keys":["Enter"]}
{"tool":"process","action":"send-keys","sessionId":"<id>","keys":["C-c"]}
{"tool":"process","action":"send-keys","sessionId":"<id>","keys":["Up","Up","Enter"]}제출 (CR만 전송):
{ "tool": "process", "action": "submit", "sessionId": "<id>" }붙여넣기 (기본값으로 괄호 포함):
{ "tool": "process", "action": "paste", "sessionId": "<id>", "text": "line1\nline2\n" }apply_patch
apply_patch는 구조화된 다중 파일 편집을 위한 exec의 하위 도구입니다. OpenAI 및 OpenAI Codex 모델에 대해 기본적으로 활성화됩니다. 비활성화하거나 특정 모델로 제한하려는 경우에만 구성을 사용하십시오:
{
tools: {
exec: {
applyPatch: { workspaceOnly: true, allowModels: ["gpt-5.4"] },
},
},
}참고:
- OpenAI/OpenAI Codex 모델에서만 사용 가능합니다.
- 도구 정책이 여전히 적용됩니다;
allow: ["write"]는 암묵적으로apply_patch를 허용합니다. - 구성은
tools.exec.applyPatch아래에 있습니다. tools.exec.applyPatch.enabled는 기본값이true입니다; OpenAI 모델에 대해 도구를 비활성화하려면false로 설정하십시오.tools.exec.applyPatch.workspaceOnly는 기본값이true(워크스페이스 포함)입니다.apply_patch가 워크스페이스 디렉토리 외부에 쓰거나 삭제할 수 있도록 의도적으로 원하는 경우에만false로 설정하십시오.
관련 항목
- Exec 승인 — 쉘 명령에 대한 승인 게이트
- 샌드박싱 — 샌드박스 환경에서 명령 실행
- 백그라운드 프로세스 — 장기 실행 exec 및 프로세스 도구
- 보안 — 도구 정책 및 elevated 액세스