Tools
ابزار اجرا
اجرای فرمانهای شل در فضای کاری. exec یک سطح شل تغییردهنده است: فرمانها میتوانند هرجا که میزبان انتخابشده یا سامانهٔ فایل sandbox اجازه دهد، فایل ایجاد، ویرایش یا حذف کنند. غیرفعال کردن ابزارهای سامانهٔ فایل OpenClaw مانند write، edit، یا apply_patch باعث نمیشود exec فقطخواندنی شود.
از اجرای پیشزمینه و پسزمینه از طریق process پشتیبانی میکند. اگر process مجاز نباشد، exec بهصورت همگام اجرا میشود و yieldMs/background را نادیده میگیرد.
نشستهای پسزمینه برای هر عامل محدودهبندی میشوند؛ process فقط نشستهای همان عامل را میبیند.
پارامترها
commandstringrequiredفرمان شلی که باید اجرا شود.
workdirstringdefault: cwdدایرکتوری کاری برای فرمان.
envobjectبازنویسیهای محیطی کلید/مقدار که روی محیط بهارثرسیده ادغام میشوند.
yieldMsnumberdefault: 10000پس از این تأخیر (میلیثانیه)، فرمان را خودکار به پسزمینه ببرد.
backgroundbooleandefault: falseفرمان را بهجای انتظار برای yieldMs بلافاصله به پسزمینه ببرد.
timeoutnumberdefault: tools.exec.timeoutSecمهلت زمانی پیکربندیشدهٔ exec را برای این فراخوانی بازنویسی میکند. timeout: 0 را فقط وقتی تنظیم کنید که فرمان باید بدون مهلت زمانی فرایند exec اجرا شود.
ptybooleandefault: falseدر صورت دسترس بودن، در یک شبهترمینال اجرا شود. برای CLIهای فقط TTY، عاملهای کدنویسی، و رابطهای کاربری ترمینالی استفاده کنید.
host'auto' | 'sandbox' | 'gateway' | 'node'default: autoمحل اجرا. وقتی runtime مربوط به sandbox فعال باشد، auto به sandbox، و در غیر این صورت به gateway resolve میشود.
security'deny' | 'allowlist' | 'full'برای فراخوانیهای عادی ابزار نادیده گرفته میشود. امنیت gateway / node توسط
tools.exec.security و ~/.openclaw/exec-approvals.json کنترل میشود؛ حالت elevated فقط وقتی میتواند
security=full را اجبار کند که اپراتور صراحتاً دسترسی elevated بدهد.
ask'off' | 'on-miss' | 'always'رفتار اعلان تأیید برای اجرای gateway / node.
nodestringشناسه/نام Node وقتی host=node باشد.
elevatedbooleandefault: falseدرخواست حالت elevated — خروج از sandbox به مسیر میزبان پیکربندیشده. security=full فقط وقتی اجبار میشود که elevated به full resolve شود.
نکات:
hostبهطور پیشفرضautoاست: وقتی runtime مربوط به sandbox برای نشست فعال باشد sandbox، و در غیر این صورت gateway.hostفقطauto،sandbox،gateway، یاnodeرا میپذیرد. این گزینه انتخابگر نام میزبان نیست؛ مقدارهای شبیه نام میزبان پیش از اجرای فرمان رد میشوند.autoراهبرد مسیریابی پیشفرض است، نه یک wildcard.host=nodeدر سطح هر فراخوانی ازautoمجاز است؛host=gatewayدر سطح هر فراخوانی فقط وقتی مجاز است که runtime مربوط به sandbox فعال نباشد.- بدون پیکربندی اضافه،
host=autoهمچنان «فقط کار میکند»: نبود sandbox یعنی بهgatewayresolve میشود؛ sandbox زنده یعنی داخل sandbox میماند. elevatedاز sandbox به مسیر میزبان پیکربندیشده خارج میشود: بهطور پیشفرضgateway، یا وقتیtools.exec.host=nodeباشد (یا پیشفرض نشستhost=nodeباشد)node. این قابلیت فقط وقتی در دسترس است که دسترسی elevated برای نشست/ارائهدهندهٔ فعلی فعال باشد.- تأییدهای
gateway/nodeتوسط~/.openclaw/exec-approvals.jsonکنترل میشوند. nodeبه یک node جفتشده نیاز دارد (companion app یا میزبان node بدون رابط).- اگر چند node در دسترس باشد، برای انتخاب یکی
exec.nodeیاtools.exec.nodeرا تنظیم کنید. exec host=nodeتنها مسیر اجرای شل برای nodeها است؛ wrapper قدیمیnodes.runحذف شده است.timeoutبرای اجرای پیشزمینه، پسزمینه،yieldMs، gateway، sandbox، و اجرایsystem.runمربوط به node اعمال میشود. اگر حذف شود، OpenClaw ازtools.exec.timeoutSecاستفاده میکند؛timeout: 0صریح مهلت زمانی فرایند exec را برای آن فراخوانی غیرفعال میکند.- روی میزبانهای غیر Windows، exec وقتی
SHELLتنظیم شده باشد از آن استفاده میکند؛ اگرSHELLبرابرfishباشد، برای پرهیز از اسکریپتهای ناسازگار با fish،bash(یاsh) را ازPATHترجیح میدهد، سپس اگر هیچکدام وجود نداشته باشند بهSHELLبرمیگردد. - روی میزبانهای Windows، exec کشف PowerShell 7 (
pwsh) را ترجیح میدهد (Program Files، ProgramW6432، سپس PATH)، سپس به Windows PowerShell 5.1 برمیگردد. - اجرای میزبان (
gateway/node) مقدارهای override برایenv.PATHو loader (LD_*/DYLD_*) را رد میکند تا از ربایش باینری یا کد تزریقشده جلوگیری شود. - OpenClaw در محیط فرمان ایجادشده
OPENCLAW_SHELL=execرا تنظیم میکند (از جمله اجرای PTY و sandbox) تا قواعد shell/profile بتوانند زمینهٔ ابزار exec را تشخیص دهند. openclaw channels loginازexecمسدود شده است چون یک جریان تعاملی احراز هویت کانال است؛ آن را در ترمینالی روی میزبان gateway اجرا کنید، یا وقتی وجود دارد از ابزار ورود بومی کانال در چت استفاده کنید.- مهم: sandboxing بهطور پیشفرض خاموش است. اگر sandboxing خاموش باشد،
host=autoضمنی بهgatewayresolve میشود.host=sandboxصریح همچنان بهصورت بسته شکست میخورد، نه اینکه بیصدا روی میزبان gateway اجرا شود. sandboxing را فعال کنید یا ازhost=gatewayهمراه با تأییدها استفاده کنید. - بررسیهای preflight اسکریپت (برای خطاهای رایج نحو شل Python/Node) فقط فایلهای داخل مرز
مؤثر
workdirرا بررسی میکنند. اگر مسیر اسکریپت بیرون ازworkdirresolve شود، preflight برای آن فایل رد میشود. - برای کارهای طولانیمدتی که اکنون شروع میشوند، آن را یکبار شروع کنید و وقتی فعال است و فرمان خروجی میدهد یا شکست میخورد، به بیدارباش تکمیل خودکار تکیه کنید.
از
processبرای لاگها، وضعیت، ورودی، یا مداخله استفاده کنید؛ زمانبندی را با حلقههای sleep، حلقههای timeout، یا polling تکراری شبیهسازی نکنید. - برای کاری که باید بعداً یا طبق برنامه انجام شود، بهجای الگوهای sleep/delay در
execاز Cron استفاده کنید.
پیکربندی
tools.exec.notifyOnExit(پیشفرض: true): وقتی true باشد، نشستهای exec پسزمینهشده هنگام خروج یک رویداد سامانه را در صف میگذارند و یک Heartbeat درخواست میکنند.tools.exec.approvalRunningNoticeMs(پیشفرض: 10000): وقتی یک exec نیازمند تأیید بیش از این مدت اجرا شود، یک اعلان واحد «running» منتشر میکند (0 غیرفعال میکند).tools.exec.timeoutSec(پیشفرض: 1800): مهلت زمانی پیشفرض exec برای هر فرمان بر حسب ثانیه.timeoutدر سطح هر فراخوانی آن را بازنویسی میکند؛timeout: 0در سطح هر فراخوانی مهلت زمانی فرایند exec را غیرفعال میکند.tools.exec.host(پیشفرض:auto؛ وقتی runtime مربوط به sandbox فعال باشد بهsandbox، و در غیر این صورت بهgatewayresolve میشود)tools.exec.security(پیشفرض:denyبرای sandbox، و وقتی تنظیم نشده باشدfullبرای gateway + node)tools.exec.ask(پیشفرض:off)- exec میزبان بدون تأیید، پیشفرض gateway + node است. اگر رفتار تأیید/allowlist میخواهید، هم
tools.exec.*و هم~/.openclaw/exec-approvals.jsonمیزبان را سختگیرانهتر کنید؛ تأییدهای Exec را ببینید. - YOLO از پیشفرضهای سیاست میزبان میآید (
security=full،ask=off)، نه ازhost=auto. اگر میخواهید مسیریابی gateway یا node را اجبار کنید،tools.exec.hostرا تنظیم کنید یا از/exec host=...استفاده کنید. - در حالت
security=fullبههمراهask=off، host exec مستقیماً از سیاست پیکربندیشده پیروی میکند؛ هیچ لایهٔ اضافی heuristic برای پیشفیلتر ابهامسازی فرمان یا رد script-preflight وجود ندارد. tools.exec.node(پیشفرض: تنظیمنشده)tools.exec.strictInlineEval(پیشفرض: false): وقتی true باشد، فرمهای eval درونخطی مفسر مانندpython -c،node -e،ruby -e،perl -e،php -r،lua -e، وosascript -eهمیشه به تأیید صریح نیاز دارند.allow-alwaysهمچنان میتواند فراخوانیهای بیضرر مفسر/اسکریپت را ماندگار کند، اما فرمهای inline-eval همچنان هر بار اعلان میدهند.tools.exec.commandHighlighting(پیشفرض: false): وقتی true باشد، اعلانهای تأیید میتوانند بخشهای فرمان استخراجشده توسط parser را در متن فرمان برجسته کنند. برای فعالسازی برجستهسازی متن فرمان بدون تغییر سیاست تأیید exec، آن را بهصورت سراسری یا برای هر عامل رویtrueتنظیم کنید.tools.exec.pathPrepend: فهرست دایرکتوریهایی که برای اجراهای exec به ابتدایPATHافزوده میشوند (فقط gateway + sandbox).tools.exec.safeBins: باینریهای امن فقط-stdin که میتوانند بدون ورودیهای allowlist صریح اجرا شوند. برای جزئیات رفتار، باینریهای امن را ببینید.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 ادغام میکند. مقدارهای override برایenv.PATHدر اجرای میزبان رد میشوند. خود daemon همچنان با یک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 پس از بارگذاری profile،env.PATHرا از طریق یک متغیر محیطی داخلی (بدون interpolation شل) به ابتدا اضافه میکند؛tools.exec.pathPrependاینجا هم اعمال میشود.host=node: فقط overrideهای env مسدودنشدهای که ارسال میکنید به node فرستاده میشوند. مقدارهای override برایenv.PATHدر اجرای میزبان رد میشوند و میزبانهای node آنها را نادیده میگیرند. اگر روی یک node به ورودیهای PATH اضافی نیاز دارید، محیط سرویس میزبان node (systemd/launchd) را پیکربندی کنید یا ابزارها را در مکانهای استاندارد نصب کنید.
اتصال node در سطح هر عامل (از شاخص فهرست عامل در config استفاده کنید):
openclaw config get agents.listopenclaw config set agents.list[0].tools.exec.node "node-id-or-name"رابط کاربری کنترل: زبانهٔ Nodes شامل یک پنل کوچک «Exec node binding» برای همین تنظیمات است.
بازنویسیهای نشست (/exec)
از /exec برای تنظیم پیشفرضهای در سطح هر نشست برای host، security، ask، و node استفاده کنید.
برای نمایش مقدارهای فعلی، /exec را بدون آرگومان ارسال کنید.
مثال:
/exec host=auto security=allowlist ask=on-miss node=mac-1مدل مجوزدهی
/exec فقط برای فرستندههای مجاز رعایت میشود (allowlistهای کانال/جفتسازی بههمراه commands.useAccessGroups).
فقط وضعیت نشست را بهروزرسانی میکند و config نمینویسد. برای غیرفعالسازی سخت exec، آن را از طریق سیاست ابزار
رد کنید (tools.deny: ["exec"] یا در سطح هر عامل). تأییدهای میزبان همچنان اعمال میشوند، مگر اینکه صراحتاً
security=full و ask=off را تنظیم کنید.
تأییدهای Exec (companion app / میزبان node)
عاملهای sandboxشده میتوانند پیش از اجرای exec روی میزبان gateway یا node به تأیید برای هر درخواست نیاز داشته باشند.
برای سیاست، allowlist، و جریان رابط کاربری، تأییدهای Exec را ببینید.
وقتی تأییدها لازم باشند، ابزار exec بلافاصله با
status: "approval-pending" و یک شناسهٔ تأیید برمیگردد. پس از تأیید (یا رد / timeout)،
Gateway رویدادهای سامانه را منتشر میکند (Exec finished / Exec denied). اگر فرمان پس از
tools.exec.approvalRunningNoticeMs همچنان در حال اجرا باشد، یک اعلان واحد Exec running منتشر میشود.
در کانالهایی با کارتها/دکمههای تأیید بومی، عامل باید ابتدا به همان
رابط کاربری بومی تکیه کند و فقط وقتی نتیجهٔ ابزار صراحتاً میگوید تأییدهای چت در دسترس نیستند یا تأیید دستی تنها مسیر است، یک فرمان دستی /approve درج کند.
Allowlist + باینریهای امن
اعمال allowlist دستی با globهای مسیر باینری resolveشده و globهای نام فرمان خام تطبیق میدهد. نامهای خام فقط فرمانهایی را تطبیق میدهند که از طریق PATH فراخوانی شدهاند، بنابراین وقتی فرمان rg باشد، rg میتواند
/opt/homebrew/bin/rg را تطبیق دهد، اما نه ./rg یا /tmp/rg.
وقتی security=allowlist باشد، فرمانهای شل فقط زمانی خودکار مجاز میشوند که هر segment در pipeline
در allowlist باشد یا یک باینری امن باشد. زنجیرهسازی (;، &&، ||) و redirectionها
در حالت allowlist رد میشوند، مگر اینکه هر segment سطحبالا
allowlist را برآورده کند (از جمله باینریهای امن). Redirectionها همچنان پشتیبانی نمیشوند.
اعتماد پایدار allow-always این قاعده را دور نمیزند: یک فرمان زنجیرهشده همچنان نیاز دارد هر
segment سطحبالا تطبیق داشته باشد.
autoAllowSkills یک مسیر راحتی جداگانه در تأییدهای exec است. این با
ورودیهای allowlist مسیر دستی یکسان نیست. برای اعتماد صریح سختگیرانه، autoAllowSkills را غیرفعال نگه دارید.
از این دو کنترل برای کارهای متفاوت استفاده کنید:
tools.exec.safeBins: فیلترهای جریانی کوچک و فقط مبتنی بر stdin.tools.exec.safeBinTrustedDirs: دایرکتوریهای مورداعتماد اضافی و صریح برای مسیرهای اجرایی safe-bin.tools.exec.safeBinProfiles: سیاست argv صریح برای safe binهای سفارشی.- فهرست مجاز: اعتماد صریح برای مسیرهای اجرایی.
با safeBins مثل یک فهرست مجاز عمومی رفتار نکنید و باینریهای مفسر/زمان اجرا (برای مثال python3، node، ruby، bash) را اضافه نکنید. اگر به آنها نیاز دارید، از ورودیهای صریح فهرست مجاز استفاده کنید و اعلانهای تأیید را فعال نگه دارید.
openclaw security audit وقتی ورودیهای safeBins مفسر/زمان اجرا پروفایلهای صریح نداشته باشند هشدار میدهد، و openclaw doctor --fix میتواند ورودیهای سفارشیِ گمشدهی safeBinProfiles را داربستسازی کند.
openclaw security audit و openclaw doctor همچنین وقتی binهای با رفتار گسترده مانند 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 — اجرای فرمانها در محیطهای sandboxشده
- فرایند پسزمینه — ابزار exec و process طولانیاجرا
- امنیت — سیاست ابزار و دسترسی ارتقایافته