ãŸããæ¢è£œã®ãœãªã¥ãŒã·ã§ã³ãæ¢ããŸããã å®éã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>ãé 眮ãã衚瀺ããæ¡ä»¶ããã§ãã¯ããŸãã
以äžã®ãªã¯ãšã¹ããããããŒã¿ã«å¯Ÿå¿ããŸãã
- /-ã«ãŒã -ããŒãžã衚瀺ããããã€ã¹ã®ã³ã³ãœãŒã«ã«ã誰ãæ¥ãã®ããæžã蟌ã¿ãŸã-ã¢ãã¬ã¹ãšããŒãã ãŸãã åŸã«äžæåæ¢ããã£ã³ã»ã«ããŸãã
- / close- ã¹ã¯ãªããã®äœæ¥ãçµäºããŸã -å€æ°stopsrvãèšå®ããŸãïŒå®éããã©ã¡ãŒã¿ãŒã®ãªããã©ãŒã ããã®ãªã¯ãšã¹ãã®ããã«ãã¯ã©ã€ã¢ã³ãããã/ closeïŒããå±ããŸãïŒã
- / cmd = <command>ïŒtclsh-æåã«ãHTTPãªã¯ãšã¹ãããããã¹ããéããŸã-ãã¹ãŠã®ã¹ããŒã¹ãã+ãã«çœ®ãæããããåŠçãããè¡ãå°çããŸãããã¹ãŠã®éæšæºæåïŒæåãšæ°åãé€ãã»ãšãã©ãã¹ãŠã®æåïŒã¯ïŒ XXãšããŠè¡šãããŸãã ãã®ããã«ãã»ãŒåžžã«Wiki TCLã§expandPercentã䜿çšããŸãã 次ã«ã catchãä»ããŠã¯ãªãŒãã³ã°ãããã³ãã³ããå®è¡ããçµæãmsgoutã«ä¿åããŠãããŒãžã«åºåããŸãã ãã®æ¹æ³ã§ã³ãã³ããåŒã³åºãããšã«ãããå®è¡ã®å¯èœæ§ã®ãããšã©ãŒããã£ããããŸãã ãtclshããã©ã¡ãŒã¿ãŒãååšããå Žåã¯ãã®ãŸãŸå®è¡ããååšããªãå Žåã¯execãä»ããŠå®è¡ããŸããããã«ãããããã€ã¹ã®ã³ã³ãœãŒã«ã§ã³ãã³ããå®è¡ããå¹æãåŸãããŸãã
å¿çãéä¿¡ããçŽåŸã«ããœã±ãããéããŸãã ãããŒãã¢ã©ã€ããæ¥ç¶ããµããŒãããŠããªããšããäºå®ã¯ãã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