أداة Exec
شغّل أوامر shell في مساحة العمل. تدعم التنفيذ في المقدمة + الخلفية عبرprocess.
إذا كان process غير مسموح، فإن exec يعمل بشكل متزامن ويتجاهل yieldMs/background.
نطاق جلسات الخلفية يكون لكل وكيل؛ ولا يرى process إلا الجلسات الخاصة بالوكيل نفسه.
المعلمات
command(مطلوب)workdir(الافتراضي هو cwd)env(تجاوزات مفتاح/قيمة)yieldMs(الافتراضي 10000): التحويل التلقائي إلى الخلفية بعد تأخيرbackground(قيمة منطقية): التشغيل في الخلفية فورًاtimeout(بالثواني، الافتراضي 1800): الإنهاء عند انتهاء المهلةpty(قيمة منطقية): التشغيل في pseudo-terminal عندما يكون متاحًا (CLI التي تعمل فقط مع TTY، ووكلاء البرمجة، وواجهات الطرفية)host(auto | sandbox | gateway | node): مكان التنفيذsecurity(deny | allowlist | full): وضع الفرض لـgateway/nodeask(off | on-miss | always): مطالبات الموافقة لـgateway/nodenode(سلسلة نصية): معرّف/اسم العقدة عندhost=nodeelevated(قيمة منطقية): طلب الوضع المرتفع (الخروج من الصندوق المعزول إلى مسار المضيف المضبوط)؛ لا يتم فرضsecurity=fullإلا عندما يُحلelevatedإلىfull
- القيمة الافتراضية لـ
hostهيauto: الصندوق المعزول عندما يكون وقت تشغيل الصندوق المعزول نشطًا للجلسة، وإلاgateway. autoهو إستراتيجية التوجيه الافتراضية، وليس بدلًا عامًا. يُسمح لكل استدعاء على حدة بـhost=nodeانطلاقًا منauto؛ ولا يُسمح لكل استدعاء على حدة بـhost=gatewayإلا عندما لا يكون وقت تشغيل الصندوق المعزول نشطًا.- من دون أي إعدادات إضافية، يظل
host=auto“يعمل ببساطة”: إذا لم يوجد صندوق معزول فإنه يُحل إلىgateway؛ وإذا كان هناك صندوق معزول نشط فإنه يبقى داخله. - يقوم
elevatedبالخروج من الصندوق المعزول إلى مسار المضيف المضبوط:gatewayافتراضيًا، أوnodeعندما تكونtools.exec.host=node(أو يكون الافتراضي للجلسة هوhost=node). ولا يكون متاحًا إلا عندما يكون الوصول المرتفع مفعّلًا للجلسة/المزوّد الحالي. - تتحكم
~/.openclaw/exec-approvals.jsonفي موافقاتgateway/node. - يتطلب
nodeعقدة مقترنة (تطبيق مصاحب أو مضيف عقدة headless). - إذا كانت هناك عدة عقد متاحة، فاضبط
exec.nodeأوtools.exec.nodeلاختيار واحدة منها. exec host=nodeهو مسار تنفيذ shell الوحيد للعقد؛ وقد أُزيل المغلف القديمnodes.run.- على المضيفات غير Windows، تستخدم exec القيمة
SHELLعند تعيينها؛ وإذا كانتSHELLهيfish، فإنها تفضّلbash(أوsh) منPATHلتجنب السكربتات غير المتوافقة مع fish، ثم تعود إلىSHELLإذا لم يوجد أي منهما. - على مضيفات Windows، تفضّل exec اكتشاف PowerShell 7 (
pwsh) (Program Files، ثم ProgramW6432، ثم PATH)، ثم تعود إلى Windows PowerShell 5.1. - يرفض التنفيذ على المضيف (
gateway/node) القيمenv.PATHوتجاوزات المحمّل (LD_*/DYLD_*) لمنع اختطاف الملفات التنفيذية أو حقن الشيفرة. - يضبط OpenClaw القيمة
OPENCLAW_SHELL=execفي بيئة الأمر المُشغَّل (بما في ذلك تنفيذ PTY والتنفيذ داخل الصندوق المعزول) حتى تتمكن قواعد shell/profile من اكتشاف سياق أداة exec. - مهم: الصندوق المعزول معطل افتراضيًا. إذا كان الصندوق المعزول معطلًا، فإن
host=autoالضمني يُحل إلىgateway. أماhost=sandboxالصريح فلا يزال يفشل بشكل مغلق بدلًا من التشغيل بصمت على مضيف gateway. فعّل الصندوق المعزول أو استخدمhost=gatewayمع الموافقات. - لا تفحص تحققات ما قبل تشغيل السكربتات (للأخطاء الشائعة في صياغة shell الخاصة بـ Python/Node) إلا الملفات الموجودة داخل
حدود
workdirالفعّالة. وإذا كان مسار السكربت يُحل خارجworkdir، فيتم تخطي الفحص المسبق لذلك الملف. - بالنسبة إلى الأعمال طويلة التشغيل التي تبدأ الآن، ابدأها مرة واحدة واعتمد على
الاستيقاظ التلقائي عند الاكتمال عندما يكون مفعّلًا ويُصدر الأمر مخرجات أو يفشل.
استخدم
processللسجلات أو الحالة أو الإدخال أو التدخل؛ ولا تحاكِ الجدولة بحلقات sleep أو حلقات timeout أو الاستقصاء المتكرر. - بالنسبة إلى الأعمال التي يجب أن تحدث لاحقًا أو وفق جدول زمني، استخدم cron بدلًا من
أنماط sleep/delay في
exec.
الإعدادات
tools.exec.notifyOnExit(الافتراضي: true): عند تفعيله، تضع جلسات exec التي تعمل في الخلفية حدث نظام في الطابور وتطلب نبضة عند الخروج.tools.exec.approvalRunningNoticeMs(الافتراضي: 10000): يصدر إشعارًا واحدًا “قيد التشغيل” عندما يستمر exec الخاضع للموافقة أكثر من هذه المدة (تعطيل عند 0).tools.exec.host(الافتراضي:auto؛ ويُحل إلىsandboxعندما يكون وقت تشغيل الصندوق المعزول نشطًا، وإلا إلىgateway)tools.exec.security(الافتراضي:denyللصندوق المعزول، وfullلـ gateway + node عند عدم التعيين)tools.exec.ask(الافتراضي:off)- تنفيذ المضيف من دون موافقة هو الافتراضي لـ gateway + node. إذا كنت تريد سلوك الموافقات/قائمة السماح، فشدّد كلًا من
tools.exec.*وملف سياسة المضيف~/.openclaw/exec-approvals.json؛ راجع موافقات Exec. - يأتي وضع YOLO من إعدادات سياسة المضيف الافتراضية (
security=full،ask=off)، وليس منhost=auto. إذا كنت تريد فرض التوجيه إلى gateway أو node، فاضبطtools.exec.hostأو استخدم/exec host=.... tools.exec.node(الافتراضي: غير معيّن)tools.exec.strictInlineEval(الافتراضي: false): عند تفعيله، تتطلب دائمًا صيغ eval المضمنة للمفسرات مثلpython -cوnode -eوruby -eوperl -eوphp -rوlua -eوosascript -eموافقة صريحة. لا يزال بإمكانallow-alwaysحفظ الثقة في استدعاءات المفسرات/السكربتات غير الضارة، لكن صيغ inline-eval ستظل تطلب الموافقة في كل مرة.tools.exec.pathPrepend: قائمة بالأدلة التي تسبقPATHفي تشغيلات exec (gateway + sandbox فقط).tools.exec.safeBins: ملفات تنفيذية آمنة تعمل فقط مع stdin ويمكنها العمل من دون إدخالات صريحة في قائمة السماح. لتفاصيل السلوك، راجع الملفات التنفيذية الآمنة.tools.exec.safeBinTrustedDirs: أدلة إضافية صريحة موثوقة لفحوصات مسار الملفات التنفيذية فيsafeBins. لا تُعتبر إدخالاتPATHموثوقة تلقائيًا أبدًا. القيم الافتراضية المضمنة هي/binو/usr/bin.tools.exec.safeBinProfiles: سياسة argv مخصصة اختيارية لكل ملف تنفيذي آمن (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 عبر متغير بيئة داخلي (من دون إدراج shell)؛ وينطبقtools.exec.pathPrependهنا أيضًا.host=node: لا تُرسل إلى العقدة إلا تجاوزات البيئة غير المحظورة التي تمررها. وتُرفض تجاوزاتenv.PATHفي تنفيذ المضيف ويتم تجاهلها من مضيفات العقد. وإذا كنت تحتاج إلى إدخالات PATH إضافية على عقدة، فاضبط بيئة خدمة مضيف العقدة (systemd/launchd) أو ثبّت الأدوات في المواقع القياسية.
تجاوزات الجلسة (/exec)
استخدم /exec لتعيين القيم الافتراضية لكل جلسة لكل من host وsecurity وask وnode.
أرسل /exec بدون وسائط لعرض القيم الحالية.
مثال:
نموذج التفويض
لا يتم قبول/exec إلا من المرسلين المصرّح لهم (قوائم السماح/الإقران الخاصة بالقنوات بالإضافة إلى commands.useAccessGroups).
وهو يحدّث حالة الجلسة فقط ولا يكتب إلى الإعدادات. لتعطيل exec بشكل صارم، ارفضه عبر
سياسة الأدوات (tools.deny: ["exec"] أو لكل وكيل). تظل موافقات المضيف مطبقة ما لم تضبط
صراحةً security=full وask=off.
موافقات Exec (التطبيق المصاحب / مضيف العقدة)
يمكن للوكلاء داخل الصندوق المعزول أن يتطلبوا موافقة لكل طلب قبل تشغيلexec على مضيف gateway أو node.
راجع موافقات Exec للاطلاع على السياسة وقائمة السماح وتدفق واجهة المستخدم.
عندما تكون الموافقات مطلوبة، تعيد أداة exec فورًا النتيجة
status: "approval-pending" ومعرّف موافقة. وبمجرد الموافقة (أو الرفض / انتهاء المهلة)،
تصدر Gateway أحداث نظام (Exec finished / Exec denied). وإذا ظل الأمر
قيد التشغيل بعد tools.exec.approvalRunningNoticeMs، فسيصدر إشعار واحد Exec running.
على القنوات التي تدعم بطاقات/أزرار الموافقة الأصلية، يجب أن يعتمد الوكيل على
واجهة المستخدم الأصلية أولًا وألا يضمّن أمر /approve يدويًا إلا عندما توضح
نتيجة الأداة صراحةً أن الموافقات عبر الدردشة غير متاحة أو أن الموافقة اليدوية هي
المسار الوحيد.
قائمة السماح + الملفات التنفيذية الآمنة
يطابق فرض قائمة السماح اليدوية مسارات الملفات التنفيذية المحلولة فقط (من دون مطابقة الاسم الأساسي). عندما تكونsecurity=allowlist، لا يُسمح تلقائيًا بأوامر shell إلا إذا كان كل جزء من pipeline
مدرجًا في قائمة السماح أو ملفًا تنفيذيًا آمنًا. وتُرفض السلاسل (;, &&, ||) وعمليات إعادة التوجيه في
وضع قائمة السماح ما لم يستوفِ كل جزء من المستوى الأعلى قائمة السماح (بما في ذلك الملفات التنفيذية الآمنة).
ولا تزال عمليات إعادة التوجيه غير مدعومة.
ولا تتجاوز الثقة الدائمة 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.
إذا أضفت المفسرات صراحةً إلى قائمة السماح، ففعّل tools.exec.strictInlineEval حتى تظل صيغ تقييم الشيفرة المضمنة تتطلب موافقة جديدة.
للاطلاع على تفاصيل السياسة الكاملة والأمثلة، راجع موافقات Exec والملفات التنفيذية الآمنة مقابل قائمة السماح.
أمثلة
التنفيذ في المقدمة: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 — بوابات الموافقة لأوامر shell
- العزل — تشغيل الأوامر في بيئات معزولة
- عملية الخلفية — التنفيذ الطويل عبر exec وأداة process
- الأمان — سياسة الأدوات والوصول المرتفع