لديك خدمة VPN محفوظة في إعدادات النظام، وتريد أن تشغّلها الطرفية. على macOS المسار المدعوم هو scutil --nc، لكن فقط للخدمات التي يملكها مدير اتصالات الشبكة التابع للنظام نفسه. شريط القوائم ليس واجهة API: عادةً ما يكون لعملاء الطرف الثالث أتمتة خاصة بهم، وقد يرفض ملف التعريف الذي يدفعه مدير الخدمة بدءًا محليًا. هذه قائمة التحقق التي أتبعها: اعثر على الخدمة المحددة، واقرأ حالتها، وابدأها، وانتظر تغيّر الحالة، ثم أثبت أن حركة المرور تستخدم النفق فعلاً. توقّف عند أول خطوة تخالف ذلك، لأن كل أمر لاحق يفترض نجاح الأمر الذي قبله.

اعثر على الخدمة قبل أن تحاول بدءها

ابدأ بالجرد بدلًا من اسم ملف التعريف الذي تتذكره:

scutil --nc help
scutil --nc list

يقرن كل سطر حالةً بمعرّف خدمة ونوعٍ واسم عرض. المعرّف هو القيمة التي تكتب البرامج النصية مقابلها، لأن أسماء العرض تتكرر ويمكن تعديلها. يوثّق دليل scutil الخاص بشركة Apple وضع اتصال الشبكة، بينما --nc help المثبّت هو القائمة الموثوقة للأوامر الفرعية على ذلك الـ Mac؛ لا تفترض أن علمًا من دليل أقدم ما زال موجودًا في إصدار macOS لديك.

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

اقرأ الحالة الحالية وتأكد من المحدّد

استعلم عن الخدمة قبل بدئها، حتى تعرف ما الذي ينبغي أن يغيّره البدء الناجح:

scutil --nc status "Office VPN"

إذا اشتركت خدمتان في اسم عرض واحد، فالاسم ملتبس. مرّر المعرّف بدلًا من ذلك؛ يقبل الأمر أيًّا منهما، لكن المعرّف وحده مضمون لاختيار خدمة واحدة. تحقق من أن كلمة الحالة واحدة مما تعرفه، عادةً Connected أو Disconnected أو Connecting أو Disconnecting، قبل تحليلها في برنامج نصي. تحقق أيضًا مما إذا كان ملف التعريف مُدارًا، لأن التكوين المقفل قد يقبل الأمر ويظل يتجاهله أو يطلب تأكيدًا.

استدعاء الحالة هذا رخيص، لذا استخدمه كحارس في الأتمتة: ابدأ فقط عندما تكون الحالة Disconnected، ولا تعتبر Connecting فشلًا. إذا كانت الخدمة Connected بالفعل، فتجاوز البدء بدلًا من مقاطعة نفق عامل.

ابدأ الاتصال وانتظر استقرار الحالة

طلب البدء غير متزامن. يعود الأمر عندما يُقبل الطلب، لا عندما ينتهي التحقق أو تُثبَّت المسارات. شغّله، ثم راقب الحالة بانتظار محدود واخرج إذا عادت الخدمة إلى Disconnected:

scutil --nc start "Office VPN"
n=0
while [ "$n" -lt 30 ]; do
  state=$(scutil --nc status "Office VPN" | head -n 1)
  [ "$state" = "Connected" ] && break
  [ "$state" = "Disconnected" ] && { echo "start failed"; exit 1; }
  sleep 2
  n=$((n + 1))
done

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

لا تعتبر حالة خروج الصدفة جاهزية. الإشارة المفيدة هي سلسلة الحالة، تليها أدلة على أن النفق يحمل حركة المرور. قد يتركك أمر بدء يعود بهدوء مع اتصال لا يصادق أبدًا.

أثبت أن النفق يحمل حركة المرور، لا مجرد أنه يقول Connected

Connected يصف الاتصال، لا قرار التوجيه. تنشئ خدمات PPP وIKEv2 الأصلية واجهة ppp أو utun وتثبّت المسارات، بينما يترك النفق المنقسم المسار الافتراضي عن قصد. افحص الواجهات وعائلتي العناوين:

ifconfig -l
netstat -rn -f inet
netstat -rn -f inet6
scutil --dns

اعثر على الواجهة التي أنشأتها الخدمة بدلًا من تخمين رقم، ثم اسأل جدول التوجيه أي واجهة يستخدمها وجهة معينة: route -n get 10.0.0.10، مع استبدال مضيف داخلي. إذا أبلغ عن الواجهة الفعلية، فالنفق يعمل لكنه لا يحمل ذلك التدفق. تحقق من مسارات النفق المنقسم، وترتيب المحلّل، وأي قاعدة جدار حماية محلية تسمح بواجهة النفق لكن ليس بالعملية.

تحليل الأسماء هو النتيجة السلبية الزائفة المعتادة. قد تُحلّ الأسماء الداخلية عبر المحلّل الخطأ بينما يكون النفق سليمًا تمامًا، وهو ما يبدو عطلًا في VPN وليس كذلك. يعرض scutil --dns الترتيب الذي سيستخدمه macOS؛ بعد تغيير المحلّل، افرغ الذاكرة المؤقتة بـ dscacheutil -flushcache و sudo killall -HUP mDNSResponder.

أبقِ بيانات الاعتماد والامتيازات خارج سطر الأوامر

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

تشغيل الأمر بـ sudo لا يجعل تسجيل الدخول التفاعلي غير مراقب. إنه يغيّر المستخدم الفعّال، لا توفر مطالبة GUI أو رمز عتادي أو سلسلة مفاتيح تسجيل الدخول. يمكن لـ LaunchAgent بدء خدمة بعد تسجيل دخول المستخدم وفتح سلسلة المفاتيح؛ أما LaunchDaemon فعادةً لا يصل إلى تلك الأجزاء من جلسة المستخدم. إذا كانت مؤسسة تدير الخدمة، فإن قواعد دورة حياتها تتغلب على أي برنامج نصي محلي.

أوقف الخدمة وتحقق من بقائها متوقفة

أوقف بالمحدّد نفسه الذي استخدمته للبدء، ثم اقرأ الحالة مرة أخرى بدلًا من افتراض أن النفق اختفى:

scutil --nc stop "Office VPN"
scutil --nc status "Office VPN"

التوقف الذي يعود إلى Disconnected لا يزال يترك شيئًا واحدًا للفحص: ما إذا كان ملف التعريف مضبوطًا على الاتصال عند الطلب، وهو ما قد يعيده دون برنامجك النصي. إذا كان عميل آخر يملك مسارات على الـ Mac نفسه، فقد تنجو تلك المسارات من إيقاف أصلي. أعد فحص المسار قبل أن تستنتج أن الجهاز خارج VPN.

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

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