Tools
أداة التنفيذ
شغّل أوامر shell في مساحة العمل. يدعم التنفيذ في المقدمة + الخلفية عبر process.
إذا كان process غير مسموح، فسيعمل exec بشكل متزامن ويتجاهل yieldMs/background.
جلسات الخلفية مقيّدة النطاق لكل وكيل؛ يرى process الجلسات من الوكيل نفسه فقط.
المعاملات
commandstringrequiredأمر Shell المطلوب تشغيله.
workdirstringدليل العمل للأمر.
envobjectتجاوزات بيئة على هيئة مفتاح/قيمة تُدمج فوق البيئة الموروثة.
yieldMsnumberانقل الأمر تلقائياً إلى الخلفية بعد هذا التأخير (بالمللي ثانية).
backgroundbooleanانقل الأمر إلى الخلفية فوراً بدلاً من انتظار yieldMs.
timeoutnumberتجاوز مهلة exec المكوّنة لهذه الاستدعاء. عيّن timeout: 0 فقط عندما يجب أن يعمل الأمر بدون مهلة عملية exec.
ptybooleanشغّل داخل طرفية زائفة عندما تكون متاحة. استخدمه مع واجهات CLI التي تتطلب TTY، ووكلاء البرمجة، وواجهات الطرفية.
host'auto' | 'sandbox' | 'gateway' | 'node'مكان التنفيذ. يتحول auto إلى sandbox عند وجود وقت تشغيل sandbox نشط، وإلى gateway بخلاف ذلك.
security'deny' | 'allowlist' | 'full'وضع الإنفاذ لتنفيذ gateway / node.
ask'off' | 'on-miss' | 'always'سلوك مطالبة الموافقة لتنفيذ gateway / node.
nodestringمعرّف/اسم Node عندما يكون host=node.
elevatedbooleanاطلب الوضع المرفوع — اخرج من sandbox إلى مسار المضيف المكوّن. لا يُفرض security=full إلا عندما يُحلّ elevated إلى full.
ملاحظات:
- القيمة الافتراضية لـ
hostهيauto: sandbox عندما يكون وقت تشغيل sandbox نشطاً للجلسة، وإلا فـ Gateway. - يقبل
hostفقطautoأوsandboxأوgatewayأوnode. ليس محدد اسم مضيف؛ تُرفض القيم الشبيهة بأسماء المضيفين قبل تشغيل الأمر. autoهي استراتيجية التوجيه الافتراضية، وليست حرف بدل. يُسمح بـ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. - يتطلب
nodeNode مقترناً (تطبيقاً مرافقاً أو مضيف Node بلا واجهة). - إذا توفرت عدة Nodes، فعيّن
exec.nodeأوtools.exec.nodeلاختيار واحد. exec host=nodeهو مسار تنفيذ shell الوحيد لـ Nodes؛ أُزيل الغلاف القديمnodes.run.- تنطبق
timeoutعلى التنفيذ في المقدمة، والخلفية، وyieldMs، وGateway، وsandbox، وتنفيذsystem.runفي Node. إذا حُذفت، يستخدم OpenClawtools.exec.timeoutSec؛ وتعطّلtimeout: 0الصريحة مهلة عملية exec لذلك الاستدعاء. - على المضيفين غير 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 وsandbox) حتى تتمكن قواعد shell/profile من اكتشاف سياق أداة exec. - يُحظر
openclaw channels loginمنexecلأنه تدفق مصادقة قناة تفاعلي؛ شغّله في طرفية على مضيف Gateway، أو استخدم أداة تسجيل الدخول الأصلية للقناة من الدردشة عندما توجد. - مهم: يكون sandboxing معطلاً افتراضياً. إذا كان sandboxing معطلاً، فإن
host=autoالضمني يتحول إلىgateway. أماhost=sandboxالصريح فيفشل بإغلاق بدلاً من التشغيل بصمت على مضيف Gateway. فعّل sandboxing أو استخدمhost=gatewayمع الموافقات. - لا تفحص فحوصات ما قبل تشغيل السكربت (لأخطاء صياغة shell الشائعة في Python/Node) إلا الملفات داخل
حد
workdirالفعّال. إذا حُلّ مسار سكربت خارجworkdir، يتم تخطي فحص ما قبل التشغيل لذلك الملف. - للعمل طويل الأمد الذي يبدأ الآن، ابدأه مرة واحدة واعتمد على إيقاظ
الإكمال التلقائي عندما يكون مفعلاً ويصدر الأمر مخرجات أو يفشل.
استخدم
processللسجلات أو الحالة أو الإدخال أو التدخل؛ لا تحاكِ الجدولة بحلقات sleep أو حلقات timeout أو الاستطلاع المتكرر. - للعمل الذي يجب أن يحدث لاحقاً أو وفق جدول، استخدم cron بدلاً من
أنماط sleep/delay في
exec.
الإعدادات
tools.exec.notifyOnExit(الافتراضي: true): عند true، تضع جلسات exec المنقولة إلى الخلفية حدث نظام في الطابور وتطلب Heartbeat عند الخروج.tools.exec.approvalRunningNoticeMs(الافتراضي: 10000): أصدِر إشعار "running" واحداً عندما يعمل exec المحكوم بالموافقة لأكثر من هذه المدة (0 يعطّل ذلك).tools.exec.timeoutSec(الافتراضي: 1800): مهلة exec الافتراضية لكل أمر بالثواني. تتجاوزهاtimeoutلكل استدعاء؛ وتعطّلtimeout: 0لكل استدعاء مهلة عملية exec.tools.exec.host(الافتراضي:auto؛ يتحول إلىsandboxعندما يكون وقت تشغيل sandbox نشطاً، وإلىgatewayبخلاف ذلك)tools.exec.security(الافتراضي:denyلـ sandbox، وfullلـ gateway + node عند عدم التعيين)tools.exec.ask(الافتراضي:off)- exec على المضيف بدون موافقة هو الافتراضي لـ gateway + node. إذا أردت سلوك الموافقات/قائمة السماح، فشدّد كلاً من
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، يتبع exec على المضيف السياسة المكوّنة مباشرة؛ لا توجد طبقة إضافية لترشيح استدلالي لإخفاء الأوامر أو رفض ما قبل تشغيل السكربتات. tools.exec.node(الافتراضي: غير معيّن)tools.exec.strictInlineEval(الافتراضي: false): عند true، تتطلب نماذج تقييم المفسّر المضمنة مثل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).
مثال:
{
tools: {
exec: {
pathPrepend: ["~/bin", "/opt/oss/bin"],
},
},
}
التعامل مع PATH
host=gateway: يدمجPATHالخاص بصدفة تسجيل الدخول في بيئة 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(صدفة تسجيل دخول) داخل الحاوية، لذا قد يعيد/etc/profileتعيينPATH. يضيف OpenClawenv.PATHإلى البداية بعد تحميل profile عبر متغير بيئة داخلي (بدون استيفاء shell)؛ وينطبقtools.exec.pathPrependهنا أيضاً.host=node: لا تُرسل إلى Node إلا تجاوزات البيئة غير المحظورة التي تمررها. تُرفض تجاوزاتenv.PATHلتنفيذ المضيف وتتجاهلها مضيفات Node. إذا احتجت إلى إدخالات PATH إضافية على Node، فكوّن بيئة خدمة مضيف Node (systemd/launchd) أو ثبّت الأدوات في المواقع القياسية.
ربط Node لكل وكيل (استخدم فهرس قائمة الوكلاء في الإعدادات):
openclaw config get agents.list
openclaw config set agents.list[0].tools.exec.node "node-id-or-name"
واجهة التحكم: تتضمن علامة تبويب Nodes لوحة صغيرة باسم "ربط Exec بـ Node" للإعدادات نفسها.
تجاوزات الجلسة (/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 (التطبيق المرافق / مضيف Node)
يمكن للوكلاء المعزولين داخل sandbox طلب موافقة لكل طلب قبل تشغيل exec على Gateway أو مضيف Node.
راجع موافقات Exec لمعرفة السياسة وقائمة السماح وتدفق واجهة المستخدم.
عندما تكون الموافقات مطلوبة، تعود أداة exec فوراً مع
status: "approval-pending" ومعرّف موافقة. بعد الموافقة (أو الرفض / انتهاء المهلة)،
يبث Gateway أحداث نظام (Exec finished / Exec denied). إذا ظل الأمر
يعمل بعد tools.exec.approvalRunningNoticeMs، يصدر إشعار واحد Exec running.
في القنوات التي تحتوي على بطاقات/أزرار موافقة أصلية، يجب أن يعتمد الوكيل على
واجهة المستخدم الأصلية تلك أولاً، وألا يضمّن أمر /approve يدوياً إلا عندما
تقول نتيجة الأداة صراحةً إن موافقات الدردشة غير متاحة أو أن الموافقة اليدوية هي
المسار الوحيد.
قائمة السماح + الثنائيات الآمنة
يطابق إنفاذ قائمة السماح اليدوي أنماط مسار الثنائي المحلول وأسماء الأوامر
المجردة. لا تطابق الأسماء المجردة إلا الأوامر المستدعاة عبر PATH، لذلك يمكن أن يطابق rg
المسار /opt/homebrew/bin/rg عندما يكون الأمر rg، لكن ليس ./rg أو /tmp/rg.
عندما يكون 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 والثنائيات الآمنة مقابل قائمة السماح.
أمثلة
في المقدمة:
{ "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.5"] },
},
},
}
ملاحظات:
- متاحة فقط لنماذج OpenAI/OpenAI Codex.
- تظل سياسة الأداة مطبقة؛
allow: ["write"]يسمح ضمنيًا بـapply_patch. - لا يرفض
deny: ["write"]استخدامapply_patch؛ ارفضapply_patchصراحةً أو استخدمdeny: ["group:fs"]عندما ينبغي أيضًا حظر عمليات الكتابة عبر الرقعة. - توجد الإعدادات ضمن
tools.exec.applyPatch. - القيمة الافتراضية لـ
tools.exec.applyPatch.enabledهيtrue؛ اضبطها علىfalseلتعطيل الأداة لنماذج OpenAI. - القيمة الافتراضية لـ
tools.exec.applyPatch.workspaceOnlyهيtrue(محصورة داخل مساحة العمل). اضبطها علىfalseفقط إذا كنت تريد عمدًا أن يكتبapply_patchأو يحذف خارج دليل مساحة العمل.
ذات صلة
- موافقات Exec — بوابات الموافقة لأوامر الصدفة
- العزل — تشغيل الأوامر في بيئات معزولة
- عملية الخلفية — أداة exec وprocess طويلة التشغيل
- الأمان — سياسة الأداة والوصول المرتفع