يبدو تحذير السكربتات المتعددة كشكوى تتعلق بالجدولة، لذا فالخطوة البديهية هي إعادة ترتيب الأسطر حتى يختفي. لكنه ليس شكوى جدولة. تعريف --up اللاحق يستبدل الأمر المخزَّن مسبقًا لتلك المرحلة، والمحلّل يقول ذلك صراحة، أي أن واحدًا فقط من سكربتيك قد عمل يومًا. الآخر ليس مصطفًّا خلفه؛ بل اختفى.

لهذا يستحق التحذير الانتباه رغم أنه ليس قاتلًا: ما يتوقعه هو تحديث DNS أو تغيير مسار توقّف عن الحدوث بهدوء.

التحذير لا يتعلق بالترتيب

OpenVPN يخزّن أمر سكربت مستخدم واحدًا لمرحلة up. وعندما يصادف المحلّل تعريفًا آخر، من الملف الشخصي أو ملف مُضمَّن أو سطر الأوامر، فإنه يستبدل ما كان يحتفظ به ويصدر التحذير. لا شيء يُدمج، ولا شيء يعمل مرتين، ولا توجد مسألة ترتيب أصلًا. الأمر الذي يبقى هو ما رآه المحلّل أخيرًا، ولهذا قد يغيّر نقل سطر هوية الفائز بينما يبقى السكربت الآخر ميتًا.

ينطبق النمط نفسه على مراحل السكربت الأخرى: أمر واحد لكل منها. وإذا كان لا بد من حدوث عملين معًا، فهما يحتاجان إلى نقطة دخول واحدة، لا إلى توجيهين يشبهان قائمة.

اعثر على التعريفين في التشغيل الفعلي

ابدأ مما استقبله الخادم فعليًا لا من الملف الشخصي الذي حرّرته. يُظهر ps -ef سطر الأوامر، وكذلك ExecStart الخاص بالوحدة، وقد يضيف --up من نقطة دخول حاوية أو من غلاف؛ ويمكن لملف init الخاص بالتوزيعة أن يفعل الشيء نفسه. يكشف systemctl cat openvpn-server@server ما تساهم به الخدمة نفسها، ويجد grep العودي على دليل الإعدادات التعريفات على مستوى الملف. تأتي التكرارات عادةً من طبقات مختلفة، ولهذا بالضبط لا يغيّر تحرير ملف واحد شيئًا.

نسخ سكربت إلى دليل آخر أو تغيير اسمه لا يزيل التوجيه أيضًا. المحلّل يعدّ التعريفات، لا الملفات.

اجعل خطّافًا واحدًا يملك العمل

الإصلاح الدائم هو موزّع واحد ينفّذ الإجراءين بترتيب مدروس. سكربت shell قصير مع set -eu يستدعي التكامل المطلوب ثم الإجراء المحلي، ويمرّر "$@" كي تبقى حدود الوسائط، ويُبقي السلوك في مكان واحد قابل للتدقيق. تمرير الوسائط يحفظها فقط؛ ولا يثبت أن المساعدين يتوقعان الواجهة نفسها، لذا اقرأ عقد كل منهما. قرّر ما ينبغي أن يفعله الفشل، وهل تحتاج التغييرات الجزئية إلى عكس.

إذا كان المشغّل يوفّر خطّاف توسعة مدعومًا، ففضّله على الربط اليدوي. غالبًا ما تحتوي صورة حاوية أو حزمة مورّد على مكان موثّق لعمل إضافي، واستخدامه يمنع الترقية من الكتابة فوق الموزّع الخاص بك.

ينتمي التنظيف إلى مرحلة down المقابلة. إجراء up يعيد كتابة DNS أو يضيف مسارات يحتاج إلى عكس موثّق، أما الموزّع الذي يتعامل مع بدء التشغيل فقط فهو نصف تصميم.

أكّد التكامل، لا الصمت فقط

إزالة تحذير التكرار هي الجزء السهل؛ فالتكامل ما زال عليه أن يعمل. تحقّق من حالة المحلّل بعد الاتصال باستخدام resolvectl status أو بقراءة /etc/resolv.conf، وأكّد المسارات باستخدام ip route. ثم افصل الاتصال وأعد الاتصال، لأن خطّافًا رُبط على عجل يميل إلى ترك شيء من الجلسة السابقة. يُظهر journalctl -u openvpn-server@server -b هل عمل الموزّع وماذا طبع.

أبقِ صلاحيات الخطّاف حيث تنتمي. رفع script-security أو تشغيل الخادم بصلاحيات أكبر ليس إصلاحًا لخطّاف مُستبدل؛ بل يوسّع ما يمكن لكل سكربت مستقبلي فعله، بما في ذلك سكربت يسمّيه مهاجم.

علامة أن الإصلاح حقيقي ليست الصمت في السجل. بل إجابة DNS، ومدخل المسار، والتنظيف، وكلها تعمل بعد إعادتَي اتصال.

مقالات ذات صلة