मान्यता यह है कि चार पंक्तियों वाला here-document पूरा गैर-इंटरैक्टिव लॉगिन है, और यह ठीक तब तक टिकता है जब तक गेटवे दो समूह न दे, बैनर न छापे, या पासवर्ड के बाद टोकन न मांगे। तब वही स्क्रिप्ट पासवर्ड को ऐसे मेन्यू में लिख देती है जो संख्या की प्रतीक्षा कर रहा था। Linux पर कमांड-लाइन क्लाइंट स्क्रिप्ट किया जा सकता है, लेकिन तभी जब आप उसे वह दें जो वह वास्तव में चाहता है, ट्यूटोरियल ने जो मान लिया था वह नहीं।

तय here-document एक मिथक है

Cisco का Linux क्लाइंट /opt/cisco/anyconnect/bin/vpn पर एक छोटा प्रोग्राम इंस्टॉल करता है, और Secure Client 5 अब भी उसे भेजता है। vpnagentd सेवा के चलने पर -s फ्लैग उत्तर मानक इनपुट से उसी क्रम में पढ़ता है जिसमें क्लाइंट उन्हें मांगता है। वह क्रम सर्वरों के बीच तय नहीं है।

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

एक ही गेटवे और संस्करण के सामने क्लाइंट को एक बार हाथ से चलाएं, और प्रॉम्प्ट को उसी क्रम में लिख लें जिसमें वे आते हैं। वही ट्रांसक्रिप्ट वह विनिर्देश है जिसे आपकी स्क्रिप्ट को पूरा करना है।

क्लाइंट किस बात की प्रतीक्षा करता है

सामान्य एक-समूह स्थिति में क्रम उपयोगकर्ता नाम, पासवर्ड और कभी-कभी बैनर पुष्टि है। here-document की पहली पंक्ति मेन्यू सूचक तभी बनती है जब सर्वर वास्तव में मेन्यू दिखाता है, और इसीलिए वही स्क्रिप्ट एक जगह चलती है और अगली जगह विफल हो जाती है।

/opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net <<EOF
0
alice
$VPN_PASSWORD
y
EOF

इसे चार संभावित प्रश्नों के चार उत्तर के रूप में पढ़ें, किसी तय प्रोटोकॉल के रूप में नहीं। शून्य मेन्यू चयन है, पासवर्ड नहीं, और अंत का y ऐसा बैनर स्वीकार करता है जो बहुत से गेटवे कभी नहीं भेजते।

जब क्रम अनुमानित न हो तो expect का उपयोग करें

जब प्रॉम्प्ट का क्रम बदलता है, तो पंक्तियां गिनना बंद करें और इसके बजाय प्रॉम्प्ट की प्रतीक्षा करें। expect स्क्रिप्ट connect कमांड शुरू करती है, उपयोगकर्ता नाम प्रॉम्प्ट की प्रतीक्षा करती है, भेजती है, पासवर्ड प्रॉम्प्ट की प्रतीक्षा करती है, भेजती है, और फिर जुड़े हुए स्थिति की प्रतीक्षा करती है। प्रत्येक प्रतीक्षा की अपनी समय-सीमा है।

समय-सीमा समाप्त होने को विफलता मानें और बाहर निकलें। अप्रत्याशित प्रॉम्प्ट के बाद भी इनपुट भेजती रहने वाली स्क्रिप्ट पासवर्ड को खुशी-खुशी किसी शेल, मेन्यू या जो भी पढ़ रहा हो उसमें लिख देगी। इसी तरह एक लॉगिन स्क्रिप्ट घटना बन जाती है।

expect आपको ऐसी ट्रांसक्रिप्ट भी देता है जिसे गुप्त भाग हटाकर लॉग किया जा सकता है, और जब गेटवे अपग्रेड के बाद अपने प्रॉम्प्ट बदल दे तो वह exit कोड से अधिक मूल्यवान होती है।

गुप्त जानकारी को कहीं रहना ही होगा

इस समस्या के हर संस्करण में एक कमजोरी है: पासवर्ड ऐसे रूप में होना चाहिए जिसे क्लाइंट पढ़ सके। उसे आर्ग्युमेंट के रूप में भेजना उसे प्रोसेस तालिका में उजागर करता है। पाइप से echo करना उसे अक्सर शेल इतिहास में डाल देता है। दोनों को साझा जंप होस्ट पर अन्य स्थानीय उपयोगकर्ता पढ़ सकते हैं।

install -m 600 /dev/null ~/.vpn-secret
umask 077; VPN_PASSWORD=$(cat ~/.vpn-secret) /opt/cisco/anyconnect/bin/vpn -s connect vpn.example.net

खाते के स्वामित्व वाली मोड 600 की फाइल न्यूनतम है, और वह भी डिस्क पर सादे टेक्स्ट में रखा गुप्त है। secret-tool lookup Linux कीरिंग से पढ़ता है, और macOS पर वही काम security find-generic-password -w करता है। जहां संगठन प्रमाणपत्र या SAML प्रमाणीकरण का समर्थन करता है, उसे प्राथमिकता दें, क्योंकि संग्रहीत पासवर्ड और MFA मिलकर भी बिना किसी व्यक्ति के लॉगिन पूरा नहीं कर सकते।

टनल की पुष्टि करें, फिर बंद करने की जिम्मेदारी लें

त्रुटि पाठ न होने पर भरोसा न करें। क्लाइंट से उसकी स्थिति पूछें और इंटरफेस को अलग से जांचें:

/opt/cisco/anyconnect/bin/vpn state
ip -brief address

स्थिति में Connected लिखा होना चाहिए, और टनल इंटरफेस के पास एक पता होना चाहिए। फिर ऐसा एक संसाधन मांगें जहां टनल को पहुंचना चाहिए, क्योंकि बिना रूट के जुड़ी स्थिति एक वास्तविक परिणाम है और आसानी से छूट जाती है।

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

कार्य क्रम: vpnagentd की पुष्टि करें, प्रॉम्प्ट का असली क्रम दर्ज करें, here-document या expect चुनें, गुप्त जानकारी argv और इतिहास से बाहर रखें, स्थिति और एक संसाधन सत्यापित करें, और फिर उसी स्क्रिप्ट में डिस्कनेक्ट करें।

संबंधित लेख