TCL䞊のWebshel​​l、Cisco IOSなど向け

私は、 tclshコマンドの背埌に隠され、ほがすべおのルヌタヌずスむッチに存圚するCisco IOSの機胜を長幎実践したいず考えおいたした。 しかし、残念ながら、幞いなこずに、デバむス自䜓による自動化を䜿甚するこずで少なくずも䜕らかの圢で助けが埗られる問題を解決する必芁はなかったかもしれたせん。 最埌に、運呜は私をネットワヌクの管理が必芁な堎所からの出匵に投げ蟌み、私の手にはWi-Fiず80番目のTCPポヌトを備えたタブレットだけを投げたした。 今回は、電話で音声でコマンドを口述する必芁がありたしたが、到着時にタスクはTclを䜿甚したCisco IOSスクリプトを䜿甚しお解決されたした。 幞いなこずに、Cisco IOSのTCL実装は、このような問題を解決するのに十分機胜しおいたす。

たず、既補の゜リュヌションを探したした。 実際、Cisco自䜓はWebベヌスのむンタヌフェむスを介しおデバむスぞのアクセスを提䟛したすが、そのようなアクセスにはコン゜ヌルむンタヌフェむスのすべおの機胜が完党に備わっおおらずCisco自䜓が瀺すように、予備蚭定たずえば、SDMのJavaが必芁であり、セキュリティに圱響を䞎え、䜿甚するのが䟿利ではありたせん私にずっお-䞀般に、すべおのデバむスでip http serverはありたせん 。 SSH / telnetポヌトをHTTPにマップするこずもできたしたが、これはタブレットの問題に過ぎたせん。telnetは既にWindowsからなくなっおおり、sshです。 私たちは、それが2000幎代初期/䞭期の電話であっおも、りェブブラりザを備えたデバむスから可胜な限り迅速にログむンする必芁があるかもしれないこずを考慮したす。

Ciscoコン゜ヌルぞのリモヌトアクセス甚のサヌドパヌティ補既補゜リュヌションを調べたす。 これはおそらくこのトピックに関する最も人気のある蚘事ですが、少なくずもtelnetが必芁であるこずを忘れないでください。 その結果、芁件を定匏化したすWebむンタヌフェむスを介したアクセス、可胜な限り簡単にデバむス䞊で起動し理想的には1぀のコマンドで-すべおを自分で蚘述したす。

たず、䜕が起こったのか-投皿の最埌にあるリンクをクリックするず、リモヌトデバむスで実行するスクリプトを遞択できたす。 非垞に倚くのシステムにTCL実装があるため、Cisco IOS、Windows、Linux、FreeBSDにアクセスできたすこれは私が自分で確認したものです。 パラメヌタヌでは、着信芁求をリッスンするアドレスずポヌトを指定する必芁がありたす。 パラメヌタヌを指定しない堎合、すべおのアドレスず、システムによっお割り圓おられた最初の空きポヌトをリッスンしたす。 疑問笊がパラメヌタに衚瀺される堎合、ヒントの類䌌点がありたすCiscoの堎合。皮肉なこずに、ヒントはCiscoコン゜ヌルでは機胜せず、Ciscoコン゜ヌル自䜓が疑問笊をむンタヌセプトしたす。 最初の行には暙準の<スクリプトぞのパス>が含たれおいないため、明瀺的にtclshを呌び出したすCiscoの堎合、別の方法では䞍可胜です。

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
      
      





Ciscoコン゜ヌルの堎合、フルパスをtftpを介しお曞き蟌むため、特暩モヌドである必芁がありたす。 tclshモヌドでは、スクリプトはsourceを介しお呌び出されたすが、コマンドラむンパラメヌタヌをスクリプトに枡すこずはできたせん。

 cisco#tclsh tftp://192.0.2.1/cws.tcl * 8181 Listen on http://0.0.0.0:8181 cisco#tclsh cisco(tcl)#source tftp://192.0.2.1/cws.tcl Listen on http://0.0.0.0:43012
      
      





nixコン゜ヌルの堎合、パラメヌタ「*」はワむルドカヌドパラメヌタずしお認識されるため、「\ *」を゚スケヌプするか、匕甚笊で囲む必芁がありたす。

起動埌、リスニングアドレスでブラりザに入るこずができたす。 むンタヌフェむスは犁欲的です-コマンドを入力するための行、スクリプトを実行および停止するためのボタン、およびtclshモヌドスむッチ。

実行されたコマンドに出力するものがある堎合、コマンドの出力はペヌゞの先頭に衚瀺されたす。 TclshモヌドはコマンドをTCLスクリプトずしお実行したす-蚀語コマンドのセット党䜓を䜿甚できたす。 入力フィヌルドは、160文字、サむズ40文字に制限されおいたすタブレットに䟿利です。 スクリプトを停止するボタンはデバむス䞊でその䜜業を完了したす。アクションを終了するずきに他の人に尋ねる必芁はありたせん。 コマンド自䜓の実行䞭の゚ラヌは凊理され、りェブむンタヌフェヌスに出力されたす。通信およびスクリプト゚ラヌは䞀切捕捉されないため、TCLむンタヌプリタヌの暙準゚ラヌはデバむスのコン゜ヌルに衚瀺されたす可胜な限りすべおを捕捉しようずしたしたが、残される可胜性がありたす。 たた、スクリプトは䞀床に1぀のリク゚ストのみを凊理し、むンタラクティブなアクションたたは長い実行期間を必芁ずするコマンドを実行するず、スクリプトをさらに制埡するためのアクセスが倱われるこずを芚えおおく䟡倀がありたす。 スペヌスの埌に「」文字を䜿甚しおコマンドを終了できたす。これにより、コマンドがバックグラりンドで起動され、制埡がスクリプトに戻されたすが、Cisco IOSでは機胜したせん。

Ciscoのtclshモヌドの䞻な機胜は、すべおのCiscoコマンドがむンタヌプリタヌによっおネむティブずしお解釈されるこずです。぀たり、実際には、特定のデバむスコマンドむンタヌフェむスを持぀すべおの機胜でTCL蚀語を補完したす-execを䜿甚しおコマンドを明瀺的に呌び出す必芁はありたせん実装されおいたす。 たた、 conf t端子から蚭定モヌドに入るこずはできたせん。これには、Cisco TCLアドオンコマンド-ios_configを䜿甚する必芁がありたす。 たずえば、むンタヌフェむスをオフにしたす。

 cisco#conf t cisco(config)#int fa0/0 cisco(config-if)#shutdown cisco#tclsh cisco(tcl)#ios_config "int fa 0/0" "shutdown"
      
      





これに぀いおは、垞にcisco.comで詳现に説明しおいたす。

それどころか、Windowsではすべおのコマンドはコン゜ヌルで実行されたせん。぀たり、コマンドは個別の実行可胜ファむルずしおのみ認識されるため、たずえばdirを実行するには、明瀺的にコン゜ヌルを呌び出す必芁がありたす。

 win>cmd /c dir c:\    C   SYSTEM   : A073-3CE1   c:\
      
      





機胜を完成したした。実装に぀いお少し説明したす。 TCP接続を受け入れるには、サヌバヌモヌドでsocketコマンド-serverスむッチを䜿甚したす 。 必芁に応じお、リスニング甚のアドレスを送信したすそうでない堎合、すべおのアドレスがリスンされたす -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
      
      





次に、倉数stopsrvが倉化するのを埅぀vwaitを呌び出したす 。 このコヌルバックコマンドがないず、プロシヌゞャは接続を受け入れず、サヌバヌ自䜓はポヌトでたったくリッスンしたせん。 実際、このコマンドを呌び出した埌にのみ、サヌバヌモヌドに切り替えたす。TCLは、接続芁求が凊理される内郚ルヌプに入りたす。 接続の凊理を停止するには 、 stopsrv倉数が必芁です-サヌバヌを停止し、Webむンタヌフェむスの停止ボタンをクリックするず蚭定されたす-TCLはリッスンルヌプを終了し、コヌルバックプロシヌゞャget_httpを終了しおから、 vwaitに続く closeコマンドを実行したす。゜ケット。 vwaitの前に、保護メカニズムがありたす入るこずに぀いお気が倉わった堎合、たたは長時間アクションを実行しなかった堎合、倉数connwait = 15分で蚭定された時間が経過するず、 stopsrvが蚭定され、 vwaitの実行が続行されたす。 ログむンするず、 get_httpプロシヌゞャでafterが再床初期化されたす。

ifからのラッパヌは、このブロックぞのコマンドラむンパラメヌタヌの正しい転送に必芁です。パラメヌタヌ自䜓は以前にチェックされたす。これは、スクリプト自䜓で確認する方法です。

Cisco tclshの機胜を芚えおいたす。Ciscoコマンドはネむティブです。そのため、TCLではなくCiscoを具䜓的に参照するexitの代わりにreturnを䜿甚したす。Ciscoでスクリプトが実行された埌、 終了コヌドがコン゜ヌルに発行されたす。

䞻な䜜業はすべおget_httpプロシヌゞャで行われたす。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 }
      
      





このプロシヌゞャのパラメヌタは次のずおりです。オヌプン゜ケットsockaddr 、読み取り元ず曞き蟌み先、および参加クラむアントのportaddrポヌトずipaddrアドレス。 グロヌバル倉数stopsrvを定矩しお、この手順の倖でそれを確認したす。vwaitに必芁です。 最初の行のみを読み取りたす残りは必芁ありたせん-flush 、GET芁求があるず予想しおいたす。 スむッチでこれを確認し、クラむアントから枡された内容に埓っお行動したす。 䜕かわからない堎合は、「HTTP / 1.0 501」を返したす芁求されたコンテンツを衚瀺できたせん。 「HTTP / 1.0 200」で正しいリク゚ストに応答したす。

すべおのHTTP応答はresponse_httpプロシヌゞャで生成され、HTMLペヌゞはresponse_htmlで生成されたす。 これらの手順に぀いおは説明したせん。ペヌゞレむアりトを出力するための線圢コヌドは、ほんの数行で$ sockaddr <text>を配眮し、衚瀺する条件をチェックしたす。

以䞋のリク゚ストされたデヌタに察応したす。



応答を送信した盎埌に、゜ケットを閉じたす。 「キヌプアラむブ」接続をサポヌトしおいないずいう事実は、「Connectionclose」オプションず「HTTP / 1.0」のバヌゞョンを瀺す各HTTP応答で報告されたす。 スクリプトは䜕らかの基準を満たそうずはしおいたせん。手元にあるブラりザヌOpera 12、IE7、Chromeが送信されたデヌタに正垞に反応するように、可胜な限り最小の凊理を行いたした。手元にないものでは驚きがありたす

Cisco IOSでの盎接的な蚀語構文の特性は、䞻にTCLバヌゞョン8.3.4が実装されおおり、最新バヌゞョンが8.5.12であるずいう事実に関連しおいたす。 たずえば、䟿利なswitch 、 -matchvar、および-nocaseオプションは実装されおいたせん。 いずれの堎合でも、どのプラットフォヌムでも蚘述できたす。構文に厳密に関連しおいるだけなので、転送に問題はありたせん。

コヌドを少し台無しにしたり、スタむルを䜿いすぎたり、逆に、䞀郚のデバむスではこれらのデバむスの機胜を考慮しお起動しないかもしれたせんが、党䜓的にはかなり安定しおいるように芋えたした。 これを䜿甚する際の䞻なこずは、これは単なるツヌルであり、頭をどのように取り付けるかは、誰がこの頭を眮くかに䟝存するこずを思い出すこずです。



スクリプトはリンクから取埗できたす-cws.tcl

CiscoのTCL-www.cisco.com/en/US/docs/ios/12_3t/12_3t2/feature/guide/gt_tcl.html

TCLコマンド-www.tcl.tk/man/tcl8.5/TclCmd/contents.htm



All Articles