18 KiB
| read_when | summary | title | x-i18n | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
استخدام أداة Exec، وأوضاع stdin، ودعم TTY | أداة Exec |
|
أداة Exec
شغّل أوامر shell في مساحة العمل. تدعم التنفيذ في المقدمة + الخلفية عبر process.
إذا كان process غير مسموح، تعمل exec بشكل متزامن وتتجاهل yieldMs/background.
جلسات الخلفية تكون ضمن نطاق كل وكيل؛ ولا يرى process إلا الجلسات الخاصة بالوكيل نفسه.
المعلمات
command(مطلوب)workdir(الافتراضي هو cwd)env(تجاوزات key/value)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(قيمة منطقية): طلب وضع مرتفع الصلاحية (الخروج من sandbox إلى مسار المضيف المكوَّن)؛ ولا يُفرَضsecurity=fullإلا عندما يُحل elevated إلىfull
ملاحظات:
- الإعداد الافتراضي لـ
hostهوauto: sandbox عندما يكون وقت تشغيل sandbox نشطًا للجلسة، وإلا gateway. autoهو استراتيجية التوجيه الافتراضية، وليس wildcard. يُسمح باستخدامhost=nodeلكل استدعاء منauto؛ أماhost=gatewayلكل استدعاء فلا يُسمح به إلا عندما لا يكون وقت تشغيل sandbox نشطًا.- بدون أي تكوين إضافي، يظل
host=auto"يعمل ببساطة": إذا لم توجد sandbox فسيُحل إلىgateway؛ وإذا كانت هناك sandbox نشطة فسيبقى داخلها. - يؤدي
elevatedإلى الخروج من sandbox إلى مسار المضيف المكوَّن:gatewayافتراضيًا، أوnodeعندما يكونtools.exec.host=node(أو تكون الجلسة افتراضيًاhost=node). وهو متاح فقط عندما يكون الوصول المرتفع الصلاحية مفعّلًا للجلسة/الموفّر الحالي. - تتحكم
~/.openclaw/exec-approvals.jsonفي موافقاتgateway/node. - يتطلب
nodeعقدة مقترنة (تطبيقًا مرافقًا أو مضيف عقدة بدون واجهة). - إذا كانت هناك عدة عقد متاحة، فاضبط
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وتجاوزات loader (LD_*/DYLD_*) من أجل منع اختطاف الثنائيات أو حقن الشيفرة. - يضبط OpenClaw القيمة
OPENCLAW_SHELL=execفي بيئة الأمر المشغَّل (بما في ذلك تنفيذ PTY وsandbox) حتى تتمكن قواعد shell/profile من اكتشاف سياق أداة exec. - مهم: يكون sandboxing معطلًا افتراضيًا. إذا كان sandboxing معطلًا، فإن
host=autoالضمني يُحل إلىgateway. أماhost=sandboxالصريح فيفشل بشكل مغلق بدلًا من التشغيل بصمت على مضيف gateway. فعّل sandboxing أو استخدمhost=gatewayمع الموافقات. - لا تفحص عمليات preflight للسكربتات (لأخطاء صياغة shell الشائعة في Python/Node) إلا الملفات داخل
حدود
workdirالفعالة. إذا كان مسار السكربت يُحل خارج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. إذا كنت تريد سلوك الموافقات/allowlist، فشدّد كلًا من
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، يتبع تنفيذ المضيف السياسة المكوّنة مباشرة؛ ولا توجد مصفاة heuristic إضافية مسبقة لتعتيم الأوامر. 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.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).
مثال:
{
tools: {
exec: {
pathPrepend: ["~/bin", "/opt/oss/bin"],
},
},
}
التعامل مع 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 إضافية على عقدة، فقم بتكوين بيئة خدمة مضيف العقدة (systemd/launchd) أو ثبّت الأدوات في مواقع قياسية.
ربط العقدة لكل وكيل (استخدم فهرس قائمة الوكلاء في التكوين):
openclaw config get agents.list
openclaw config set agents.list[0].tools.exec.node "node-id-or-name"
Control UI: تتضمن علامة تبويب Nodes لوحة صغيرة باسم “Exec node binding” للإعدادات نفسها.
تجاوزات الجلسة (/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 (التطبيق المرافق / مضيف العقدة)
يمكن للوكلاء داخل sandbox أن يطلبوا موافقة لكل طلب قبل تشغيل exec على مضيف gateway أو node.
راجع Exec approvals لمعرفة السياسة، وallowlist، وتدفق واجهة المستخدم.
عندما تكون الموافقات مطلوبة، تعيد أداة exec فورًا
status: "approval-pending" ومعه معرّف موافقة. وبمجرد الموافقة (أو الرفض / انتهاء المهلة)،
تصدر البوابة أحداث نظام (Exec finished / Exec denied). وإذا كان الأمر ما يزال
قيد التشغيل بعد tools.exec.approvalRunningNoticeMs، يصدر إشعار واحد Exec running.
في القنوات التي تحتوي على بطاقات/أزرار موافقة أصلية، يجب على الوكيل الاعتماد على
واجهة المستخدم الأصلية هذه أولًا وعدم تضمين أمر /approve اليدوي إلا عندما
تشير نتيجة الأداة صراحة إلى أن موافقات الدردشة غير متاحة أو أن الموافقة اليدوية هي
المسار الوحيد.
Allowlist + Safe bins
تطابق عملية فرض allowlist اليدوية مسارات الثنائيات المحلولة فقط (من دون مطابقة اسم الأساس). عندما
يكون security=allowlist، تُسمح أوامر shell تلقائيًا فقط إذا كان كل مقطع في pipeline
ضمن allowlist أو safe bin. وتُرفض عمليات التسلسل (;, &&, ||) وعمليات إعادة التوجيه في
وضع allowlist ما لم يستوفِ كل مقطع من المستوى الأعلى allowlist (بما في ذلك safe bins).
وتظل عمليات إعادة التوجيه غير مدعومة.
ولا تتجاوز الثقة الدائمة عبر allow-always هذه القاعدة: إذ يظل الأمر المتسلسل يتطلب أن يطابق كل
مقطع من المستوى الأعلى.
يمثل autoAllowSkills مسار تسهيل منفصلًا في موافقات exec. وهو ليس مطابقًا
لإدخالات 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 الخاصة بالمفسرات/بيئات التشغيل تفتقد ملفات تعريف صريحة، ويمكن لـ openclaw doctor --fix إنشاء إدخالات safeBinProfiles المخصصة المفقودة.
كما يحذر openclaw security audit وopenclaw doctor أيضًا عندما تضيف صراحة ثنائيات واسعة السلوك مثل jq مرة أخرى إلى safeBins.
إذا أضفت المفسرات صراحة إلى allowlist، ففعّل tools.exec.strictInlineEval حتى تظل صيغ تقييم الشيفرة المضمنة تتطلب موافقة جديدة.
للحصول على تفاصيل السياسة الكاملة والأمثلة، راجع Exec approvals وSafe bins versus allowlist.
أمثلة
في المقدمة:
{ "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.4"] },
},
},
}
ملاحظات:
- متاحة فقط لنماذج 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
- Security — سياسة الأداة والوصول المرتفع الصلاحية