scutil --nc से टर्मिनल से सहेजा हुआ Mac VPN शुरू करें
सहेजी गई macOS VPN सेवा को शुरू, जाँच और बंद करने के लिए scutil --nc का उपयोग करें, क्रेडेंशियल को argv से बाहर रखें, और साबित करें कि ट्रैफ़िक वास्तव में टनल का उपयोग करता है।
आपके पास सिस्टम सेटिंग्स में सहेजी गई VPN सेवा है, और आप चाहते हैं कि टर्मिनल उसे शुरू करे। macOS पर समर्थित रास्ता scutil --nc है, लेकिन केवल उन सेवाओं के लिए जिनका मालिकाना सिस्टम के अपने नेटवर्क कनेक्शन मैनेजर के पास है। मेन्यू बार API नहीं है: तीसरे पक्ष के क्लाइंट के पास आमतौर पर अपना ऑटोमेशन होता है, और प्रबंधन सेवा द्वारा भेजा गया प्रोफ़ाइल स्थानीय शुरुआत से इंकार कर सकता है। यह वह चेकलिस्ट है जिसे मैं चलाता हूँ: सटीक सेवा खोजें, उसकी स्थिति पढ़ें, उसे शुरू करें, स्थिति बदलने की प्रतीक्षा करें, और फिर साबित करें कि ट्रैफ़िक वास्तव में टनल का उपयोग करता है। पहले ऐसे चरण पर रुकें जो मेल नहीं खाता, क्योंकि हर आगामी कमांड मानती है कि पिछला सफल हुआ।
शुरू करने का प्रयास करने से पहले सेवा खोजें
याद रखे गए प्रोफ़ाइल नाम के बजाय इन्वेंटरी से शुरुआत करें:
scutil --nc help
scutil --nc list
हर पंक्ति एक स्थिति को सेवा पहचानकर्ता, प्रकार और प्रदर्शित नाम के साथ जोड़ती है। पहचानकर्ता वह मान है जिसके विरुद्ध स्क्रिप्ट लिखी जाती है, क्योंकि प्रदर्शित नाम दोहराए जाते हैं और संपादित किए जा सकते हैं। एप्पल का scutil मैनुअल नेटवर्क कनेक्शन मोड का दस्तावेज़ीकरण करता है, जबकि इंस्टॉल किया गया --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 से बाहर है, यह निष्कर्ष निकालने से पहले रूट जाँच फिर चलाएँ।
हाथ से चलाए जाने वाले रैपर के लिए क्रम स्थिर रखें: सूची, स्थिति, शुरुआत, पूछताछ, रूट परीक्षण, बंदी, सत्यापन। पहचानकर्ता उपलब्ध होने पर मुक्त-प्रारूप आउटपुट से मैत्रीपूर्ण नाम का विश्लेषण न करें, और शुरुआत कमांड के निकास को तैयारी न मानें। कनेक्शन मैनेजर स्थिति बताता है; आपका प्रमाण स्थिति और टनल की ओर इशारा करने वाला रूट है।