diff --git a/vtqe/tools/cmd.go b/vtqe/tools/cmd.go index 3cf6fd0..ea90a04 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.18" +var Version string = "0.1.20" var Maincmd = &cobra.Command{ Use: "", diff --git a/vtqe/tools/http.go b/vtqe/tools/http.go index f2979f2..4479b98 100644 --- a/vtqe/tools/http.go +++ b/vtqe/tools/http.go @@ -113,8 +113,8 @@ func httplisten(w http.ResponseWriter, r *http.Request) { fpdst, err := os.Open(fullpath) if err != nil { fmt.Println(err) - w.WriteHeader(502) - w.Write([]byte("

502 ERROR

")) + w.WriteHeader(403) + w.Write([]byte("

403 NO ACCESS

")) return } fpinfo, _ := os.Stat(fullpath) @@ -160,19 +160,20 @@ func ReadFolder(w http.ResponseWriter, r *http.Request, fullpath string, isroot if err != nil { fmt.Println(err) w.WriteHeader(403) - w.Write([]byte("

Cannot Access!

")) - return + w.Write([]byte("

May Cannot Access!

")) } w.Write([]byte("\n\n

Victorique Http Server - " + Version + "

")) if up { w.Write([]byte("Upload Web Page Is Openned!

")) } w.Write([]byte("
\n"))
-	if !isroot {
-		w.Write([]byte(fmt.Sprintf("

%s %s

\n", r.URL.Path+"/..", "..", "上层文件夹"))) - } if r.URL.Path == "/" { r.URL.Path = "" + } else if r.URL.Path[len(r.URL.Path)-1:] == "/" { + r.URL.Path = r.URL.Path[0 : len(r.URL.Path)-1] + } + if !isroot { + w.Write([]byte(fmt.Sprintf("

%s %s

\n", r.URL.Path+"/..", "..", "上层文件夹"))) } for _, v := range dir { if v.Name() != "." || v.Name() != ".." { diff --git a/vtqe/tools/net.go b/vtqe/tools/net.go index 168c149..123a216 100644 --- a/vtqe/tools/net.go +++ b/vtqe/tools/net.go @@ -27,8 +27,8 @@ func init() { natccmd.Flags().BoolP("tcp", "t", false, "TCP穿透") natccmd.Flags().BoolP("udp", "u", false, "UDP穿透") - natccmd.Flags().StringP("port", "p", "1127", "转发穿透端口") - natccmd.Flags().StringP("key", "k", "1127", "认证密码") + natccmd.Flags().IntP("port", "p", 1127, "转发穿透端口") + natccmd.Flags().StringP("key", "k", "sakura", "认证密码") natccmd.Flags().StringP("address", "a", "127.0.0.1", "转发穿透地址") } @@ -130,7 +130,7 @@ var natccmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { t, _ := cmd.Flags().GetBool("tcp") u, _ := cmd.Flags().GetBool("udp") - p, _ := cmd.Flags().GetString("port") + p, _ := cmd.Flags().GetInt("port") k, _ := cmd.Flags().GetString("key") a, _ := cmd.Flags().GetString("address") /*udplocal, err := net.ResolveUDPAddr("udp", a+":"+p) @@ -152,13 +152,13 @@ var natccmd = &cobra.Command{ fmt.Println(err) return } - tcpforward, err := net.ResolveTCPAddr("tcp", a+":"+p) + tcpforward, err := net.ResolveTCPAddr("tcp", a+":"+strconv.Itoa(p)) if err != nil { fmt.Println(err) return } udprmt, _ := net.ResolveUDPAddr("udp", args[0]) - udpforward, _ := net.ResolveUDPAddr("udp", a+":"+p) + udpforward, _ := net.ResolveUDPAddr("udp", a+":"+strconv.Itoa(p)) if t { go TcpNatClient(tcprmt, tcpforward, k) } @@ -181,6 +181,7 @@ func UdpNatClient(udpremote, udpforward *net.UDPAddr, pwd string) { var trueconn *net.UDPConn var err error ismain := false + var lastcheck int64 dialudp := func(udpaddr *net.UDPAddr) (*net.UDPConn, error) { trueconn, err := net.DialUDP("udp", nil, udpaddr) if err != nil { @@ -188,63 +189,94 @@ func UdpNatClient(udpremote, udpforward *net.UDPAddr, pwd string) { } return trueconn, nil } + defer func() { + if err := recover(); err != nil { + fmt.Println("PANIC:", err) + } + }() for { - for trueconn, err = dialudp(udpremote); err != nil; trueconn, err = dialudp(udpremote) { - fmt.Println(err) + trueconn, err = dialudp(udpremote) + if err != nil || trueconn == nil { time.Sleep(5 * time.Second) + fmt.Println(err) + continue } - - fmt.Println("远端服务器连接成功" + trueconn.RemoteAddr().String()) + fmt.Println("UDP远端服务器连接成功" + trueconn.RemoteAddr().String()) trueconn.Write([]byte(pwd)) go func() { - for { - time.Sleep(time.Second * 5) - if !ismain { + for !ismain { + time.Sleep(time.Second * 2) + if trueconn != nil { + if ismain { + return + } _, err := trueconn.Write([]byte(pwd)) if err != nil { + fmt.Println(err) return } } } }() - for { - var conn1, conn2 *net.UDPConn - buf := make([]byte, 7) - n, err := trueconn.Read(buf) - if n != 7 || err != nil { - fmt.Println(err) - trueconn.Close() - ismain = false - break - } - switch string(buf) { - case "yesyesi": - ismain = true - fmt.Println("主节点认证成功") - go func() { - for { - time.Sleep(time.Second * 2) - trueconn.Write([]byte("vicregs")) - } - }() - case "newconn": - if !ismain { - trueconn.Close() + go func() { + for { + if trueconn == nil { break } - for conn1, err = dialudp(udpforward); err != nil; conn1, err = dialudp(udpforward) { - time.Sleep(time.Second * 2) + var conn1, conn2 *net.UDPConn + buf := make([]byte, 7) + n, err := trueconn.Read(buf) + if n != 7 || err != nil { + fmt.Println(err) + trueconn = nil + ismain = false + fmt.Println("UDP下线01") + break } - fmt.Println("已连接转发远端:" + conn1.RemoteAddr().String()) - for conn2, err = dialudp(udpremote); err != nil; conn2, err = dialudp(udpremote) { - time.Sleep(time.Second * 2) + switch string(buf) { + case "yesyesi": + ismain = true + fmt.Println("UDP主节点认证成功") + lastcheck = time.Now().Unix() + go func() { + for { + time.Sleep(time.Second * 2) + if time.Now().Unix()-lastcheck > 4 { + ismain = false + trueconn = nil + fmt.Println("UDP下线02") + return + } + } + }() + case "vicregs": + if trueconn != nil { + trueconn.Write([]byte("vicregs")) + } + lastcheck = time.Now().Unix() + case "newconn": + if !ismain { + trueconn.Close() + break + } + for conn1, err = dialudp(udpforward); err != nil; conn1, err = dialudp(udpforward) { + time.Sleep(time.Second * 2) + } + fmt.Println("UDP已连接转发远端:" + conn1.RemoteAddr().String()) + for conn2, err = dialudp(udpremote); err != nil; conn2, err = dialudp(udpremote) { + time.Sleep(time.Second * 2) + } + conn2.Write([]byte("v%2^f&K")) + fmt.Println("UDP已连接主控远端:" + conn2.RemoteAddr().String()) + go UdpCopy(conn1, conn2) + go UdpCopy(conn2, conn1) } - conn2.Write([]byte("v%2^f&K")) - fmt.Println("已连接主控远端:" + conn2.RemoteAddr().String()) - go UdpCopy(conn1, conn2) - go UdpCopy(conn2, conn1) } + }() + for ismain || trueconn != nil { + time.Sleep(time.Second * 4) } + ismain = false } } @@ -252,6 +284,7 @@ func TcpNatClient(tcpremote, tcpforward *net.TCPAddr, pwd string) { var trueconn *net.TCPConn var err error ismain := false + var lastcheck int64 dialtcp := func(tcpaddr *net.TCPAddr) (*net.TCPConn, error) { trueconn, err := net.DialTCP("tcp", nil, tcpaddr) if err != nil { @@ -259,57 +292,103 @@ func TcpNatClient(tcpremote, tcpforward *net.TCPAddr, pwd string) { } return trueconn, nil } + defer func() { + if err := recover(); err != nil { + fmt.Println("PANIC:", err) + } + }() for { - for trueconn, err = dialtcp(tcpremote); err != nil; trueconn, err = dialtcp(tcpremote) { + trueconn, err = dialtcp(tcpremote) + if err != nil || trueconn == nil { fmt.Println(err) time.Sleep(5 * time.Second) + continue + } + fmt.Println("TCP远端服务器连接成功" + trueconn.RemoteAddr().String()) + n, err := trueconn.Write([]byte(pwd)) + if err != nil || n == 0 { + fmt.Println(err) + continue } - - fmt.Println("远端服务器连接成功" + trueconn.RemoteAddr().String()) - trueconn.Write([]byte(pwd)) go func() { for { - time.Sleep(time.Second * 5) + time.Sleep(time.Second * 2) if !ismain { - _, err := trueconn.Write([]byte(pwd)) - if err != nil { + if trueconn != nil { + _, err := trueconn.Write([]byte(pwd)) + if err != nil { + return + } + } else { return } + } else { + return } } }() - for { - var conn1, conn2 *net.TCPConn - buf := make([]byte, 7) - n, err := trueconn.Read(buf) - if n != 7 || err != nil { - fmt.Println(err) - trueconn.Close() - ismain = false - break - } - switch string(buf) { - case "yesyesi": - ismain = true - fmt.Println("主节点认证成功") - case "newconn": - if !ismain { - trueconn.Close() + go func() { + for { + if trueconn == nil { break } - for conn1, err = dialtcp(tcpforward); err != nil; conn1, err = dialtcp(tcpforward) { - time.Sleep(time.Second * 2) + var conn1, conn2 *net.TCPConn + buf := make([]byte, 7) + n, err := trueconn.Read(buf) + if n != 7 || err != nil { + fmt.Println("TCP下线01") + fmt.Println(err) + trueconn = nil + ismain = false + break } - fmt.Println("已连接转发远端:" + conn1.RemoteAddr().String()) - for conn2, err = dialtcp(tcpremote); err != nil; conn2, err = dialtcp(tcpremote) { - time.Sleep(time.Second * 2) + switch string(buf) { + case "yesyesi": + ismain = true + fmt.Println("TCP主节点认证成功") + lastcheck = time.Now().Unix() + go func() { + for { + time.Sleep(time.Second) + if time.Now().Unix()-lastcheck > 4 { + fmt.Println("TCP下线02") + ismain = false + trueconn = nil + return + } + } + }() + case "vicb612": + lastcheck = time.Now().Unix() + if trueconn != nil { + trueconn.Write([]byte("vicb612")) + } + case "newconn": + if !ismain { + trueconn.Close() + trueconn = nil + fmt.Println("TCP下线03") + break + } + for conn1, err = dialtcp(tcpforward); err != nil; conn1, err = dialtcp(tcpforward) { + time.Sleep(time.Second * 2) + } + fmt.Println("TCP已连接转发远端:" + conn1.RemoteAddr().String()) + for conn2, err = dialtcp(tcpremote); err != nil; conn2, err = dialtcp(tcpremote) { + time.Sleep(time.Second * 2) + } + conn2.Write([]byte("v%2^f&K")) + fmt.Println("TCP已连接主控远端:" + conn2.RemoteAddr().String()) + go TcpCopy(conn1, conn2) + go TcpCopy(conn2, conn1) } - conn2.Write([]byte("v%2^f&K")) - fmt.Println("已连接主控远端:" + conn2.RemoteAddr().String()) - go TcpCopy(conn1, conn2) - go TcpCopy(conn2, conn1) } + }() + for ismain || trueconn != nil { + time.Sleep(time.Second * 4) } + ismain = false + } } @@ -362,21 +441,33 @@ func UdpNatServer(udplocal *net.UDPAddr, pwd string) { fmt.Println(err) return } + udpconnlist := []string{} udpool := make(map[string]*udpnat) udpdial := make(map[string]*net.UDPAddr) fmt.Println("UDP已建立监听:" + udplistener.LocalAddr().String()) + removeudplist := func(str string) { + var tmp []string + for _, v := range udpconnlist { + if v != str { + tmp = append(tmp, str) + } + } + udpconnlist = tmp + } go func() { for { - time.Sleep(time.Second * 300) + time.Sleep(time.Second * 20) pool := []string{} for k, v := range udpool { - if time.Now().Unix()-v.LastTrans > 600 { + if time.Now().Unix()-v.LastTrans > 30 { pool = append(pool, k) } } for _, v := range pool { if udpool[v].Married { delete(udpdial, udpool[v].Conn.String()) + } else { + removeudplist(v) } delete(udpool, v) } @@ -390,17 +481,22 @@ func UdpNatServer(udplocal *net.UDPAddr, pwd string) { if errp != nil { return } - if string(buf[0:len(pwd)]) == pwd { + if string(buf[0:len(pwd)]) == pwd && n == len(pwd) { isconn = true trueconn = conn udplistener.WriteToUDP([]byte("yesyesi"), trueconn) - fmt.Println("穿透客户端已注册") + fmt.Println("UDP穿透客户端已注册") + udpool = make(map[string]*udpnat) + udpdial = make(map[string]*net.UDPAddr) + udpconnlist = []string{} lastcheck = time.Now().Unix() go func() { for { - time.Sleep(time.Second * 5) - if time.Now().Unix()-lastcheck > 4 { - fmt.Println("穿透客户端已下线") + time.Sleep(time.Second * 2) + go udplistener.WriteToUDP([]byte("vicregs"), trueconn) + if time.Now().Unix()-lastcheck > 6 { + fmt.Println("UDP穿透客户端已下线") + fmt.Println("UDP下线01") isconn = false break } @@ -414,15 +510,21 @@ func UdpNatServer(udplocal *net.UDPAddr, pwd string) { } if string(buf[0:7]) == "v%2^f&K" { fmt.Println("穿透客户端已建立新连接") - for k, v := range udpool { - if !v.Married { - v.Conn = conn - udplistener.WriteToUDP(v.Msg, conn) - v.Msg = []byte{} - udpaddr, _ := net.ResolveUDPAddr("udp", k) - udpdial[conn.String()] = udpaddr - v.Married = true - break + if len(udpconnlist) != 0 { + if v, ok := udpool[udpconnlist[0]]; ok { + if !v.Married { + v.Conn = conn + udplistener.WriteToUDP(v.Msg, conn) + v.Msg = []byte{} + udpaddr, _ := net.ResolveUDPAddr("udp", udpconnlist[0]) + udpdial[conn.String()] = udpaddr + v.Married = true + } + } + if len(udpconnlist) == 1 { + udpconnlist = []string{} + } else { + udpconnlist = udpconnlist[1:] } } return @@ -468,9 +570,11 @@ func UdpNatServer(udplocal *net.UDPAddr, pwd string) { Married: false, LastTrans: time.Now().Unix(), } + udpconnlist = append(udpconnlist, conn.String()) _, err := udplistener.WriteToUDP([]byte("newconn"), trueconn) if err != nil { - fmt.Println("穿透客户端已下线") + fmt.Println("UDP穿透客户端已下线") + fmt.Println("UDP下线02") isconn = false } } @@ -482,6 +586,7 @@ func UdpNatServer(udplocal *net.UDPAddr, pwd string) { func TcpNatServer(tcplocal *net.TCPAddr, pwd string) { var trueconn *net.TCPConn + lastcheck := int64(0) isconn := false tcplistener, err := net.ListenTCP("tcp", tcplocal) defer tcplistener.Close() @@ -509,32 +614,53 @@ func TcpNatServer(tcplocal *net.TCPAddr, pwd string) { } } } - time.Sleep(time.Millisecond * 600) + time.Sleep(time.Second * 2) } }() go func() { if !isconn { - buf := make([]byte, len(pwd)) + buf := make([]byte, len(pwd)+1) n, err := conn.Read(buf) - if n != len(pwd) { + if n != len(pwd) || err != nil { conn.Close() return } - if err != nil { - conn.Close() - return - } - if string(buf) == pwd { + if string(buf[0:len(pwd)]) == pwd { isconn = true trueconn = conn conn.Write([]byte("yesyesi")) - fmt.Println("穿透客户端已注册") + fmt.Println("TCP穿透客户端已注册") + lastcheck = time.Now().Unix() + go func() { + for isconn && trueconn != nil { + buf := make([]byte, 7) + n, err := trueconn.Read(buf) + if n != 7 || err != nil { + isconn = false + trueconn = nil + return + } + if string(buf) == "vicb612" { + lastcheck = time.Now().Unix() + } + } + }() go func() { for { time.Sleep(time.Second * 2) - _, err := trueconn.Write([]byte("vicb612")) - if err != nil { - trueconn.Close() + if trueconn != nil { + _, err := trueconn.Write([]byte("vicb612")) + if err != nil { + trueconn.Close() + trueconn = nil + isconn = false + fmt.Println("TCP下线01") + return + } + } + if time.Now().Unix()-lastcheck > 4 { + fmt.Println("TCP下线02") + trueconn = nil isconn = false return } @@ -548,14 +674,11 @@ func TcpNatServer(tcplocal *net.TCPAddr, pwd string) { if isconn { buf := make([]byte, 7) n, err := conn.Read(buf) - if n != 7 { - conn.Close() - return - } - if err != nil { + if n != 7 || err != nil { conn.Close() return } + if string(buf) == "v%2^f&K" { fmt.Println("穿透客户端已建立新连接") if len(waitconn) != 0 { @@ -574,10 +697,17 @@ func TcpNatServer(tcplocal *net.TCPAddr, pwd string) { fmt.Println("链接已加入等待列表") tcpnats := tcpnat{Msg: buf, Conn: conn, Date: time.Now().Unix()} waitconn = append(waitconn, tcpnats) + if trueconn == nil { + isconn = false + fmt.Println("TCP下线04") + return + } _, err := trueconn.Write([]byte("newconn")) if err != nil { fmt.Println("穿透客户端已下线") + fmt.Println("TCP下线03") trueconn.Close() + trueconn = nil isconn = false } } diff --git a/vtqe/tools/sftp.go b/vtqe/tools/sftp.go index 9cf00c9..b44bd1d 100644 --- a/vtqe/tools/sftp.go +++ b/vtqe/tools/sftp.go @@ -2,8 +2,15 @@ package tools import ( "fmt" + "io/ioutil" + "os" + "path/filepath" + "regexp" + "runtime" "strings" + "b612.me/starainrt" + "b612.me/sshd" "github.com/spf13/cobra" @@ -15,14 +22,17 @@ var sftpcmd = &cobra.Command{ Long: "sftp上传下载", Run: func(this *cobra.Command, args []string) { d, _ := this.Flags().GetBool("download") + s, _ := this.Flags().GetString("src") + r, _ := this.Flags().GetString("dst") i, _ := this.Flags().GetString("identify") k, _ := this.Flags().GetString("password") p, _ := this.Flags().GetInt("port") b, _ := this.Flags().GetInt("buffer") + g, _ := this.Flags().GetString("regexp") var user, host string var err error - if len(args) != 3 { - fmt.Println("sftp <[user@]Host> ") + if len(args) != 1 { + fmt.Println("sftp <[user@]Host> -s -d ") this.Help() return } @@ -35,20 +45,22 @@ var sftpcmd = &cobra.Command{ host = hosts[1] } fmt.Println("进行SSH连接……") - client, err := sshd.Connect(user, k, host, i, p, []string{}) + myssh := new(sshd.StarSSH) + err = myssh.Connect(user, k, host, i, p) if err != nil { fmt.Println(err) return } - defer client.Close() + defer myssh.Close() fmt.Println("已连接上……") - sftp, err := sshd.CreateSftp(client) + sftp, err := sshd.CreateSftp(myssh.Client) if err != nil { fmt.Println(err) return } defer sftp.Close() fmt.Println("已建立SFTP……") + shell := func(pect float64) { if pect != 100.0 { fmt.Printf("传输已完成:%f%%\r", pect) @@ -56,10 +68,91 @@ var sftpcmd = &cobra.Command{ fmt.Printf("传输已完成:%f%%\n", pect) } } + var UploadDir func(string, string) + UploadDir = func(fs, remote string) { + if runtime.GOOS == "windows" { + fs = strings.Replace(fs, "/", "\\", -1) + } + sftp.MkdirAll(remote) + abspath, _ := filepath.Abs(fs) + dir, err := ioutil.ReadDir(fs) + if err != nil { + fmt.Println(err) + return + } + for _, v := range dir { + if v.IsDir() { + if g != "" { + continue + } + UploadDir(abspath+string(os.PathSeparator)+v.Name(), remote+"/"+v.Name()) + } else { + if ok, _ := regexp.MatchString(g, v.Name()); !ok { + continue + } + fmt.Println("上传:" + abspath + string(os.PathSeparator) + v.Name()) + err = sshd.FtpTransferOutFunc(abspath+string(os.PathSeparator)+v.Name(), remote+"/"+v.Name(), b, shell, sftp) + if err != nil { + fmt.Println(err) + continue + } + } + } + } + + var DownloadDir func(string, string) + DownloadDir = func(fs, remote string) { + abspath, _ := filepath.Abs(remote) + os.MkdirAll(abspath, 0755) + dir, err := sftp.ReadDir(fs) + if err != nil { + fmt.Println("读取错误", err) + return + } + for _, v := range dir { + if v.IsDir() { + if g != "" { + continue + } + DownloadDir(fs+"/"+v.Name(), abspath+string(os.PathSeparator)+v.Name()) + } else { + if ok, _ := regexp.MatchString(g, v.Name()); !ok { + continue + } + fmt.Println("下载:" + fs + "/" + v.Name()) + err = sshd.FtpTransferInFunc(fs+"/"+v.Name(), abspath+string(os.PathSeparator)+v.Name(), b, shell, sftp) + if err != nil { + fmt.Println(err) + continue + } + } + } + } if !d { - err = sshd.FtpTransferOutFunc(args[1], args[2], b, shell, sftp) + if !starainrt.Exists(s) { + fmt.Println("本地文件或文件夹:" + s + "不存在") + return + } + if starainrt.IsFile(s) { + err = sshd.FtpTransferOutFunc(s, r, b, shell, sftp) + } else { + UploadDir(s, r) + } } else { - err = sshd.FtpTransferInFunc(args[1], args[2], b, shell, sftp) + if !myssh.Exists(s) { + fmt.Println("远端文件或文件夹:" + s + "不存在") + return + } + stat, err := sftp.Stat(s) + if err != nil { + fmt.Println("错误:", err) + return + } + if !stat.IsDir() { + err = sshd.FtpTransferInFunc(s, r, b, shell, sftp) + } else { + DownloadDir(s, r) + } } if err != nil { fmt.Println(err) @@ -69,9 +162,12 @@ var sftpcmd = &cobra.Command{ func init() { Maincmd.AddCommand(sftpcmd) - sftpcmd.Flags().BoolP("download", "d", false, "进行下载") + sftpcmd.Flags().BoolP("download", "D", false, "进行下载") sftpcmd.Flags().StringP("identify", "i", "", "RSA登录密钥") sftpcmd.Flags().StringP("password", "k", "", "登录密码") + sftpcmd.Flags().StringP("src", "s", "", "本机路径/若为下载则相反") + sftpcmd.Flags().StringP("dst", "d", "", "远程路径/若为下载则相反") sftpcmd.Flags().IntP("port", "p", 22, "登录端口") + sftpcmd.Flags().StringP("regexp", "r", "", "正则表达式") sftpcmd.Flags().IntP("buffer", "b", 10240, "buffer大小") }