أداة exec
شغّل أوامر shell في مساحة العمل. تدعم التنفيذ في المقدمة + الخلفية عبرprocess.
إذا كان process غير مسموح، تعمل exec بشكل متزامن وتتجاهل yieldMs/background.
تكون جلسات الخلفية محددة النطاق لكل وكيل؛ ولا يرى process إلا الجلسات الخاصة بالوكيل نفسه.
المعلمات
command(مطلوب)workdir(القيمة الافتراضية هي cwd)env(تجاوزات key/value)yieldMs(الافتراضي 10000): التحويل التلقائي إلى الخلفية بعد تأخيرbackground(منطقي): الخلفية فورًاtimeout(بالثواني، الافتراضي 1800): القتل عند انتهاء المدةpty(منطقي): التشغيل في pseudo-terminal عند توفره (أدوات CLI التي تعمل فقط مع TTY، ووكلاء البرمجة، وواجهات terminal)host(auto | sandbox | gateway | node): مكان التنفيذsecurity(deny | allowlist | full): وضع الفرض لـgateway/nodeask(off | on-miss | always): مطالبات الموافقة لـgateway/nodenode(سلسلة): معرّف/اسم node لـhost=nodeelevated(منطقي): طلب الوضع المرتفع (الخروج من sandbox إلى مسار المضيف المُهيأ)؛ ولا يُفرضsecurity=fullإلا عندما يُحل elevated إلىfull
- القيمة الافتراضية لـ
hostهيauto: sandbox عندما يكون وقت تشغيل sandbox نشطًا للجلسة، وإلاgateway. autoهي استراتيجية التوجيه الافتراضية، وليست wildcard. يُسمح باستدعاءhost=nodeلكل طلب انطلاقًا منauto؛ ويُسمح باستدعاءhost=gatewayلكل طلب فقط عندما لا يكون أي وقت تشغيل sandbox نشطًا.- من دون أي إعداد إضافي، يظل
host=auto“يعمل ببساطة”: من دون sandbox يُحل إلىgateway؛ ومع sandbox حي يظل داخل sandbox. - يخرج
elevatedمن sandbox إلى مسار المضيف المُهيأ:gatewayافتراضيًا، أوnodeعندما يكونtools.exec.host=node(أو عندما تكون القيمة الافتراضية للجلسة هيhost=node). ولا يكون متاحًا إلا عندما يكون الوصول المرتفع مفعّلًا للجلسة/المزوّد الحاليين. - تتحكم
~/.openclaw/exec-approvals.jsonفي الموافقات الخاصة بـgateway/node. - يتطلب
nodeوجود node مقترن (تطبيق مرافق أو مضيف node بدون واجهة). - إذا كانت عدة nodes متاحة، فاضبط
exec.nodeأوtools.exec.nodeلاختيار واحدة. - إن
exec host=nodeهو مسار تنفيذ shell الوحيد للعُقد؛ وقد أزيل الغلاف القديمnodes.run. - على المضيفات غير Windows، تستخدم exec القيمة
SHELLعند ضبطها؛ وإذا كانتSHELLهيfish، فإنها تفضّلbash(أوsh) منPATHلتجنب scripts غير المتوافقة مع fish، ثم تعود إلىSHELLإذا لم يوجد أي منهما. - على مضيفات Windows، تفضّل exec اكتشاف PowerShell 7 (
pwsh) (Program Files ثم ProgramW6432 ثم PATH)، ثم تعود إلى Windows PowerShell 5.1. - يرفض التنفيذ على المضيف (
gateway/node) القيمةenv.PATHوتجاوزات loader (LD_*/DYLD_*) من أجل منع خطف الملفات الثنائية أو حقن الشيفرة. - يضبط OpenClaw القيمة
OPENCLAW_SHELL=execفي بيئة الأمر المُنشأ (بما في ذلك تنفيذ PTY وsandbox) حتى تتمكن قواعد shell/profile من اكتشاف سياق أداة exec. - مهم: العزل معطّل افتراضيًا. إذا كان العزل معطّلًا، فإن
host=autoالضمني يُحل إلىgateway. أماhost=sandboxالصريح فيفشل مغلقًا بدلًا من التشغيل بصمت على مضيف gateway. فعّل العزل أو استخدمhost=gatewayمع الموافقات. - لا تفحص فحوصات script preflight (للأخطاء الشائعة في صياغة Python/Node shell) إلا الملفات الموجودة داخل
حدود
workdirالفعالة. وإذا كان مسار script يُحل خارجworkdir، فيتم تخطي preflight لذلك الملف. - بالنسبة إلى العمل طويل التشغيل الذي يبدأ الآن، ابدأه مرة واحدة واعتمد على
تنبيه الإكمال التلقائي عندما يكون مفعّلًا ويُخرج الأمر بيانات أو يفشل.
استخدم
processللسجلات، أو الحالة، أو الإدخال، أو التدخل؛ ولا تحاكِ الجدولة باستخدام حلقات sleep، أو حلقات timeout، أو polling المتكرر. - بالنسبة إلى العمل الذي يجب أن يحدث لاحقًا أو وفق جدول، استخدم Cron بدلًا من
أنماط sleep/delay في
exec.
الإعداد
tools.exec.notifyOnExit(الافتراضي: true): عندما تكون true، تدرج جلسات exec التي تعمل في الخلفية حدث نظام وتطلب Heartbeat عند الخروج.tools.exec.approvalRunningNoticeMs(الافتراضي: 10000): إصدار إشعار واحد “قيد التشغيل” عندما تستمر exec المحكومة بالموافقة أكثر من ذلك (0 للتعطيل).tools.exec.host(الافتراضي:auto; ويُحل إلىsandboxعندما يكون وقت تشغيل sandbox نشطًا، وإلىgatewayخلاف ذلك)tools.exec.security(الافتراضي:denyلـ sandbox، وfullلـ gateway + node عند عدم الضبط)tools.exec.ask(الافتراضي:off)- إن تنفيذ المضيف من دون موافقة هو الوضع الافتراضي لـ gateway + node. إذا كنت تريد سلوك الموافقات/قائمة السماح، فشدّد كلًا من
tools.exec.*وملف~/.openclaw/exec-approvals.jsonالخاص بالمضيف؛ راجع Exec approvals. - يأتي وضع YOLO من الإعدادات الافتراضية لسياسة المضيف (
security=full,ask=off)، وليس منhost=auto. إذا كنت تريد فرض التوجيه إلى gateway أو node، فاضبطtools.exec.hostأو استخدم/exec host=.... - في وضع
security=fullمعask=off، يتبع تنفيذ المضيف السياسة المُهيأة مباشرة؛ ولا توجد طبقة إضافية من مرشح تمويه الأوامر الاستدلالي أو رفض 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في حفظ استدعاءات المفسر/script غير الضارة، لكن صيغ inline-eval تظل تطلب الموافقة في كل مرة.tools.exec.pathPrepend: قائمة بالأدلة التي تسبقPATHلتشغيلات exec (gateway + sandbox فقط).tools.exec.safeBins: ملفات ثنائية آمنة تعمل عبر stdin فقط ويمكن تشغيلها من دون إدخالات صريحة في allowlist. لتفاصيل السلوك، راجع Safe bins.tools.exec.safeBinTrustedDirs: أدلة صريحة إضافية موثوقة لفحوصات مسار الملفات التنفيذية الخاصة بـsafeBins. لا تُوثق إدخالاتPATHتلقائيًا أبدًا. والقيم الافتراضية المدمجة هي/binو/usr/bin.tools.exec.safeBinProfiles: سياسة argv مخصصة اختيارية لكل safe bin (minPositional,maxPositional,allowedValueFlags,deniedFlags).
التعامل مع PATH
host=gateway: يدمجPATHالخاص بـ login shell في بيئة exec. وتُرفض تجاوزات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(login shell) داخل الحاوية، لذا قد يعيد/etc/profileضبطPATH. يضيف OpenClaw القيمةenv.PATHقبل الجميع بعد تحميل profile عبر متغير env داخلي (من دون shell interpolation)؛ كما ينطبقtools.exec.pathPrependهنا أيضًا.host=node: تُرسل فقط تجاوزات env غير المحظورة التي تمررها إلى node. وتُرفض تجاوزاتenv.PATHلتنفيذ المضيف ويتم تجاهلها من قِبل مضيفات node. إذا كنت تحتاج إلى إدخالات PATH إضافية على node، فقم بتهيئة بيئة خدمة مضيف node (systemd/launchd) أو ثبّت الأدوات في مواقع قياسية.
تجاوزات الجلسة (/exec)
استخدم /exec لتعيين القيم الافتراضية لكل جلسة الخاصة بـ host وsecurity وask وnode.
أرسل /exec من دون وسائط لعرض القيم الحالية.
مثال:
نموذج التفويض
لا يُحترم/exec إلا للـ مرسلين المخولين (قوائم السماح/الاقتران الخاصة بالقناة بالإضافة إلى commands.useAccessGroups).
وهو يحدّث حالة الجلسة فقط ولا يكتب الإعداد. ولتعطيل exec تعطيلًا صارمًا، امنعه عبر
سياسة الأداة (tools.deny: ["exec"] أو لكل وكيل). ولا تزال موافقات المضيف تنطبق ما لم تضبط
صراحةً security=full وask=off.
Exec approvals (التطبيق المرافق / مضيف node)
يمكن للوكلاء المعزولين أن يطلبوا موافقة لكل طلب قبل تشغيلexec على مضيف gateway أو node.
راجع Exec approvals لمعرفة السياسة وقائمة السماح وتدفق واجهة المستخدم.
عندما تكون الموافقات مطلوبة، تعود أداة exec فورًا مع
status: "approval-pending" ومعرّف موافقة. وبعد الموافقة (أو الرفض / انتهاء المهلة)،
يبعث Gateway أحداث نظام (Exec finished / Exec denied). وإذا ظل الأمر
قيد التشغيل بعد tools.exec.approvalRunningNoticeMs، يُبعث إشعار واحد Exec running.
وفي القنوات التي تحتوي على بطاقات/أزرار موافقة أصلية، يجب على الوكيل الاعتماد على
واجهة المستخدم الأصلية تلك أولًا وعدم تضمين أمر /approve يدوي إلا عندما
تقول نتيجة الأداة صراحة إن موافقات الدردشة غير متاحة أو أن الموافقة اليدوية هي
المسار الوحيد.
قائمة السماح + safe bins
يطابق فرض allowlist اليدوي مسارات الملفات الثنائية المحلولة فقط (من دون مطابقة basename). عندما تكونsecurity=allowlist، تُسمح أوامر shell تلقائيًا فقط إذا كان كل جزء من أجزاء pipeline
موجودًا في allowlist أو كان safe bin. أما chaining (;, &&, ||) وعمليات redirection فتُرفض في
وضع allowlist ما لم يستوفِ كل جزء من المستوى الأعلى allowlist (بما في ذلك safe bins).
ولا تزال redirections غير مدعومة.
ولا تتجاوز الثقة الدائمة allow-always هذه القاعدة: إذ لا يزال الأمر المتسلسل يتطلب أن يطابق كل
جزء من المستوى الأعلى.
يُعد autoAllowSkills مسار راحة منفصلًا في exec approvals. وهو ليس الشيء نفسه مثل
إدخالات allowlist اليدوية للمسارات. وللحصول على ثقة صريحة صارمة، أبقِ autoAllowSkills معطلًا.
استخدم خياري التحكم لهاتين الوظيفتين المختلفتين:
tools.exec.safeBins: مرشحات تدفق صغيرة تعمل عبر stdin فقط.tools.exec.safeBinTrustedDirs: أدلة إضافية صريحة موثوقة لمسارات الملفات التنفيذية الخاصة بـ safe-bin.tools.exec.safeBinProfiles: سياسة argv صريحة لـ safe bins المخصصة.- allowlist: ثقة صريحة لمسارات الملفات التنفيذية.
safeBins باعتباره allowlist عامة، ولا تضف ملفات ثنائية للمفسرات/أوقات التشغيل (مثل python3 أو node أو ruby أو bash). إذا كنت تحتاج إليها، فاستخدم إدخالات allowlist صريحة وأبقِ مطالبات الموافقة مفعلة.
يحذّر openclaw security audit عندما تفتقد إدخالات safeBins الخاصة بالمفسرات/أوقات التشغيل إلى profiles صريحة، ويمكن لـ openclaw doctor --fix إعداد إدخالات safeBinProfiles المخصصة المفقودة.
كما يحذّر openclaw security audit وopenclaw doctor عندما تضيف صراحةً ملفات ثنائية ذات سلوك واسع مثل jq مجددًا إلى safeBins.
وإذا سمحت صراحةً بالمفسرات عبر allowlist، ففعّل tools.exec.strictInlineEval بحيث تظل صيغ eval المضمنة تتطلب موافقة جديدة.
للحصول على تفاصيل السياسة الكاملة والأمثلة، راجع Exec approvals وSafe bins versus allowlist.
أمثلة
المقدمة:apply_patch
يُعدapply_patch أداة فرعية من exec للتعديلات المنظمة متعددة الملفات.
وهو مفعّل افتراضيًا لنماذج OpenAI وOpenAI Codex. استخدم الإعداد فقط
عندما تريد تعطيله أو قصره على نماذج محددة:
- متاحة فقط لنماذج OpenAI/OpenAI Codex.
- لا تزال سياسة الأداة تنطبق؛ و
allow: ["write"]تسمح ضمنيًا بـapply_patch. - يوجد الإعداد ضمن
tools.exec.applyPatch. - تكون القيمة الافتراضية لـ
tools.exec.applyPatch.enabledهيtrue؛ اضبطها علىfalseلتعطيل الأداة لنماذج OpenAI. - تكون القيمة الافتراضية لـ
tools.exec.applyPatch.workspaceOnlyهيtrue(مقيدة بمساحة العمل). اضبطها علىfalseفقط إذا كنت تريد عمدًا أن تكتبapply_patchأو تحذف خارج دليل مساحة العمل.
ذو صلة
- Exec Approvals — بوابات الموافقة لأوامر shell
- Sandboxing — تشغيل الأوامر في بيئات sandbox معزولة
- Background Process — العمليات طويلة التشغيل الخاصة بـ exec وأداة process
- الأمان — سياسة الأداة والوصول المرتفع