Tools
ابزار اجرا
اجرای دستورهای shell در workspace. از اجرای پیشزمینه + پسزمینه از طریق process پشتیبانی میکند.
اگر process مجاز نباشد، exec بهصورت همگام اجرا میشود و yieldMs/background را نادیده میگیرد.
جلسههای پسزمینه برای هر agent محدودهبندی میشوند؛ process فقط جلسههای همان agent را میبیند.
پارامترها
commandstringrequiredدستور Shell برای اجرا.
workdirstringدایرکتوری کاری برای دستور.
envobjectبازنویسیهای محیطی کلید/مقدار که روی محیط بهارثرسیده ادغام میشوند.
yieldMsnumberپس از این تأخیر (ms)، دستور را بهطور خودکار به پسزمینه ببرد.
backgroundbooleanبهجای انتظار برای yieldMs، دستور را بلافاصله به پسزمینه ببرد.
timeoutnumberمهلت زمانی پیکربندیشده exec را برای این فراخوانی بازنویسی کنید. فقط زمانی timeout: 0 را تنظیم کنید که دستور باید بدون مهلت زمانی فرایند exec اجرا شود.
ptybooleanدر صورت امکان در یک شبهترمینال اجرا کنید. برای CLIهای فقط TTY، agentهای کدنویسی، و UIهای ترمینالی استفاده کنید.
host'auto' | 'sandbox' | 'gateway' | 'node'محل اجرا. وقتی runtime سندباکس فعال باشد، auto به sandbox و در غیر این صورت به gateway resolve میشود.
security'deny' | 'allowlist' | 'full'حالت اعمال سیاست برای اجرای gateway / node.
ask'off' | 'on-miss' | 'always'رفتار درخواست تأیید برای اجرای gateway / node.
nodestringشناسه/نام Node وقتی host=node.
elevatedbooleanدرخواست حالت elevated — خروج از سندباکس به مسیر host پیکربندیشده. security=full فقط زمانی اجباری میشود که elevated به full resolve شود.
نکات:
- مقدار پیشفرض
hostبرابرautoاست: وقتی runtime سندباکس برای جلسه فعال باشد sandbox، وگرنه gateway. hostفقطauto،sandbox،gateway، یاnodeرا میپذیرد. انتخابگر hostname نیست؛ مقدارهای شبیه hostname پیش از اجرای دستور رد میشوند.autoراهبرد مسیریابی پیشفرض است، نه wildcard.host=nodeدر سطح هر فراخوانی ازautoمجاز است؛host=gatewayدر سطح هر فراخوانی فقط وقتی مجاز است که runtime سندباکس فعال نباشد.- بدون پیکربندی اضافی،
host=autoهمچنان «بدون دردسر کار میکند»: نبود سندباکس یعنی بهgatewayresolve میشود؛ سندباکس زنده یعنی داخل سندباکس میماند. elevatedاز سندباکس به مسیر host پیکربندیشده خارج میشود: بهطور پیشفرضgateway، یا وقتیtools.exec.host=nodeباشد (یا پیشفرض جلسهhost=nodeباشد)node. این فقط وقتی در دسترس است که دسترسی elevated برای جلسه/provider فعلی فعال شده باشد.- تأییدهای
gateway/nodeتوسط~/.openclaw/exec-approvals.jsonکنترل میشوند. nodeبه یک Node جفتشده نیاز دارد (اپلیکیشن همراه یا میزبان Node بدون رابط).- اگر چند Node در دسترس باشد، برای انتخاب یکی
exec.nodeیاtools.exec.nodeرا تنظیم کنید. exec host=nodeتنها مسیر اجرای shell برای Nodeها است؛ wrapper قدیمیnodes.runحذف شده است.timeoutروی اجرای پیشزمینه، پسزمینه،yieldMs، gateway، sandbox، و اجرایsystem.runدر Node اعمال میشود. اگر حذف شود، OpenClaw ازtools.exec.timeoutSecاستفاده میکند؛timeout: 0صریح، مهلت زمانی فرایند exec را برای همان فراخوانی غیرفعال میکند.- روی hostهای غیر Windows، exec وقتی
SHELLتنظیم باشد از آن استفاده میکند؛ اگرSHELLبرابرfishباشد، برای پرهیز از اسکریپتهای ناسازگار با fish،bash(یاsh) را ازPATHترجیح میدهد، سپس اگر هیچکدام وجود نداشته باشند بهSHELLبرمیگردد. - روی hostهای Windows، exec کشف PowerShell 7 (
pwsh) را ترجیح میدهد (Program Files، ProgramW6432، سپس PATH)، سپس به Windows PowerShell 5.1 برمیگردد. - اجرای host (
gateway/node) مقدارهایenv.PATHو بازنویسیهای loader (LD_*/DYLD_*) را رد میکند تا از ربایش binary یا کد تزریقشده جلوگیری شود. - OpenClaw مقدار
OPENCLAW_SHELL=execرا در محیط دستور spawned (شامل اجرای PTY و sandbox) تنظیم میکند تا قواعد shell/profile بتوانند زمینه exec-tool را تشخیص دهند. openclaw channels loginازexecمسدود است، چون یک جریان تعاملی احراز هویت channel است؛ آن را در یک ترمینال روی host مربوط به gateway اجرا کنید، یا وقتی وجود دارد از ابزار login بومی channel از داخل chat استفاده کنید.- مهم: sandboxing بهطور پیشفرض غیرفعال است. اگر sandboxing خاموش باشد،
host=autoضمنی بهgatewayresolve میشود.host=sandboxصریح همچنان بهصورت بسته شکست میخورد، نه اینکه بیصدا روی host مربوط به gateway اجرا شود. sandboxing را فعال کنید یا با تأییدها ازhost=gatewayاستفاده کنید. - بررسیهای preflight اسکریپت (برای خطاهای رایج syntax در shell مربوط به Python/Node) فقط فایلهای داخل مرز
مؤثر
workdirرا بررسی میکنند. اگر مسیر یک اسکریپت بیرون ازworkdirresolve شود، preflight برای آن فایل رد میشود. - برای کار طولانیمدتی که اکنون شروع میشود، آن را یکبار شروع کنید و وقتی wake تکمیل خودکار فعال است و دستور خروجی میدهد یا شکست میخورد، به آن تکیه کنید.
برای logها، وضعیت، ورودی، یا مداخله از
processاستفاده کنید؛ scheduling را با حلقههای sleep، حلقههای timeout، یا polling تکراری شبیهسازی نکنید. - برای کاری که باید بعداً یا طبق زمانبندی انجام شود، بهجای الگوهای sleep/delay در
execاز Cron استفاده کنید.
پیکربندی
tools.exec.notifyOnExit(پیشفرض: true): وقتی true باشد، جلسههای exec پسزمینهشده در زمان خروج یک رویداد system را صف میکنند و Heartbeat درخواست میکنند.tools.exec.approvalRunningNoticeMs(پیشفرض: 10000): وقتی exec وابسته به تأیید بیشتر از این مقدار اجرا شود، یک اعلان «running» واحد منتشر میکند (0 غیرفعال میکند).tools.exec.timeoutSec(پیشفرض: 1800): مهلت زمانی پیشفرض exec برای هر دستور بر حسب ثانیه.timeoutدر سطح هر فراخوانی آن را بازنویسی میکند؛timeout: 0در سطح هر فراخوانی مهلت زمانی فرایند exec را غیرفعال میکند.tools.exec.host(پیشفرض:auto؛ وقتی runtime سندباکس فعال باشد بهsandboxوگرنه بهgatewayresolve میشود)tools.exec.security(پیشفرض:denyبرای sandbox، و اگر تنظیم نشده باشدfullبرای gateway + node)tools.exec.ask(پیشفرض:off)- exec بدون تأیید روی host، پیشفرض gateway + node است. اگر رفتار تأیید/allowlist میخواهید، هم
tools.exec.*و هم~/.openclaw/exec-approvals.jsonروی host را سختگیرانهتر کنید؛ تأییدهای Exec را ببینید. - YOLO از پیشفرضهای سیاست host میآید (
security=full،ask=off)، نه ازhost=auto. اگر میخواهید مسیریابی gateway یا node را اجباری کنید،tools.exec.hostرا تنظیم کنید یا از/exec host=...استفاده کنید. - در حالت
security=fullبههمراهask=off، exec روی host مستقیماً از سیاست پیکربندیشده پیروی میکند؛ هیچ لایه اضافی پیشفیلتر heuristic برای command-obfuscation یا رد script-preflight وجود ندارد. tools.exec.node(پیشفرض: تنظیمنشده)tools.exec.strictInlineEval(پیشفرض: false): وقتی true باشد، فرمهای eval درونخطی interpreter مانندpython -c،node -e،ruby -e،perl -e،php -r،lua -e، وosascript -eهمیشه به تأیید صریح نیاز دارند.allow-alwaysهمچنان میتواند invocationهای بیخطر interpreter/script را ماندگار کند، اما فرمهای inline-eval همچنان هر بار prompt میدهند.tools.exec.pathPrepend: فهرستی از دایرکتوریها برای افزودن به ابتدایPATHدر اجراهای exec (فقط gateway + sandbox).tools.exec.safeBins: binaryهای امن فقط stdin که میتوانند بدون entryهای صریح allowlist اجرا شوند. برای جزئیات رفتار، Safe bins را ببینید.tools.exec.safeBinTrustedDirs: دایرکتوریهای صریح اضافی که برای بررسی مسیرهایsafeBinsمورد اعتماد هستند. entryهایPATHهرگز بهطور خودکار مورد اعتماد قرار نمیگیرند. پیشفرضهای داخلی/binو/usr/binهستند.tools.exec.safeBinProfiles: سیاست argv سفارشی اختیاری برای هر safe bin (minPositional،maxPositional،allowedValueFlags،deniedFlags).
مثال:
{
tools: {
exec: {
pathPrepend: ["~/bin", "/opt/oss/bin"],
},
},
}
مدیریت PATH
host=gateway:PATHمربوط به login-shell شما را در محیط exec ادغام میکند. بازنویسیهایenv.PATHبرای اجرای host رد میشوند. خود daemon همچنان با یکPATHحداقلی اجرا میشود:- macOS:
/opt/homebrew/bin,/usr/local/bin,/usr/bin,/bin - Linux:
/usr/local/bin,/usr/bin,/bin
- macOS:
host=sandbox: داخل container،sh -lc(login shell) را اجرا میکند، بنابراین/etc/profileممکن استPATHرا reset کند. OpenClaw پس از source شدن profile،env.PATHرا از طریق یک env var داخلی به ابتدا اضافه میکند (بدون shell interpolation)؛tools.exec.pathPrependاینجا هم اعمال میشود.host=node: فقط بازنویسیهای env غیرمسدودی که میفرستید به Node ارسال میشوند. بازنویسیهایenv.PATHبرای اجرای host رد میشوند و توسط hostهای Node نادیده گرفته میشوند. اگر روی یک Node به entryهای اضافی PATH نیاز دارید، محیط سرویس host مربوط به Node را پیکربندی کنید (systemd/launchd) یا ابزارها را در مکانهای استاندارد نصب کنید.
Binding هر agent به Node (از index فهرست agent در config استفاده کنید):
openclaw config get agents.list
openclaw config set agents.list[0].tools.exec.node "node-id-or-name"
Control UI: تب Nodes یک panel کوچک «Binding Node برای Exec» برای همان تنظیمات دارد.
بازنویسیهای جلسه (/exec)
از /exec برای تنظیم پیشفرضهای هر جلسه برای host، security، ask، و node استفاده کنید.
برای نمایش مقدارهای فعلی، /exec را بدون argument بفرستید.
مثال:
/exec host=auto security=allowlist ask=on-miss node=mac-1
مدل مجوزدهی
/exec فقط برای فرستندههای مجاز رعایت میشود (allowlistهای channel/pairing بههمراه commands.useAccessGroups).
فقط state جلسه را بهروزرسانی میکند و config نمینویسد. برای غیرفعالسازی سخت exec، آن را از طریق tool
policy رد کنید (tools.deny: ["exec"] یا برای هر agent). تأییدهای Host همچنان اعمال میشوند، مگر اینکه صراحتاً
security=full و ask=off را تنظیم کنید.
تأییدهای Exec (اپلیکیشن همراه / host مربوط به Node)
agentهای sandboxed میتوانند پیش از اجرای exec روی gateway یا host مربوط به Node، تأیید برای هر درخواست را لازم کنند.
برای سیاست، allowlist، و جریان UI، تأییدهای Exec را ببینید.
وقتی تأییدها لازم باشند، ابزار exec بلافاصله با
status: "approval-pending" و یک approval id برمیگردد. پس از تأیید (یا رد / timeout)،
Gateway رویدادهای system منتشر میکند (Exec finished / Exec denied). اگر دستور پس از
tools.exec.approvalRunningNoticeMs همچنان در حال اجرا باشد، یک اعلان Exec running واحد منتشر میشود.
در channelهایی که card/button تأیید بومی دارند، agent باید ابتدا به همان UI بومی تکیه کند و فقط وقتی command دستی /approve را بیاورد که نتیجه tool صراحتاً بگوید تأییدهای chat در دسترس نیستند یا تأیید دستی تنها مسیر است.
Allowlist + safe bins
اعمال allowlist دستی با globهای مسیر binary resolveشده و globهای نام ساده command مطابقت میدهد.
نامهای ساده فقط با commandهایی مطابقت دارند که از طریق PATH فراخوانی شدهاند، پس rg میتواند با
/opt/homebrew/bin/rg وقتی command برابر rg است مطابقت کند، اما نه با ./rg یا /tmp/rg.
وقتی security=allowlist باشد، commandهای shell فقط وقتی بهطور خودکار مجاز میشوند که هر segment در pipeline
در allowlist باشد یا safe bin باشد. زنجیرهسازی (;، &&، ||) و redirectionها
در حالت allowlist رد میشوند، مگر اینکه هر segment سطحبالا allowlist را برآورده کند
(شامل safe binها). Redirectionها همچنان پشتیبانی نمیشوند.
اعتماد پایدار allow-always این قاعده را دور نمیزند: یک command زنجیرهشده همچنان نیاز دارد هر
segment سطحبالا مطابقت داشته باشد.
autoAllowSkills یک مسیر convenience جداگانه در تأییدهای exec است. با entryهای allowlist مسیر دستی یکسان نیست.
برای اعتماد صریح و strict، autoAllowSkills را غیرفعال نگه دارید.
از دو کنترل برای کارهای متفاوت استفاده کنید:
tools.exec.safeBins: فیلترهای stream کوچک، فقط stdin.tools.exec.safeBinTrustedDirs: دایرکتوریهای مورد اعتماد صریح اضافی برای مسیرهای executable مربوط به safe-bin.tools.exec.safeBinProfiles: سیاست argv صریح برای safe binهای سفارشی.- allowlist: اعتماد صریح برای مسیرهای executable.
با safeBins مانند یک فهرست مجاز عمومی رفتار نکنید و باینریهای مفسر/زمان اجرا (برای مثال python3، node، ruby، bash) را اضافه نکنید. اگر به آنها نیاز دارید، از ورودیهای صریح فهرست مجاز استفاده کنید و درخواستهای تأیید را فعال نگه دارید.
openclaw security audit زمانی هشدار میدهد که ورودیهای مفسر/زمان اجرای safeBins فاقد پروفایلهای صریح باشند، و openclaw doctor --fix میتواند ورودیهای سفارشیِ مفقود safeBinProfiles را بسازد.
openclaw security audit و openclaw doctor همچنین زمانی هشدار میدهند که باینریهای با رفتار گسترده مانند jq را بهصورت صریح دوباره به safeBins اضافه کنید.
اگر مفسرها را بهصورت صریح در فهرست مجاز قرار میدهید، 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>" }
چسباندن (بهطور پیشفرض bracketed):
{ "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.5"] },
},
},
}
نکات:
- فقط برای مدلهای OpenAI/OpenAI Codex در دسترس است.
- خطمشی ابزار همچنان اعمال میشود؛
allow: ["write"]بهصورت ضمنیapply_patchرا مجاز میکند. deny: ["write"]باعث ردapply_patchنمیشود؛apply_patchرا صراحتاً رد کنید یا وقتی نوشتنهای patch نیز باید مسدود شوند، ازdeny: ["group:fs"]استفاده کنید.- پیکربندی زیر
tools.exec.applyPatchقرار دارد. - مقدار پیشفرض
tools.exec.applyPatch.enabledبرابرtrueاست؛ برای غیرفعال کردن ابزار برای مدلهای OpenAI، آن را رویfalseبگذارید. - مقدار پیشفرض
tools.exec.applyPatch.workspaceOnlyبرابرtrueاست (محدود به workspace). فقط زمانی آن را رویfalseبگذارید که عمداً میخواهیدapply_patchبیرون از دایرکتوری workspace بنویسد/حذف کند.
مرتبط
- تأییدهای Exec — دروازههای تأیید برای فرمانهای shell
- Sandboxing — اجرای فرمانها در محیطهای sandboxed
- فرایند پسزمینه — exec طولانیمدت و ابزار process
- امنیت — خطمشی ابزار و دسترسی ارتقایافته