तीन प्रश्न इसे तय करते हैं, और केवल तीन। क्या क्लाइंट ऑपरेटिंग सिस्टम में ऐसी कनेक्शन प्रविष्टि बनाता है जो रीबूट के बाद भी टिकती है? क्या वह ऐसी कमांड लाइन देता है जो अपनी आर्ग्युमेंट सूची के अलावा कहीं और से रहस्य ले सके? क्या उसकी पहचान की मांग किसी इंसान को ब्राउज़र संकेत का उत्तर देने के लिए बाध्य करती है? इसी क्रम में उत्तर दें और चुनाव स्वाद का विषय रह जाता है, क्योंकि निर्धारित कार्य उतना ही हेडलेस हो सकता है जितना तीन उत्तरों में सबसे कमज़ोर अनुमति देता है।

क्लाइंट को तीन स्क्रिप्ट-योग्य परतों से मिलाएँ

मूल OS प्रोफ़ाइल, विक्रेता CLI, केवल-GUI क्लाइंट और ब्राउज़र-SSO क्लाइंट को चार अलग दृष्टिकोण चाहिए। पहले दो बिना निगरानी वाले रीबूट झेलते हैं, और बिना निगरानी वाला रीबूट ही पूरी बात है। बाकी दोनों को स्क्रिप्ट से पहले डिज़ाइन निर्णय चाहिए।

What the client exposesWhat to scriptWhat still bites
OS-native connection entryrasdial, scutil --nc, nmcliTunnel is up before DNS and routes settle
Vendor CLI reading stdinCLI wrapped by the scheduler, secret from the credential storePrompt text changes between releases
GUI onlyPinned version plus a state assertionLocale and DPI break the click targets

पहला रास्ता: प्रोफ़ाइल पहले से ऑपरेटिंग सिस्टम के स्वामित्व में है

यह सबसे सस्ता रास्ता है और वही जिसे ज़्यादातर लोग नज़रअंदाज़ करते हैं। Windows में rasdial "Office" जुड़ता है और rasdial "Office" /disconnect उसे बंद करता है; rasphone -d "Office" उसी प्रविष्टि को डायल-अप इंटरफ़ेस से चलाता है। macOS सहेजी गई सेवाओं की सूची scutil --nc list से बनाता है और एक को scutil --nc start से शुरू करता है। Linux काम NetworkManager को सौंप देता है।

rasdial "Office" user *
scutil --nc start "Office"
nmcli connection up id Office
nmcli -t -f GENERAL.STATE connection show Office

ये इंटरफ़ेस केवल उन्हीं प्रोफ़ाइल को जानते हैं जो OS के स्वामित्व में हैं, इसलिए कोई भी तीसरे पक्ष का क्लाइंट नहीं चला सकते। प्रोफ़ाइल न हो तो उसे एक बार बनाएँ और हर बार फिर से बनाने के बजाय स्क्रिप्ट को उसकी जाँच करने दें। स्क्रिप्ट को idempotent बनाएँ: वर्तमान स्थिति पढ़ें, केवल डिस्कनेक्ट होने पर जुड़ें, और फिर वह निजी नाम जाँचें जो कार्य को वास्तव में चाहिए।

दूसरा रास्ता: विक्रेता कमांड लाइन देता है

कुछ क्लाइंट इतनी कमांड लाइन देते हैं कि उन्हें लपेटा जा सके: Cisco AnyConnect के पास वर्षों से केवल-कनेक्शन सहायक है, और OpenConnect एक ही बाइनरी से AnyConnect, GlobalProtect और Pulse प्रोटोकॉल बोलता है। मायने रखने वाली मांग फ़्लैग सूची नहीं, बल्कि यह है कि रहस्य कहाँ से आता है, क्योंकि आर्ग्युमेंट सूची में रखा पासवर्ड वह हर कोई पढ़ सकता है जो प्रक्रियाएँ सूचीबद्ध कर सकता है।

printf '%s\n' "$VPN_PASS" | openconnect --protocol=anyconnect \
  --user "$VPN_USER" --passwd-on-stdin vpn.example.com

FortiClient और GlobalProtect के कुछ बिल्ड में कोई समर्थित CLI नहीं है, और समुदाय क्लाइंट या विक्रेता-लाइसेंस प्राप्त विकल्प खरीद का निर्णय है, कोई उपाय नहीं। CI में सेवा खाते को ठीक उसी बाइनरी पर अधिकार दें, किसी शेल पर नहीं, ताकि इंजेक्ट किया गया आर्ग्युमेंट root कमांड न बन सके।

तीसरा रास्ता: GUI ऑटोमेशन, और यह अंत में क्यों है

जब आधिकारिक क्लाइंट में कोई इंटरफ़ेस नहीं होता, स्क्रिप्ट विंडो संदेशों या SendKeys से बटन दबाती हैं। यह संस्करण और भाषा के प्रति नाज़ुक है, आधा-जुड़ा सत्र छोड़ सकता है, और गलत भाषा में संवाद आने पर चुपचाप विफल हो जाता है। यदि यह रास्ता लें तो क्लाइंट संस्करण पिन करें, बाद में परिणामी कनेक्शन स्थिति जाँचें, और स्क्रिप्ट के पास दस्तावेज़ीकृत मैन्युअल विकल्प रखें।

यही सावधानी क्लाइंट को उसकी प्रक्रिया मारकर ज़बरदस्ती डिस्कनेक्ट करने पर भी लागू होती है। टनल प्रक्रिया से ज़्यादा जी सकती है, या कोई सुपरवाइज़र उसे फिर शुरू कर सकता है, इसलिए kill-and-restart भी भरोसेमंद रीसेट नहीं है।

टनल उठने के बाद क्या टूटता है

सफल डायल केवल प्रमाणीकरण साबित करता है, और कुछ नहीं। जिस संसाधन के लिए कार्य मौजूद है उसे उसके अपने प्रोटोकॉल और छोटी समय-सीमा के साथ जाँचें, और विफलता संदेश में चरण का नाम दें। आपके डेस्कटॉप पर दिखने वाली प्रोफ़ाइल, प्रमाणपत्र और संग्रहीत क्रेडेंशियल सेवा सत्र को अदृश्य हो सकते हैं, इसलिए उस पर भरोसा करने से पहले कार्य को शेड्यूलर के अपने खाते के अंतर्गत एक बार चलाएँ।

पुनः प्रयास सीमित करें। अस्वीकृत क्रेडेंशियल दोहराने वाला लूप खातों को लॉक करता है, और MFA संकेत का उत्तर हेडलेस कार्य बिना नामांकन डिज़ाइन के नहीं दे सकता; ब्राउज़र SSO प्रवाह के विरुद्ध स्क्रिप्टेड पुनः प्रयास केवल प्रयास जलाते हैं। फ़्लीट के लिए MDM से वितरित VPN पेलोड या कॉन्फ़िगरेशन प्रोफ़ाइल पसंद करें, जहाँ प्लेटफ़ॉर्म क्रेडेंशियल के जीवनचक्र का स्वामी है, और जो क्लाइंट इस तरह प्रबंधित नहीं हो सकते उनके लिए स्क्रिप्ट रखें।

एग्ज़िट कोड और पहला विफल संसाधन लॉग करें, यह तथ्य नहीं कि स्क्रिप्ट चली। वही एक पंक्ति शेड्यूलर चेतावनी को पाँच मिनट के निदान में बदलती है।

संबंधित लेख