मैं लंबे समय से सिस्को IOS की क्षमताओं को लागू करना चाहता था, जो कि
tclsh कमांड के पीछे छिपे हुए हैं और लगभग हर राउटर और स्विच में मौजूद हैं। लेकिन दुर्भाग्य से, शायद सौभाग्य से यह उन समस्याओं को हल करने के लिए आवश्यक नहीं था जहां डिवाइस के माध्यम से स्वचालन का उपयोग कम से कम किसी तरह से मदद कर सकता है, हालांकि, मेरे नियंत्रण में सिस्को से बहुत सारे डिवाइस कभी नहीं आए हैं। अंत में, भाग्य ने मुझे एक व्यावसायिक यात्रा पर फेंक दिया जहां से नेटवर्क का प्रबंधन करना आवश्यक था, और मेरे हाथों में केवल वाई-फाई और 80 वें टीसीपी पोर्ट के साथ एक टैबलेट था। इस बार, मुझे फोन पर वॉयस द्वारा कमांड को निर्देशित करना था, लेकिन आगमन पर टास्क के
साथ सिस्को आईओएस स्क्रिप्टिंग का उपयोग करके कार्य को हल किया गया था।
सौभाग्य से, सिस्को IOS में टीसीएल कार्यान्वयन ऐसी समस्या को हल करने के लिए पर्याप्त कार्यात्मक है।
सबसे पहले, मैं तैयार समाधान की तलाश में गया। वास्तव में, सिस्को स्वयं अपने उपकरणों को वेब-आधारित इंटरफ़ेस के माध्यम से एक्सेस प्रदान करता है, लेकिन इस तरह की एक्सेस में कंसोल इंटरफ़ेस की सभी विशेषताएं नहीं हैं (जैसा कि सिस्को स्वयं इंगित करता है), प्रारंभिक कॉन्फ़िगरेशन की आवश्यकता होती है (उदाहरण के लिए, एसडीएम के लिए जावा), सुरक्षा को प्रभावित करता है, और उपयोग करने के लिए सुविधाजनक नहीं है ( मेरे लिए) - सामान्य तौर पर, सभी उपकरणों पर
कोई आईपी http सर्वर नहीं है । एसएसएच / टेलनेट पोर्ट को HTTP पर मैप करना भी संभव था, लेकिन यह केवल टैबलेट के साथ एक समस्या है: टेलनेट लंबे समय से विंडोज से चला गया है, और ssh। हम इस बात को ध्यान में रखते हैं कि हमें वेब ब्राउज़र के साथ किसी भी उपकरण से जितनी जल्दी हो सके लॉग इन करने की आवश्यकता हो सकती है, भले ही वह 2000 के शुरुआती / मध्य का टेलीफोन हो।
हम सिस्को कंसोल पर रिमोट एक्सेस के लिए तीसरे पक्ष के तैयार समाधानों को देखते हैं -
यह शायद इस विषय पर सबसे लोकप्रिय लेख है , लेकिन याद रखें कि हमें कम से कम टेलनेट की आवश्यकता है। नतीजतन, हम आवश्यकताओं को तैयार करेंगे: वेब इंटरफ़ेस के माध्यम से पहुंच, डिवाइस पर लॉन्च करने के लिए यथासंभव सरल (आदर्श रूप से एक कमांड के साथ) - और सब कुछ खुद लिखें।
सबसे पहले, क्या हुआ - पोस्ट के अंत में लिंक पर क्लिक करके आप एक स्क्रिप्ट उठा सकते हैं जिसे रिमोट डिवाइस पर चलाया जाना चाहिए। इस तथ्य के कारण कि इतने सारे सिस्टम के लिए टीसीएल कार्यान्वयन हैं, इसलिए आप सिस्को आईओएस, विंडोज, लिनक्स, फ्रीबीएसडी तक पहुंच प्राप्त कर सकते हैं (यह सिर्फ मैंने खुद की जांच की है)। पैरामीटर में आपको उस पते को निर्दिष्ट करने की आवश्यकता है जिस पर हम आने वाले अनुरोधों को सुनेंगे, और बंदरगाह। यदि आप पैरामीटर निर्दिष्ट नहीं करते हैं, तो हम सभी पते और सिस्टम द्वारा हमारे लिए आवंटित पहला मुफ्त बंदरगाह सुनते हैं। एक संकेत का संकेत है (सिस्को में के रूप में) जब मापदंडों में एक प्रश्न चिह्न दिखाई देता है, तो विडंबना यह है कि संकेत सिस्को कंसोल में काम नहीं करता है, सिस्को कंसोल स्वयं प्रश्न चिह्न को स्वीकार करता है। पहली पंक्ति में मानक
# शामिल नहीं है
! <स्क्रिप्ट का पथ> , इसलिए हम स्पष्ट रूप से
tclsh को कॉल
करते हैं (सिस्को के लिए यह दूसरे तरीके से असंभव है):
win>tclsh cws.tcl ? ABCD or * Listen ip address <cr> win>tclsh cws.tcl * ? <0-65535> Listen tcp port, 0 for first free <cr> win>tclsh cws.tcl * 8181 Listen on http://0.0.0.0:8181
सिस्को कंसोल के लिए, हम पूर्ण पथ (tftp के माध्यम से) लिखते हैं, और आपको विशेषाधिकार प्राप्त मोड में होना चाहिए। Tclsh मोड में, स्क्रिप्ट को
स्रोत के माध्यम से कहा जाता है, लेकिन कमांड लाइन पैरामीटर स्क्रिप्ट को पारित नहीं किया जा सकता है:
cisco
निक्स कंसोल के लिए, पैरामीटर "*" को वाइल्डकार्ड पैरामीटर के रूप में माना जाता है, इसलिए आपको इसे "\" से बचने या इसे उद्धरण चिह्नों में संलग्न करने की आवश्यकता है।
शुरू करने के बाद, आप ब्राउज़र को सुनने के पते पर दर्ज कर सकते हैं। इंटरफ़ेस तपस्वी है - कमांड दर्ज करने, स्क्रिप्ट को निष्पादित करने और रोकने के लिए बटन, और एक tclsh मोड स्विच के लिए एक पंक्ति।

यदि निष्पादन योग्य कमांड में आउटपुट के लिए कुछ है, तो कमांड का आउटपुट पेज की शुरुआत में दिखाया जाएगा। Tclsh मोड कमांड को TCL स्क्रिप्ट के रूप में निष्पादित करता है - आप भाषा कमांड के पूरे सेट का उपयोग कर सकते हैं। इनपुट फ़ील्ड 160 वर्णों तक सीमित है, आकार 40 वर्ण (टैबलेट के लिए सुविधाजनक)। स्क्रिप्ट को रोकने के लिए बटन डिवाइस पर अपना काम पूरा करेगा, हमें अपने कार्यों को पूरा करने पर किसी और से पूछने की आवश्यकता नहीं होगी। कमांड के निष्पादन में त्रुटियां स्वयं संसाधित होती हैं और वेब इंटरफेस पर वापस आउटपुट हो जाती हैं, संचार और स्क्रिप्ट त्रुटियां किसी भी तरह से नहीं पकड़ी जाती हैं, ताकि टीसीएल दुभाषिया की मानक त्रुटियां डिवाइस के कंसोल में बाहर आ सकें (मैंने जितना संभव हो सके सब कुछ पकड़ने की कोशिश की, लेकिन यह छोड़ा जा सकता है)। यह भी याद रखने योग्य है कि एक समय में स्क्रिप्ट केवल एक अनुरोध को पूरा करती है, और यदि आप एक कमांड निष्पादित करते हैं जिसमें इंटरैक्टिव क्रियाओं या लंबी निष्पादन अवधि की आवश्यकता होती है, तो स्क्रिप्ट के आगे नियंत्रण के लिए पहुंच खो जाएगी। आप एक स्थान के बाद "और" वर्ण के साथ कमांड को समाप्त कर सकते हैं, जो इसे पृष्ठभूमि में लॉन्च करेगा और स्क्रिप्ट पर वापस नियंत्रण लौटाएगा; यह सिस्को IOS के लिए काम नहीं करता है।
सिस्को पर tclsh मोड की मुख्य विशेषता यह है कि सभी Cisco कमांड्स की व्याख्या इंटरप्रेटर द्वारा देशी के रूप में की जाती है, वास्तव में, हम TCL भाषा को सभी कार्यक्षमता के साथ पूरक करते हैं जिसमें एक विशिष्ट डिवाइस कमांड इंटरफ़ेस है - हमें
निष्पादन का उपयोग करके कमांड को स्पष्ट रूप से कॉल करने की आवश्यकता नहीं है, वे पहले से ही हैं। लागू किया जा रहा है। इसके अलावा, हम
कॉन्फिडेंशियल टर्मिनल से कॉन्फिगरेशन मोड में प्रवेश नहीं कर पाएंगे, इसके लिए हमें सिस्को टीसीएल एड-ऑन कमांड -
ios_config का उपयोग करना होगा । उदाहरण के लिए, इंटरफ़ेस बंद करें:
cisco
हमेशा
सिस्को डॉट कॉम पर इस बारे में बहुत विस्तृत।
इसके विपरीत, विंडोज में सभी कमांड कंसोल में निष्पादित नहीं होते हैं, अर्थात, उन्हें केवल एक अलग निष्पादन योग्य फ़ाइल के रूप में माना जाता है, इसलिए, उदाहरण के लिए, निष्पादित करने के लिए
, आपको स्पष्ट रूप से कंसोल को कॉल करना होगा:
win>cmd /c dir c:\ C SYSTEM : A073-3CE1 c:\
हमने कार्यशीलता पूरी कर ली है, अब कार्यान्वयन के बारे में थोड़ा। टीसीपी कनेक्शन को स्वीकार करने के लिए, सर्वर मोड में
सॉकेट कमांड का उपयोग करें,
-Sverver स्विच । यदि आवश्यक हो, तो हम सुनने के लिए पते को प्रसारित करते हैं (यदि यह नहीं है, तो सभी पते सुने जाएंगे)
-myaddr कुंजी। अनिवार्य पैरामीटर कॉलबैक प्रक्रिया का नाम है जिसे कॉल किया जाएगा जब डेटा स्थापित कनेक्शन में स्थानांतरित किया जाता है, हमारे मामले में यह
get_http है । जैसा कि मैंने पहले ही लिखा है, कनेक्शन बनाते समय त्रुटियों की जांच नहीं की जाती है, अगर कुछ गलत हो जाता है तो स्क्रिप्ट कंसोल पर शपथ लेगी। खुले सॉकेट को
wsh वैरिएबल में सेव किया जाता है, जिससे हम इसके मापदंडों को
fconfigure $ wsh -sockname कमांड के साथ प्राप्त करते हैं - स्क्रीन पर प्रदर्शित करने के लिए सुनने का पता और पोर्ट।
if { $argc == $i } then { if [string length $listenaddr] then { set wsh [socket -server get_http -myaddr $listenaddr $listenport] } else { set wsh [socket -server get_http $listenport] } set sockparam [fconfigure $wsh -sockname] puts "Listen on http://[lindex $sockparam 0]:[lindex $sockparam 2]" after $connwait set stopsrv 1 vwait stopsrv close $wsh set retcode $stopsrv } else { set retcode [expr $i + 100] } return $retcode
तब हम
vwait कहते हैं जो परिवर्तन के लिए वैरिएबल
स्टॉपरेव की प्रतीक्षा करता है। इस कॉलबैक कमांड के बिना, प्रक्रिया कनेक्शन स्वीकार नहीं करेगी, सर्वर स्वयं पोर्ट पर बिल्कुल भी नहीं सुनेंगे। वास्तव में, इस आदेश को कॉल करने के बाद ही हम सर्वर मोड पर जाते हैं: टीसीएल आंतरिक लूप में जाता है जहां कनेक्शन अनुरोध संसाधित होते हैं। प्रसंस्करण कनेक्शनों को रोकने के लिए
स्टॉप्र्स चर
की आवश्यकता होती है - सर्वर को बंद करें, हम इसे तब सेट करेंगे जब आप वेब इंटरफेस में स्टॉप बटन पर क्लिक करेंगे - टीसीएल लूप से बाहर
निकलेगा , कॉलबैक प्रक्रिया
get_http को समाप्त
करेगा और केवल
क्लोज कमांड को निष्पादित करेगा, जो
vwait का अनुसरण करता है , जो ओपन वन को बंद करेगा सॉकेट।
Vwait से पहले, एक सुरक्षात्मक तंत्र है: यदि हम अपने मन में जाने के बारे में बदलते हैं या लंबे समय तक कोई कार्रवाई नहीं करते हैं, तो चर में सेट होने के बाद = 15 मिनट के लिए,
स्टॉपर्सव सेट हो जाएगा और
vwait निष्पादित करना जारी रखेगा। यदि हमने लॉग इन किया है, तो
get_http प्रक्रिया में फिर से
रीइंक्रिटाइज़ किया गया है।
इस ब्लॉक में कमांड लाइन के मापदंडों के सही हस्तांतरण के लिए
यदि रैपर
की जरूरत है, तो मापदंडों को पहले ही जांच लिया जाता है, जिसे आप स्क्रिप्ट में ही देख सकते हैं।
हम सिस्को tclsh की विशेषताओं को याद करते हैं, कि सिस्को कमांड इसके लिए मूल की तरह हैं, इसलिए
बाहर निकलने के बजाय जो विशेष रूप से सिस्को को संदर्भित करता है और टीसीएल नहीं, हम
रिटर्न का उपयोग करते
हैं - सिस्को पर स्क्रिप्ट चलाने के बाद, कंसोल के लिए एक
निकास कोड जारी किया जाएगा।
सभी मुख्य कार्य
get_http प्रक्रिया में किए जाते हैं, जहां HTTP अनुरोधों के इनपुट मापदंडों का विश्लेषण किया जाता है और HTTP प्रतिक्रियाओं को उत्पन्न करने के लिए प्रक्रियाओं को कहा जाता है:
proc get_http { sockaddr ipaddr portaddr } { global stopsrv global connwait gets $sockaddr r flush $sockaddr set rs [string tolower [string trim $r]] after cancel set stopsrv 2 after $connwait set stopsrv 2 switch -regexp -- $rs { {^get\s*/close} { set body 1; set stopsrv 0 } {^get\s*/\s+} { puts "GET from $ipaddr:$portaddr"; after cancel set stopsrv 1 } {^get\s*/\?cmd=} { if { [regexp {/\?cmd=([^[:space:]^\&]*)(&tclsh)?} $r opt cmdline checked] && [string length $cmdline] } then { set cmdline [expandPercent $cmdline] if { ! [string length $checked] } then { catch "exec $cmdline" msgout } else { catch $cmdline msgout set checked {checked} } } } default {set mode 1; set body 2 } } response_http $sockaddr $mode response_html $sockaddr $body $cmdline $msgout $checked close $sockaddr }
इस प्रक्रिया के पैरामीटर हैं: खुला
सॉकड्रेड सॉकेट, जहां से हम पढ़ेंगे और जहां हम लिखेंगे, साथ ही साथ
पोर्टेडड्र्र पोर्ट और शामिल क्लाइंट के
आईपैड का पता भी। हम इस प्रक्रिया के बाहर देखने के लिए वैश्विक वैरिएबल
स्टॉप्रॉव को परिभाषित करते हैं, यह
vwait के लिए आवश्यक है। हम केवल पहली पंक्ति पढ़ते हैं (हमें बाकी की ज़रूरत नहीं है -
फ्लश ), हम उम्मीद करते हैं कि एक GET अनुरोध होगा। हम इसे
स्विच में
जांचते हैं और ग्राहक हमारे पास जो भी जाता है उसके अनुसार कार्य करते हैं। यदि हम कुछ नहीं जानते हैं, तो हम "HTTP / 1.0 501" (हम अनुरोधित सामग्री प्रदर्शित नहीं कर सकते हैं) वापस कर देंगे। हम "HTTP / 1.0 200" के साथ सही अनुरोध का जवाब देते हैं।
सभी HTTP प्रतिक्रिया
response_http प्रक्रिया और HTML पेज
response_html में
उत्पन्न होते हैं । मैं इन प्रक्रियाओं का वर्णन नहीं करूंगा, उनमें पेज लेआउट को आउटपुट करने के लिए रैखिक कोड
$ sockaddr <text> को कुछ पंक्तियों में
डाल देता है और प्रदर्शित करने की शर्तों की जाँच करता है।
हम निम्नलिखित अनुरोधित डेटा पर प्रतिक्रिया देते हैं:
- / - रूट - हमारे पृष्ठ को प्रदर्शित करते हैं, और डिवाइस के कंसोल में हम लिखते हैं कि कौन हमारे पास आया - पता और पोर्ट। इसके बाद भी विराम रद्द करें;
- / बंद - हम स्क्रिप्ट का काम खत्म करते हैं - हम चर स्टॉप्र्सव सेट करते हैं (वास्तव में, "/ करीब?" क्लाइंट से आता है, जैसे मापदंडों के बिना एक फॉर्म से एक अनुरोध);
- / cmd = <कमांड> & tclsh - सबसे पहले, हम HTTP अनुरोध से टेक्स्ट खोलेंगे - एक प्रोसेस्ड लाइन हमारे पास आती है जहाँ सभी स्पेस को "+" से बदल दिया जाता है, सभी गैर-मानक अक्षर (अक्षरों और संख्याओं को छोड़कर सभी अक्षर) को% XX के रूप में दर्शाया जाता है। इसके लिए हम विस्तार का उपयोग करते हैं , विकी टीसीएल के साथ लगभग हमेशा। अगला, हम अपने पेज पर आउटपुट के लिए, क्लीनआउट कमांड को कैच के माध्यम से निष्पादित करते हैं और msgout में परिणाम सहेजते हैं। इस तरह से कमांड को कॉल करके, हम इसके निष्पादन की संभावित त्रुटियों को पकड़ते हैं। यदि "tclsh" पैरामीटर मौजूद है, तो इसे निष्पादित करें, यदि यह मौजूद नहीं है, तो इसे निष्पादन के माध्यम से निष्पादित करें - जो हमें डिवाइस के कंसोल में एक कमांड निष्पादित करने का प्रभाव देता है।
प्रतिक्रियाएं भेजने के तुरंत बाद, हम सॉकेट बंद कर देते हैं। तथ्य यह है कि हम "रखने-जीवित" कनेक्शन का समर्थन नहीं करते हैं, प्रत्येक HTTP प्रतिक्रिया में "कनेक्शन: बंद" विकल्प के साथ रिपोर्ट किया जाता है और "HTTP / 1.0" के संस्करण को दर्शाता है। स्क्रिप्ट किसी भी तरह से मानकों को पूरा करने की कोशिश नहीं करती है, मैंने सबसे छोटा संभव प्रसंस्करण किया ताकि जो ब्राउज़र हाथ में थे (ओपेरा 12, IE7, क्रोम) ने संचरित डेटा पर सामान्य रूप से प्रतिक्रिया की, उन लोगों में जो आश्चर्य की बात नहीं थी।
सिस्को IOS पर सीधे भाषा वाक्य रचना की ख़ासियत मुख्य रूप से इस तथ्य से जुड़ी है कि TCL संस्करण 8.3.4 लागू है, और नवीनतम संस्करण 8.5.12 है। उदाहरण के लिए, सुविधाजनक
स्विच ,
-matchvar, और
-nocase विकल्प लागू नहीं
होते हैं । किसी भी स्थिति में, आप किसी भी प्लेटफ़ॉर्म पर लिख सकते हैं, यह सिंटैक्स से अधिक सख्ती से संबंधित है और फिर स्थानांतरण के साथ कोई समस्या नहीं होगी।
मैं कोड में थोड़ा पेंच कर सकता था, कहीं मैं शैली के साथ बहुत दूर चला गया, कहीं इसके विपरीत, कुछ उपकरणों पर यह इन उपकरणों की विशेषताओं को देखते हुए शुरू नहीं हो सकता है, लेकिन कुल मिलाकर यह मेरे लिए बहुत स्थिर लग रहा था। इसका उपयोग करते समय मुख्य बात यह याद रखना है कि यह सिर्फ एक उपकरण है, और इसे कैसे संलग्न करना है यह केवल इस बात पर निर्भर करता है कि कौन इस सिर को रखता है।
स्क्रिप्ट लिंक से ली जा सकती है -
cws.tclCisco पर TCL -
www.cisco.com/en/US/docs/ios/12_3t/12_3t2/feature/guide/gt_tcl.htmlटीसीएल कमांड्स -
www.tcl.tk/man/tcl8.5/TclCmd/contents.htm