From dc32f808cf1432da2dd95004832fa4edcddf9bd4 Mon Sep 17 00:00:00 2001 From: 兔子 Date: Thu, 5 Sep 2019 17:23:50 +0800 Subject: [PATCH] add tcp/udp mode --- vtqe/tools/cd.go | 38 ++++ vtqe/tools/cmd.go | 2 +- vtqe/tools/tcp.go | 406 +++++++++++++++++++++++++++++++++++++++++++ vtqe/tools/tcping.go | 25 +-- vtqe/tools/udp.go | 116 +++++++++++++ vtqe/tools/vic.go | 8 +- 6 files changed, 577 insertions(+), 18 deletions(-) create mode 100644 vtqe/tools/cd.go create mode 100644 vtqe/tools/tcp.go create mode 100644 vtqe/tools/udp.go diff --git a/vtqe/tools/cd.go b/vtqe/tools/cd.go new file mode 100644 index 0000000..6b83fce --- /dev/null +++ b/vtqe/tools/cd.go @@ -0,0 +1,38 @@ +// +build windows + +package tools + +import ( + "bufio" + "os" + "os/exec" + "path/filepath" + + "github.com/spf13/cobra" +) + +var cdcmd = &cobra.Command{ + Use: "cd", + Short: "便捷进入文件夹", + Long: "使用stdin便捷进入文件夹", + Run: func(this *cobra.Command, args []string) { + fileInfo, _ := os.Stdin.Stat() + if (fileInfo.Mode() & os.ModeNamedPipe) != os.ModeNamedPipe { + if len(args) != 1 { + os.Exit(1) + } else { + exec.Command("cmd.exe", "/c", "explorer "+filepath.Dir(args[0])).Run() + return + } + } + s := bufio.NewScanner(os.Stdin) + for s.Scan() { + exec.Command("cmd.exe", "/c", "explorer "+filepath.Dir(s.Text())).Run() + return + } + }, +} + +func init() { + Maincmd.AddCommand(cdcmd) +} diff --git a/vtqe/tools/cmd.go b/vtqe/tools/cmd.go index 32a7b4e..1a68c60 100644 --- a/vtqe/tools/cmd.go +++ b/vtqe/tools/cmd.go @@ -4,7 +4,7 @@ import ( "github.com/spf13/cobra" ) -var Version string = "0.1.12" +var Version string = "0.1.15" var Maincmd = &cobra.Command{ Use: "", diff --git a/vtqe/tools/tcp.go b/vtqe/tools/tcp.go new file mode 100644 index 0000000..260157c --- /dev/null +++ b/vtqe/tools/tcp.go @@ -0,0 +1,406 @@ +package tools + +import ( + "fmt" + "io" + "io/ioutil" + "net" + "os" + "path/filepath" + "regexp" + "runtime" + "strconv" + "strings" + "time" + + "b612.me/starainrt" + + "github.com/spf13/cobra" +) + +var tcpcmd = &cobra.Command{ + Use: "tcp", + Short: "发送并监听tcp数据包", + Long: "发送并监听tcp数据包", + Run: func(this *cobra.Command, args []string) { + if len(args) != 1 { + fmt.Println("请指定远程tcp地址") + return + } + l, _ := this.Flags().GetString("lport") + p, _ := this.Flags().GetString("rport") + a, _ := this.Flags().GetString("laddr") + s, _ := this.Flags().GetBool("local") + b, _ := this.Flags().GetBool("byte") + laddr, err := net.ResolveTCPAddr("tcp", a+":"+l) + if err != nil { + fmt.Println(err) + return + } + if s { + tcplisten, err := net.ListenTCP("tcp", laddr) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("监听已建立") + defer tcplisten.Close() + go func() { + for { + conn, err := tcplisten.AcceptTCP() + if err != nil { + fmt.Printf("Error Connect From %s : %s\n", conn.RemoteAddr(), err.Error()) + continue + } + fmt.Printf("Accept Connect From %s\n", conn.RemoteAddr()) + go func(conns *net.TCPConn) { + for { + buf := make([]byte, 204800) + n, err := conns.Read(buf) + if err != nil { + fmt.Printf("Error from %s Where Message=%s\n", conns.RemoteAddr(), err.Error()) + conn.Close() + return + } + fmt.Printf("Receive Msg From %s : %s\n", conns.RemoteAddr(), string(buf[0:n])) + if b { + fmt.Println(buf[0:n]) + } + } + + }(conn) + } + }() + } + mytcp, err := net.DialTimeout("tcp", args[0]+":"+p, time.Second*15) + if err != nil { + fmt.Println(err) + if s { + for { + time.Sleep(time.Second * 10) + } + } + return + } + defer mytcp.Close() + fmt.Println("TCP连接已建立") + go func() { + var err error + for { + txt := starainrt.MessageBox("", "") + if txt == "" { + continue + } + if !b { + _, err = mytcp.Write([]byte(txt)) + } else { + var sendbyte []byte + bytes := strings.Split(txt, ",") + for _, v := range bytes { + ints, _ := strconv.Atoi(v) + if ints < 0 || ints > 255 { + continue + } + sendbyte = append(sendbyte, byte(ints)) + } + _, err = mytcp.Write(sendbyte) + } + if err != nil { + fmt.Printf("Error from %s Where Message=%s\n", mytcp.RemoteAddr().String(), err.Error()) + return + } + } + }() + for { + buf := make([]byte, 204800) + n, err := mytcp.Read(buf) + if err != nil { + fmt.Printf("Error from %s Where Message=%s\n", mytcp.RemoteAddr().String(), err.Error()) + return + } + + fmt.Printf("Receive Msg From %s : %s\n", mytcp.RemoteAddr().String(), string(buf[0:n])) + if b { + fmt.Println(buf[0:n]) + } + } + }, +} + +/* + + */ + +func init() { + Maincmd.AddCommand(tcpcmd) + tcpcmd.Flags().BoolP("byte", "b", false, "发送二进制数据") + tcpcmd.Flags().StringP("lport", "l", "1127", "本地监听端口") + tcpcmd.Flags().StringP("rport", "p", "1127", "远程连接端口") + tcpcmd.Flags().StringP("laddr", "a", "0.0.0.0", "本地监听ip") + tcpcmd.Flags().BoolP("local", "s", false, "启动本地监听") + tcpsendcmd.Flags().StringP("port", "p", "1127", "远程连接端口") + tcpsendcmd.Flags().StringP("addr", "a", "0.0.0.0", "远程监听ip") + tcpsendcmd.Flags().StringP("regexp", "r", "", "正则匹配字符串") + tcprecvcmd.Flags().StringP("port", "p", "1127", "本地监听端口") + tcprecvcmd.Flags().StringP("addr", "a", "0.0.0.0", "本地监听ip") + tcpcmd.AddCommand(tcpsendcmd, tcprecvcmd) +} + +var cansend bool = false +var tcpsendcmd = &cobra.Command{ + Use: "send", + Short: "通过tcp发送文件", + Long: "通过tcp接受文件", + Run: func(this *cobra.Command, args []string) { + stop := false + p, _ := this.Flags().GetString("port") + a, _ := this.Flags().GetString("addr") + r, _ := this.Flags().GetString("regexp") + if len(args) != 1 { + this.Help() + return + } + mytcp, err := net.DialTimeout("tcp", a+":"+p, time.Second*15) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("TCP连接已建立") + defer mytcp.Close() + go func() { + for { + buf := make([]byte, 1048576) + n, err := mytcp.Read(buf) + if err != nil { + if !stop { + fmt.Println(err) + os.Exit(1) + } + continue + } + data := string(buf[0:n]) + if data == "oksend!" { + cansend = true + } else { + fmt.Println(data) + os.Exit(1) + } + } + }() + file := args[0] + if file[len(file)-1:] == "\\" || file[len(file)-1:] == "/" { + file = file[0 : len(file)-1] + } + file, _ = filepath.Abs(file) + Scan(file, "", mytcp, r) + stop = true + mytcp.Write([]byte("jane&0&0")) + return + }, +} + +func tcpupload(file, prefix string, mytcp net.Conn) error { + if runtime.GOOS == "windows" { + file = strings.Replace(file, "/", "\\", -1) + prefix = strings.Replace(prefix, "/", "\\", -1) + } + fmt.Println(file) + fpsrc, err := os.Open(file) + if err != nil { + fmt.Println(err) + return err + } + stat, _ := os.Stat(file) + filebig := float64(stat.Size()) + _, err = mytcp.Write([]byte("victorique&" + stat.Name() + "&" + prefix)) + if err != nil { + fmt.Println(err) + return err + } + var sakura int = 0 + for !cansend { + time.Sleep(time.Millisecond * 100) + sakura++ + if sakura > 50 { + mytcp.Write([]byte{1, 9, 9, 6, 1, 1, 2, 7, 6, 6, 6, 1, 1, 2, 7}) + time.Sleep(time.Millisecond * 100) + mytcp.Write([]byte("victorique&" + stat.Name() + "&" + prefix)) + } + } + cansend = false + sum := 0 + for { + buf := make([]byte, 1048576) + n, err := fpsrc.Read(buf) + if err != nil { + if err == io.EOF { + time.Sleep(time.Millisecond * 8) + err = nil + mytcp.Write([]byte{1, 9, 9, 6, 1, 1, 2, 7, 6, 6, 6, 1, 1, 2, 7}) + break + } + fmt.Println(err) + return err + } + _, err = mytcp.Write(buf[0:n]) + if err != nil { + fmt.Println(err) + return err + } + sum += n + fmt.Printf("当前已传输:%f\r", float64(sum)/filebig*100) + } + fmt.Printf("当前已传输:%f\n\n", 100.000000) + fpsrc.Close() + time.Sleep(time.Millisecond * 8) + return nil +} + +func Scan(path, prefix string, mytcp net.Conn, reg string) { + var err error + var regp *regexp.Regexp + if prefix != "" { + prefix += "/" + } + if reg != "" { + regp, err = regexp.Compile(reg) + if err != nil { + fmt.Println(err) + return + } + } + if runtime.GOOS == "windows" { + path = strings.Replace(path, "/", "\\", -1) + prefix = strings.Replace(prefix, "/", "\\", -1) + } + if starainrt.IsFile(path) { + if reg != "" { + if regp.MatchString(path) { + tcpupload(path, prefix, mytcp) + } + } else { + tcpupload(path, prefix, mytcp) + } + } else if starainrt.IsFolder(path) { + dir, err := ioutil.ReadDir(path) + if err != nil { + fmt.Println(err) + return + } + for _, v := range dir { + if v.IsDir() && (v.Name() != "." || v.Name() != "..") { + mytcp.Write([]byte("b612&" + prefix + v.Name() + "&0")) + time.Sleep(time.Millisecond * 10) + Scan(path+"/"+v.Name(), prefix+v.Name(), mytcp, reg) + } else { + if reg != "" { + if regp.MatchString(path + "/" + v.Name()) { + err = tcpupload(path+"/"+v.Name(), prefix, mytcp) + } + } else { + err = tcpupload(path+"/"+v.Name(), prefix, mytcp) + } + if err != nil { + fmt.Println(err) + return + } + } + } + } + +} + +var tcprecvcmd = &cobra.Command{ + Use: "recv", + Short: "通过tcp接收文件", + Long: "通过tcp接收文件", + Run: func(this *cobra.Command, args []string) { + p, _ := this.Flags().GetString("port") + a, _ := this.Flags().GetString("addr") + laddr, err := net.ResolveTCPAddr("tcp", a+":"+p) + if err != nil { + fmt.Println(err) + return + } + tcplisten, err := net.ListenTCP("tcp", laddr) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("TCP监听已建立") + defer tcplisten.Close() + for { + conn, err := tcplisten.AcceptTCP() + if err != nil { + fmt.Printf("Error Connect From %s : %s\n", conn.RemoteAddr(), err.Error()) + continue + } + fmt.Printf("Accept Connect From %s\n", conn.RemoteAddr()) + go func(conns *net.TCPConn) { + canrecv := false + name := "" + var fpdst *os.File + defer conns.Close() + var sum int + for { + buf := make([]byte, 1048576) + n, err := conns.Read(buf) + + if !canrecv { + if err != nil { + fmt.Println(err) + return + } + data := string(buf[0:n]) + str := strings.Split(data, "&") + if len(str) != 3 { + continue + } + if str[0] == "victorique" { + canrecv = true + name = str[1] + prefix := str[2] + if prefix == "" { + fpdst, err = os.Create("./" + name) + } else { + fpdst, err = os.Create(prefix + "/" + name) + } + if err != nil { + fmt.Println(err) + conns.Write([]byte(err.Error())) + return + } + conns.Write([]byte("oksend!")) + } else if str[0] == "b612" { + os.MkdirAll(str[1], 0644) + } else if str[0] == "jane" { + return + } + } else { + if n == 15 { + ok := func() bool { + for k, v := range []byte{1, 9, 9, 6, 1, 1, 2, 7, 6, 6, 6, 1, 1, 2, 7} { + if buf[k] != v { + return false + } + } + return true + }() + if ok { + fmt.Printf("已写入:%d 字节\n", sum) + fmt.Println(name + "接收成功\n") + fpdst.Close() + canrecv = false + continue + } + } + fpdst.Write(buf[0:n]) + sum += n + fmt.Printf("已写入:%d 字节\r", sum) + } + } + }(conn) + } + + }, +} diff --git a/vtqe/tools/tcping.go b/vtqe/tools/tcping.go index 4800334..b72f2f7 100644 --- a/vtqe/tools/tcping.go +++ b/vtqe/tools/tcping.go @@ -15,19 +15,18 @@ import ( ) var ( - showVersion bool - version string - gitCommit string - counter int - timeout string - interval string - sigs chan os.Signal + counter int + timeout string + interval string + sigs chan os.Signal httpMode bool httpHead bool httpPost bool httpUA string + permanent bool + dnsServer []string ) @@ -48,11 +47,13 @@ var tcpingcmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { sigs = make(chan os.Signal, 1) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) - if showVersion { - fmt.Printf("version: %s\n", version) - fmt.Printf("git: %s\n", gitCommit) + if permanent && counter != 4 { + fmt.Println("不能同时指定-t与-c,请检查您的输入") return } + if permanent { + counter = 0 + } if len(args) != 2 && len(args) != 1 { cmd.Usage() return @@ -162,15 +163,15 @@ var tcpingcmd = &cobra.Command{ } func init() { - tcpingcmd.Flags().BoolVarP(&showVersion, "version", "v", false, "show the version and exit") tcpingcmd.Flags().IntVarP(&counter, "counter", "c", 4, "ping的次数") + tcpingcmd.Flags().BoolVarP(&permanent, "permanent", "t", false, "一直ping下去") tcpingcmd.Flags().StringVarP(&timeout, "timeout", "T", "1s", `超时时间, 单位为 "ns", "us" (or "µs"), "ms", "s", "m", "h"`) tcpingcmd.Flags().StringVarP(&interval, "interval", "I", "1s", `ping间隔时间, 单位为 "ns", "us" (or "µs"), "ms", "s", "m", "h"`) tcpingcmd.Flags().BoolVarP(&httpMode, "http", "H", false, `Use "HTTP" mode. will ignore URI Schema, force to http`) tcpingcmd.Flags().BoolVar(&httpHead, "head", false, `使用http head模式`) tcpingcmd.Flags().BoolVar(&httpPost, "post", false, `使用http post模式`) - tcpingcmd.Flags().StringVar(&httpUA, "user-agent", "tcping", `自定义UA`) + tcpingcmd.Flags().StringVar(&httpUA, "user-agent", "victorique/tcping", `自定义UA`) tcpingcmd.Flags().StringArrayVarP(&dnsServer, "dns-server", "D", nil, `使用自定义DNS服务器`) diff --git a/vtqe/tools/udp.go b/vtqe/tools/udp.go new file mode 100644 index 0000000..aa5a5ed --- /dev/null +++ b/vtqe/tools/udp.go @@ -0,0 +1,116 @@ +package tools + +import ( + "fmt" + "net" + "strconv" + "strings" + + "b612.me/starainrt" + + "github.com/spf13/cobra" +) + +var udpcmd = &cobra.Command{ + Use: "udp", + Short: "发送并监听udp数据包", + Long: "发送并监听udp数据包", + Run: func(this *cobra.Command, args []string) { + if len(args) != 1 { + fmt.Println("请指定远程udp地址") + return + } + l, _ := this.Flags().GetString("lport") + p, _ := this.Flags().GetString("rport") + a, _ := this.Flags().GetString("laddr") + s, _ := this.Flags().GetBool("local") + b, _ := this.Flags().GetBool("byte") + laddr, err := net.ResolveUDPAddr("udp", a+":"+l) + raddr, err := net.ResolveUDPAddr("udp", args[0]+":"+p) + if err != nil { + fmt.Println(err) + return + } + if s { + udplisten, err := net.ListenUDP("udp", laddr) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("监听已建立") + go func() { + for { + buf := make([]byte, 204800) + n, addr, err := udplisten.ReadFromUDP(buf) + if err != nil { + fmt.Printf("Error from %s Where Message=%s\n", addr.String(), err.Error()) + continue + } + fmt.Printf("Receive Msg From %s : %s\n", addr.String(), string(buf[0:n])) + if b { + fmt.Println(buf[0:n]) + } + } + }() + } + myudp, err := net.DialUDP("udp", nil, raddr) + if err != nil { + fmt.Println(err) + return + } + fmt.Println("UDP虚拟连接已建立") + go func() { + var err error + for { + txt := starainrt.MessageBox("", "") + if txt == "" { + continue + } + if !b { + _, err = myudp.Write([]byte(txt)) + } else { + var sendbyte []byte + bytes := strings.Split(txt, ",") + for _, v := range bytes { + ints, _ := strconv.Atoi(v) + if ints < 0 || ints > 255 { + continue + } + sendbyte = append(sendbyte, byte(ints)) + } + _, err = myudp.Write(sendbyte) + } + if err != nil { + fmt.Printf("Error from %s Where Message=%s\n", myudp.RemoteAddr().String(), err.Error()) + return + } + } + }() + for { + buf := make([]byte, 204800) + n, err := myudp.Read(buf) + if err != nil { + fmt.Printf("Error from %s Where Message=%s\n", myudp.RemoteAddr().String(), err.Error()) + return + } + + fmt.Printf("Receive Msg From %s : %s\n", myudp.RemoteAddr().String(), string(buf[0:n])) + if b { + fmt.Println(buf[0:n]) + } + } + }, +} + +/* + + */ + +func init() { + Maincmd.AddCommand(udpcmd) + udpcmd.Flags().BoolP("byte", "b", false, "发送二进制数据") + udpcmd.Flags().StringP("lport", "l", "1127", "本地监听端口") + udpcmd.Flags().StringP("rport", "p", "1127", "远程连接端口") + udpcmd.Flags().StringP("laddr", "a", "0.0.0.0", "本地监听ip") + udpcmd.Flags().BoolP("local", "s", false, "启动本地监听") +} diff --git a/vtqe/tools/vic.go b/vtqe/tools/vic.go index f68e145..9721be9 100644 --- a/vtqe/tools/vic.go +++ b/vtqe/tools/vic.go @@ -21,11 +21,9 @@ var viccmd = &cobra.Command{ pwd, _ := this.Flags().GetString("key") rep, _ := this.Flags().GetBool("replace") ext, _ := this.Flags().GetBool("extension") - if len(args) != 2 { - if len(args) < 2 || args[1] != "sakura" { - starlog.Println("ヴィクトリカだけが使えるよ", "red", "b") - return - } + if len(args) != 2 || args[1] != "sakura" { + starlog.Println("ヴィクトリカだけが使えるよ", "red", "b") + return } shell := func(pect float64) { if pect == 100 {