1: #!/usr/bin/tcl -n 2: set port [lindex $argv 0] 3: if {$port==""} { puts "Usage:\n\t$argv0 <port>"; exit 1 } 4: 5: proc bgerror {error} { puts "$error" } 6: 7: proc ProccessConnect {s a p} { 8: global DefaultSock 9: puts "Connection from $a/$p ($s \[Default\])" 10: fileevent $s readable "ProcCommand $s" 11: set DefaultSock $s 12: } 13: proc SendCommand {} { 14: global DefaultSock 15: gets stdin data 16: if {[string index $data 0]=="-"} { 17: set cmd [lindex [string range $data 1 end] 0] 18: switch $cmd { 19: exit { exit } 20: } 21: } 22: if {[string index $data 0]!="="} { set outsock $DefaultSock } else { set outsock [string range [lindex $data 0] 1 end]; set data [lrange $data 1 end] } 23: catch { 24: puts $outsock "$data" 25: flush $outsock 26: } 27: } 28: 29: proc ProcCommand {sock} { 30: global DefaultSock 31: if {$sock!=$DefaultSock} { set hdr "($sock) " } else { set hdr "" } 32: gets $sock data 33: foreach ln [split $data \n] { 34: puts "$hdr$ln" 35: flush stdout 36: } 37: if {[eof $sock]} { 38: puts "$hdr\Connection closed." 39: catch { close $sock } 40: } 41: } 42: 43: proc sendbreak {cmd} { 44: global DefaultSock 45: catch { 46: puts -nonewline $DefaultSock "$cmd" 47: flush $DefaultSock 48: } 49: return 0 50: } 51: 52: proc prompt {} { 53: global DefaultSock 54: puts "!" 55: return 0 56: } 57: 58: puts "REVERSE TELNET Client. Listening for host on port $port" 59: fileevent stdin readable SendCommand 60: socket -server ProccessConnect $port 61: signal -restart trap INT "sendbreak \003" 62: signal -restart trap TSTP "sendbreak \032" 63: vwait forever 64: rtelnet.tcl is the client (unfirewalled) side of rtelnet. |