Compare commits

..

12 Commits

Author SHA1 Message Date
f8bcc2c171 version 0.1.25 2020-08-13 13:45:27 +08:00
4b69d2b8bf 支持断点续传 2020-03-07 13:12:45 +08:00
874012fe56 bug fix 2019-09-13 14:54:07 +08:00
7c2dab6aa6 Add TCP/UDP Forward/Nat 2019-09-12 17:29:49 +08:00
6c66e84a86 修正curl上传标识不清 2019-09-07 13:37:22 +08:00
eec673f640 修复windows向Linux传输发生文件夹错误 2019-09-06 10:26:03 +08:00
196a469c34 tcp传输不再丢包 2019-09-05 22:21:39 +08:00
7d30c2ddc9 修复tcp传输分界问题 2019-09-05 20:25:12 +08:00
dc32f808cf add tcp/udp mode 2019-09-05 17:23:50 +08:00
e27f6d4006 fix path error at http 2019-09-04 17:17:41 +08:00
cb997cc49c fix path error at http2 2019-09-04 16:37:03 +08:00
d3e6058862 fix path error at http 2019-09-04 16:26:39 +08:00
19 changed files with 2034 additions and 82 deletions

View File

@ -24,14 +24,14 @@ var attachcmd = &cobra.Command{
out, _ = this.Flags().GetString("out") out, _ = this.Flags().GetString("out")
} }
if src == "" || dst == "" { if src == "" || dst == "" {
starlog.Println("ERROR PATH", "red", "b") starlog.Criticalln("ERROR PATH")
this.Help() this.Help()
return return
} }
cryp := new(starainrt.StarCrypto) cryp := new(starainrt.StarCrypto)
err := cryp.Attach(src, dst, out) err := cryp.Attach(src, dst, out)
if err != nil { if err != nil {
starlog.Println(err.Error, "red", "b") starlog.Criticalln(err.Error)
} else { } else {
fmt.Println("完成") fmt.Println("完成")
} }

View File

@ -17,7 +17,7 @@ var b64cmd = &cobra.Command{
ok, _ := this.Flags().GetBool("file") ok, _ := this.Flags().GetBool("file")
de, _ := this.Flags().GetBool("decode") de, _ := this.Flags().GetBool("decode")
if len(args) != 1 { if len(args) != 1 {
starlog.Println("参数不足,请输入文件地址或字符串", "red", "b") starlog.Criticalln("参数不足,请输入文件地址或字符串")
this.Help() this.Help()
return return
} }
@ -47,7 +47,7 @@ var b64cmd = &cobra.Command{
} }
} }
if err != nil { if err != nil {
starlog.Println(err, "red", "b") starlog.Criticalln(err)
return return
} }
}, },

47
vtqe/tools/cd.go Normal file
View File

@ -0,0 +1,47 @@
// +build windows
package tools
import (
"bufio"
"fmt"
"os"
"os/exec"
"path/filepath"
"b612.me/starainrt"
"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 {
fmt.Println(args)
if len(args) != 0 {
os.Exit(1)
} else {
exec.Command("cmd.exe", "/c", "explorer "+filepath.Dir(args[0])).Run()
return
}
}
s := bufio.NewScanner(os.Stdin)
for s.Scan() {
dir := s.Text()
if starainrt.IsFile(dir) {
exec.Command("cmd.exe", "/c", "explorer /n,/select,"+dir).Run()
} else {
exec.Command("cmd.exe", "/c", "explorer "+dir).Run()
}
return
}
},
}
func init() {
Maincmd.AddCommand(cdcmd)
}

View File

@ -4,7 +4,7 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
var Version string = "0.1.12" var Version string = "0.1.25"
var Maincmd = &cobra.Command{ var Maincmd = &cobra.Command{
Use: "", Use: "",
@ -14,5 +14,6 @@ var Maincmd = &cobra.Command{
func init() { func init() {
cobra.MousetrapHelpText = "" cobra.MousetrapHelpText = ""
Maincmd.Flags().BoolP("version", "v", false, "查看版本号")
Maincmd.Version = Version Maincmd.Version = Version
} }

View File

@ -73,7 +73,7 @@ var curlcmd = &cobra.Command{
if h != "" { if h != "" {
head := strings.Split(h, ",") head := strings.Split(h, ",")
for _, v := range head { for _, v := range head {
hp := strings.Split(v, "=") hp := strings.Split(v, ":")
if len(hp) != 2 { if len(hp) != 2 {
continue continue
} }
@ -180,6 +180,7 @@ func init() {
curlcmd.Flags().IntP("max-time", "m", 0, "最大传输超时时间") curlcmd.Flags().IntP("max-time", "m", 0, "最大传输超时时间")
curlcmd.Flags().Int("connect-timeout", 15, "最大连接建立超时时间") curlcmd.Flags().Int("connect-timeout", 15, "最大连接建立超时时间")
curlcmd.Flags().StringP("user-agent", "A", "", "UA设置") curlcmd.Flags().StringP("user-agent", "A", "", "UA设置")
curlupcmd.Flags().StringP("address", "a", "", "远端ip:端口号")
curlcmd.AddCommand(curlupcmd) curlcmd.AddCommand(curlupcmd)
} }
@ -188,10 +189,11 @@ var curlupcmd = &cobra.Command{
Short: "victorique上传工具", Short: "victorique上传工具",
Long: "victorique上传工具", Long: "victorique上传工具",
Run: func(this *cobra.Command, args []string) { Run: func(this *cobra.Command, args []string) {
if len(args) != 2 { if len(args) != 1 {
fmt.Println(args, "不合法啊") fmt.Println(args, "不合法啊")
return return
} }
a, _ := this.Flags().GetString("address")
curl := starainrt.NewStarCurl() curl := starainrt.NewStarCurl()
curl.TimeOut = 0 curl.TimeOut = 0
shell := func(pect float64) { shell := func(pect float64) {
@ -201,7 +203,7 @@ var curlupcmd = &cobra.Command{
fmt.Printf("已完成:%f%%\r", pect) fmt.Printf("已完成:%f%%\r", pect)
} }
} }
data, err := curl.CurlWithFile("http://"+args[0]+"/vtqeupload1127", nil, "victorique", args[1], "", false, shell) data, err := curl.CurlWithFile("http://"+a+"/vtqeupload1127", nil, "victorique", args[0], "", false, shell)
fmt.Println(string(data)) fmt.Println(string(data))
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)

View File

@ -25,14 +25,14 @@ var detachcmd = &cobra.Command{
} }
num, _ := this.Flags().GetInt("num") num, _ := this.Flags().GetInt("num")
if src == "" || dst == "" { if src == "" || dst == "" {
starlog.Println("ERROR PATH", "red", "b") starlog.Criticalln("ERROR PATH")
this.Help() this.Help()
return return
} }
cryp := new(starainrt.StarCrypto) cryp := new(starainrt.StarCrypto)
err := cryp.Detach(src, num, dst, out) err := cryp.Detach(src, num, dst, out)
if err != nil { if err != nil {
starlog.Println(err.Error, "red", "b") starlog.Criticalln(err.Error)
} else { } else {
fmt.Println("完成") fmt.Println("完成")
} }

View File

@ -2,6 +2,8 @@ package tools
import ( import (
"fmt" "fmt"
"os"
"time"
"b612.me/starainrt" "b612.me/starainrt"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -14,26 +16,38 @@ var gencmd = &cobra.Command{
Run: func(this *cobra.Command, args []string) { Run: func(this *cobra.Command, args []string) {
sum, _ := this.Flags().GetInt("sum") sum, _ := this.Flags().GetInt("sum")
num, _ := this.Flags().GetInt("num") num, _ := this.Flags().GetInt("num")
cap, _ := this.Flags().GetInt("cap")
if len(args) != 1 { if len(args) != 1 {
this.Help() this.Help()
return return
} }
err := starainrt.FillWithRandom(args[0], num, 1024*1024, sum, func(pect float64) { if num <= 0 {
if pect == 100 { fmt.Println("num不合法不应该小于1")
fmt.Println("文件已处理100.000000%") os.Exit(2)
} else { }
fmt.Printf("文件已处理:%f%%\r", pect) if sum <= 0 {
} fmt.Println("sum不合法不应该小于1")
os.Exit(2)
}
if cap <= 0 {
fmt.Println("cap不合法不应该小于1")
os.Exit(2)
}
err := starainrt.FillWithRandom(args[0], num, cap, sum, func(pect float64) {
fmt.Printf("文件已处理:%f%%\r", pect)
}) })
if err != nil { if err != nil {
fmt.Println("err:" + err.Error()) fmt.Println("err:" + err.Error())
} }
fmt.Println("文件已处理100.0000000%")
time.Sleep(time.Millisecond * 10)
}, },
} }
func init() { func init() {
gencmd.Flags().IntP("sum", "s", 3, "随机的种子组数") gencmd.Flags().IntP("sum", "s", 3, "随机的种子组数")
gencmd.Flags().IntP("num", "n", 1024, "生成的文件大小") gencmd.Flags().IntP("num", "n", 1024, "生成的文件大小")
gencmd.Flags().IntP("cap", "c", 1048576, "bufcap大小")
gencmd.MarkFlagRequired("num") gencmd.MarkFlagRequired("num")
Maincmd.AddCommand(gencmd) Maincmd.AddCommand(gencmd)
} }

View File

@ -49,7 +49,7 @@ var hashcmd = &cobra.Command{
result, err = crypto.SumAll([]byte(args[0]), method) result, err = crypto.SumAll([]byte(args[0]), method)
} }
if err != nil { if err != nil {
starlog.Println("错误:"+err.Error(), "red", "") starlog.Criticalln("错误:" + err.Error())
} }
for _, v := range method { for _, v := range method {
fmt.Printf("%s%s\n", v, result[v]) fmt.Printf("%s%s\n", v, result[v])

View File

@ -1,6 +1,7 @@
package tools package tools
import ( import (
"encoding/base64"
"fmt" "fmt"
"io" "io"
"io/ioutil" "io/ioutil"
@ -19,27 +20,48 @@ import (
var port, ip, path string var port, ip, path string
var up bool var up bool
var basicAuth, certKey string
type TraceHandler struct { type TraceHandler struct {
h http.Handler h http.Handler
} }
func init() {
httpcmd.Flags().StringVarP(&port, "port", "p", "80", "监听端口")
httpcmd.Flags().StringVarP(&ip, "ip", "i", "0.0.0.0", "监听ip")
httpcmd.Flags().StringVarP(&path, "folder", "f", "./", "本地文件地址")
httpcmd.Flags().BoolVarP(&up, "upload", "u", false, "是否开启文件上传")
httpcmd.Flags().StringVarP(&basicAuth, "auth", "a", "", "HTTP BASIC AUTH认证(用户名:密码)")
httpcmd.Flags().StringVarP(&certKey, "cert", "c", "", "TLS证书路径用:分割证书与密钥")
Maincmd.AddCommand(httpcmd)
}
// httpCmd represents the http command // httpCmd represents the http command
var httpcmd = &cobra.Command{ var httpcmd = &cobra.Command{
Use: "http", Use: "http",
Short: "HTTP文件服务器", Short: "HTTP文件服务器",
Long: `HTTP文件服务器`, Long: `HTTP文件服务器`,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
var err error
http.HandleFunc("/", httplisten) http.HandleFunc("/", httplisten)
path, _ = filepath.Abs(path) path, _ = filepath.Abs(path)
fmt.Println("Listening On Port:" + port) starlog.Infoln("Listening On Port:" + port)
if up { if up {
fmt.Println("upload is openned,path is /vtqeupload1127") starlog.Infoln("upload is openned,path is /vtqeupload1127")
http.HandleFunc("/vtqeupload1127", uploadfile) http.HandleFunc("/vtqeupload1127", uploadfile)
} }
err := http.ListenAndServe(ip+":"+port, nil) if certKey == "" {
err = http.ListenAndServe(ip+":"+port, nil)
} else {
certs := strings.Split(certKey, ":")
if len(certs) != 2 {
starlog.Criticalln("证书不正确!")
return
}
err = http.ListenAndServeTLS(ip+":"+port, certs[0], certs[1], nil)
}
if err != nil { if err != nil {
starlog.Println("Error:"+err.Error(), "red", "") starlog.Criticalln("Error:" + err.Error())
} }
}, },
} }
@ -52,18 +74,18 @@ func uploadfile(w http.ResponseWriter, r *http.Request) {
r.ParseMultipartForm(10485760) r.ParseMultipartForm(10485760)
file, handler, err := r.FormFile("victorique") file, handler, err := r.FormFile("victorique")
if err != nil { if err != nil {
fmt.Println(err) starlog.Errorln(err)
w.WriteHeader(502) w.WriteHeader(502)
w.Write([]byte(err.Error())) w.Write([]byte(err.Error()))
return return
} }
defer file.Close() defer file.Close()
fmt.Printf("Upload %s From %s\n", handler.Filename, r.RemoteAddr) starlog.Noticef("Upload %s From %s\n", handler.Filename, r.RemoteAddr)
fmt.Fprintf(w, `<html><body><p>%v</p><h2><a href="./vtqeupload1127/web">Return To Web Page</a></h2></body></html>`, handler.Header) fmt.Fprintf(w, `<html><body><p>%v</p><h2><a href="./vtqeupload1127/web">Return To Web Page</a></h2></body></html>`, handler.Header)
os.Mkdir("./vtqeupload1127", 0755) os.Mkdir("./vtqeupload1127", 0755)
f, err := os.OpenFile("./vtqeupload1127/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0755) f, err := os.OpenFile("./vtqeupload1127/"+handler.Filename, os.O_WRONLY|os.O_CREATE, 0755)
if err != nil { if err != nil {
fmt.Println(err) starlog.Errorln(err)
return return
} }
defer f.Close() defer f.Close()
@ -71,10 +93,40 @@ func uploadfile(w http.ResponseWriter, r *http.Request) {
} }
func httplisten(w http.ResponseWriter, r *http.Request) { func httplisten(w http.ResponseWriter, r *http.Request) {
log := starlog.Std.NewFlag()
w.Header().Set("Server", "Vicorique") w.Header().Set("Server", "Vicorique")
w.Header().Set("Powered", "B612.ME")
write401 := func() {
w.Header().Set("WWW-Authenticate", ` Basic realm="Please Enter Passwd"`)
w.WriteHeader(401)
w.Write([]byte(`
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>B612 HTTP SERVER</center>
</body>
</html>`))
}
if basicAuth != "" {
authHeader := strings.TrimSpace(r.Header.Get("Authorization"))
if len(authHeader) == 0 {
log.Noticeln("No Authed! Get Path is", r.URL.Path, r.RemoteAddr)
write401()
return
} else {
userAuth := base64.StdEncoding.EncodeToString([]byte(basicAuth))
authStr := strings.Split(authHeader, " ")
if strings.TrimSpace(authStr[1]) != userAuth {
log.Noticeln("Auth Failed! Get Path is", r.URL.Path, r.RemoteAddr, "pwd enter is", authHeader)
write401()
return
}
}
}
p := r.URL.Path p := r.URL.Path
cmd := r.URL.Query()["cmd"] cmd := r.URL.Query()["cmd"]
fmt.Println("Get " + p + " " + r.RemoteAddr) log.Noticeln("Get " + p + " " + r.RemoteAddr)
fullpath, _ := filepath.Abs(path + p) fullpath, _ := filepath.Abs(path + p)
if p == "/" { if p == "/" {
@ -84,7 +136,7 @@ func httplisten(w http.ResponseWriter, r *http.Request) {
if up { if up {
if p == "/vtqeupload1127/web" { if p == "/vtqeupload1127/web" {
w.Write([]byte(`<html><body><form id= "uploadForm" action= "../vtqeupload1127" method= "post" enctype ="multipart/form-data"> w.Write([]byte(`<html><body><form id= "uploadForm" action= "../vtqeupload1127" method= "post" enctype ="multipart/form-data">
<h1 >Victorique's File Upload Page </h1> <h1 >B612 File Upload Page </h1>
<p >上传文件 <input type ="file" name="victorique" /></p> <p >上传文件 <input type ="file" name="victorique" /></p>
<input type ="submit" value="上传"/> <input type ="submit" value="上传"/>
</form> </form>
@ -112,9 +164,9 @@ func httplisten(w http.ResponseWriter, r *http.Request) {
} }
fpdst, err := os.Open(fullpath) fpdst, err := os.Open(fullpath)
if err != nil { if err != nil {
fmt.Println(err) log.Errorln(err)
w.WriteHeader(502) w.WriteHeader(403)
w.Write([]byte("<h1>502 ERROR</h1>")) w.Write([]byte("<h1>403 NO ACCESS</h1>"))
return return
} }
fpinfo, _ := os.Stat(fullpath) fpinfo, _ := os.Stat(fullpath)
@ -137,56 +189,143 @@ func httplisten(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/download") w.Header().Set("Content-Type", "application/download")
w.Header().Set("Content-Disposition", "attachment;filename="+name) w.Header().Set("Content-Disposition", "attachment;filename="+name)
} }
etag := new(starainrt.StarCrypto).MD5([]byte(fpinfo.ModTime().String()))
w.Header().Set("Content-Transfer-Encoding", "binary") w.Header().Set("Content-Transfer-Encoding", "binary")
w.Header().Set("Accept-Ranges", "bytes") w.Header().Set("Accept-Ranges", "bytes")
w.Header().Set("Content-Length", strconv.Itoa(int(fpinfo.Size()))) w.Header().Set("ETag", etag)
w.WriteHeader(200) w.Header().Set("Last-Modified", strings.ReplaceAll(fpinfo.ModTime().UTC().Format("Mon, 2 Jan 2006 15:04:05 MST"), "UTC", "GMT"))
defer fpdst.Close() isRange := false
for { var rangeStart, rangeEnd int64
buf := make([]byte, 1048576) rangeEnd = -1
n, err := fpdst.Read(buf) for k, v := range r.Header {
if err != nil { if strings.ToLower(k) == "range" {
if err == io.EOF { if strings.Index(v[0], "bytes=") < 0 {
break break
} }
return v[0] = strings.Replace(v[0], "bytes=", "", -1)
data := strings.Split(v[0], "-")
if len(data) == 0 {
break
}
rangeStart, _ = strconv.ParseInt(data[0], 10, 64)
if len(data) == 2 {
rangeEnd, _ = strconv.ParseInt(data[1], 10, 64)
}
//w.WriteHeader(206) //206 支持断点续传
isRange = true
break
} }
w.Write(buf[0:n])
} }
defer fpdst.Close()
var transferData int
if !isRange {
w.Header().Set("Content-Length", strconv.FormatInt(fpinfo.Size(), 10))
w.WriteHeader(200)
for {
buf := make([]byte, 1048576)
n, err := fpdst.Read(buf)
if n != 0 {
ns, err := w.Write(buf[0:n])
transferData += ns
if err != nil {
starlog.Errorln("Transfer Error:", err)
}
}
if err != nil {
if err == io.EOF {
break
}
break
}
}
} else {
w.Header().Set("Content-Length", strconv.FormatInt(fpinfo.Size(), 10))
if rangeEnd == -1 {
w.Header().Set("Content-Range", `bytes `+strconv.FormatInt(rangeStart, 10)+"-"+strconv.FormatInt(fpinfo.Size(), 10)+"/"+strconv.FormatInt(fpinfo.Size(), 10))
//w.Header().Set("Content-Length", strconv.FormatInt(fpinfo.Size()-rangeStart, 10))
} else {
w.Header().Set("Content-Range", `bytes `+strconv.FormatInt(rangeStart, 10)+"-"+strconv.FormatInt(rangeEnd, 10)+"/"+strconv.FormatInt(fpinfo.Size(), 10))
//w.Header().Set("Content-Length", strconv.FormatInt(1+rangeEnd-rangeStart, 10))
}
w.WriteHeader(206)
fpdst.Seek(int64(rangeStart), 0)
count := rangeStart
for {
buf := make([]byte, 1048576)
n, err := fpdst.Read(buf)
if err != nil {
if err == io.EOF {
break
}
return
}
if rangeEnd == -1 {
ns, err := w.Write(buf[0:n])
transferData += ns
if err != nil {
starlog.Errorln("Transfer Error:", err)
}
} else {
if count > rangeEnd {
break
}
if count+int64(n) > rangeEnd {
w.Write(buf[0 : rangeEnd-count+1])
break
} else {
ns, err := w.Write(buf[0:n])
transferData += ns
if err != nil {
starlog.Errorln("Transfer Error:", err)
}
count += int64(n)
}
}
}
}
var tani string
tani = fmt.Sprintf("%v Byte", transferData)
if f64 := float64(transferData) / 1024; f64 > 1 {
tani = fmt.Sprintf("%v KB", f64)
if f64 = float64(f64) / 1024; f64 > 1 {
tani = fmt.Sprintf("%v MB", f64)
if f64 = float64(f64) / 1024; f64 > 1 {
tani = fmt.Sprintf("%v GB", f64)
}
}
}
log.Infoln(fpinfo.Name(), "客户端下载已结束,共传输大小:"+tani)
} }
func ReadFolder(w http.ResponseWriter, r *http.Request, fullpath string, isroot bool) { func ReadFolder(w http.ResponseWriter, r *http.Request, fullpath string, isroot bool) {
dir, err := ioutil.ReadDir(fullpath) dir, err := ioutil.ReadDir(fullpath)
if err != nil { if err != nil {
fmt.Println(err) starlog.Errorln(err)
w.WriteHeader(403) w.WriteHeader(403)
w.Write([]byte("<h1>Cannot Access!</h1>")) w.Write([]byte("<h1>May Cannot Access!</h1>"))
return
} }
w.Write([]byte("<html>\n<style>\np{margin: 2px auto}\n</style>\n<h1>Victorique Http Server - " + Version + "</h1>")) w.Write([]byte("<html>\n<style>\np{margin: 2px auto}\n</style>\n<h1>B612 Http Server - " + Version + "</h1>"))
if up { if up {
w.Write([]byte("<a href=/vtqeupload1127/web>Upload Web Page Is Openned!</a><br /><br />")) w.Write([]byte("<a href=/vtqeupload1127/web>Upload Web Page Is Openned!</a><br /><br />"))
} }
w.Write([]byte("<hr /><pre>\n")) w.Write([]byte("<hr /><pre>\n"))
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 { if !isroot {
w.Write([]byte(fmt.Sprintf("<p><a href='%s'>%s</a> %s</p>\n", "..", "..", "上层文件夹"))) w.Write([]byte(fmt.Sprintf("<p><a href='%s'>%s</a> %s</p>\n", r.URL.Path+"/..", "..", "上层文件夹")))
} }
for _, v := range dir { for _, v := range dir {
if v.Name() != "." || v.Name() != ".." { if v.Name() != "." || v.Name() != ".." {
if !v.IsDir() { if !v.IsDir() {
w.Write([]byte(fmt.Sprintf("<p><a href='%s'>%s</a> %d %s</p>\n", r.URL.Path+"/"+v.Name(), v.Name(), int(v.Size()), v.ModTime().Format("2006-01-02 15:04:05")))) w.Write([]byte(fmt.Sprintf("<p><a href='%s'>%s</a> %d %s</p>\n", r.URL.Path+"/"+v.Name(), v.Name(), int(v.Size()), v.ModTime().Format("2006-01-02 15:04:05"))))
} else { } else {
w.Write([]byte(fmt.Sprintf("<p><a href='%s'>%s</a> %s %s</p>\n", v.Name(), v.Name(), "文件夹", v.ModTime().Format("2006-01-02 15:04:05")))) w.Write([]byte(fmt.Sprintf("<p><a href='%s'>%s</a> %s %s</p>\n", r.URL.Path+"/"+v.Name(), v.Name(), "文件夹", v.ModTime().Format("2006-01-02 15:04:05"))))
} }
} }
} }
w.Write([]byte("</pre>\n</html>")) w.Write([]byte("</pre>\n</html>"))
return return
} }
func init() {
httpcmd.Flags().StringVarP(&port, "port", "p", "80", "监听端口")
httpcmd.Flags().StringVarP(&ip, "ip", "i", "0.0.0.0", "监听ip")
httpcmd.Flags().StringVarP(&path, "folder", "f", "./", "本地文件地址")
httpcmd.Flags().BoolVarP(&up, "upload", "u", false, "是否开启文件上传")
Maincmd.AddCommand(httpcmd)
}

194
vtqe/tools/image-basic.go Normal file
View File

@ -0,0 +1,194 @@
package tools
import (
"errors"
"image"
"io/ioutil"
"os"
"github.com/golang/freetype"
"github.com/nfnt/resize"
"image/color"
"image/draw"
_ "image/gif"
_ "image/jpeg"
"image/png"
_ "image/png"
"b612.me/starainrt"
)
func OpenImage(name string) (image.Image, error) {
if !starainrt.Exists(name) {
return nil, errors.New("File Not Exists")
}
fso, err := os.Open(name)
if err != nil {
return nil, err
}
img, _, err := image.Decode(fso)
if err != nil {
return nil, err
}
return img, nil
}
func MergePhoto(big, small image.Image, bigsize, smallsize uint, x, y int) image.Image {
big = resize.Resize(bigsize, bigsize, big, resize.Lanczos3)
small = resize.Resize(smallsize, smallsize, small, resize.Lanczos3)
offset := image.Pt(x, y)
b := big.Bounds()
nimg := image.NewRGBA(b)
draw.Draw(nimg, b, big, image.ZP, draw.Src)
draw.Draw(nimg, small.Bounds(), small, offset, draw.Over)
return nimg
}
func SavePhoto(path string, img image.Image) error {
imgf, err := os.Create(path)
if err != nil {
return err
}
defer imgf.Close()
return png.Encode(imgf, img)
}
func SetAlpha(img image.Image, alpha uint8) image.Image {
size := img.Bounds()
nimg := image.NewRGBA(size)
for x := 0; x < size.Dx(); x++ {
for y := 0; y < size.Dy(); y++ {
r, g, b, a := img.At(x, y).RGBA()
r = r >> 8
g = g >> 8
b = b >> 8
a = a >> 8
nimg.Set(x, y, color.NRGBA{uint8(r), uint8(g), uint8(b), alpha})
//nimg.Set(x, y, color.Alpha{alpha})
//nimg.Set(x, y, img.At(x, y))
}
}
return nimg
}
func AddText(text string, img image.Image, x, y int, dpi, size float64, colors color.RGBA, ttf string) (image.Image, error) {
if !starainrt.Exists(ttf) {
return nil, errors.New("File Not Exists")
}
fontbyte, err := ioutil.ReadFile(ttf)
if err != nil {
return nil, err
}
font, err := freetype.ParseFont(fontbyte)
if err != nil {
return nil, err
}
nimg, ok := img.(draw.Image)
if !ok {
size := img.Bounds()
nimg = image.NewRGBA(img.Bounds())
for x := 0; x < size.Dx(); x++ {
for y := 0; y < size.Dy(); y++ {
r, g, b, a := img.At(x, y).RGBA()
nimg.Set(x, y, color.NRGBA{uint8(r), uint8(g), uint8(b), uint8(a)})
}
}
}
f := freetype.NewContext()
f.SetDPI(dpi)
f.SetFontSize(size)
f.SetFont(font)
f.SetClip(nimg.Bounds())
f.SetDst(nimg)
f.SetSrc(image.NewUniform(colors))
_, err = f.DrawString(text, freetype.Pt(x, y))
if err != nil {
return nil, err
}
return nimg, nil
}
type TextImg struct {
Text string
X int
Y int
Dpi float64
Size float64
Color color.NRGBA
}
type TextList struct {
List []TextImg
TTF []byte
}
func AddListTests(list TextList, img image.Image) (image.Image, error) {
font, err := freetype.ParseFont(list.TTF)
if err != nil {
return nil, err
}
nimg, ok := img.(draw.Image)
if !ok {
size := img.Bounds()
nimg = image.NewRGBA(img.Bounds())
for x := 0; x < size.Dx(); x++ {
for y := 0; y < size.Dy(); y++ {
r, g, b, a := img.At(x, y).RGBA()
nimg.Set(x, y, color.NRGBA{uint8(r), uint8(g), uint8(b), uint8(a)})
}
}
}
for _, v := range list.List {
f := freetype.NewContext()
f.SetDPI(v.Dpi)
f.SetFontSize(v.Size)
f.SetFont(font)
f.SetClip(nimg.Bounds())
f.SetDst(nimg)
f.SetSrc(image.NewUniform(v.Color))
_, err = f.DrawString(v.Text, freetype.Pt(v.X, v.Y))
if err != nil {
return nil, err
}
}
return nimg, nil
}
func AddTexts(text string, img image.Image, x, y int, dpi, size float64, colors color.NRGBA, ttf string) (image.Image, error) {
if !starainrt.Exists(ttf) {
return nil, errors.New("File Not Exists")
}
fontbyte, err := ioutil.ReadFile(ttf)
if err != nil {
return nil, err
}
font, err := freetype.ParseFont(fontbyte)
if err != nil {
return nil, err
}
nimg, ok := img.(draw.Image)
if !ok {
size := img.Bounds()
nimg = image.NewRGBA(img.Bounds())
for x := 0; x < size.Dx(); x++ {
for y := 0; y < size.Dy(); y++ {
r, g, b, a := img.At(x, y).RGBA()
nimg.Set(x, y, color.NRGBA{uint8(r), uint8(g), uint8(b), uint8(a)})
}
}
}
f := freetype.NewContext()
f.SetDPI(dpi)
f.SetFontSize(size)
f.SetFont(font)
f.SetClip(nimg.Bounds())
f.SetDst(nimg)
f.SetSrc(image.NewUniform(colors))
_, err = f.DrawString(text, freetype.Pt(x, y))
if err != nil {
return nil, err
}
return nimg, nil
}

83
vtqe/tools/image.go Normal file
View File

@ -0,0 +1,83 @@
package tools
import (
"fmt"
"image"
"b612.me/starlog"
"github.com/spf13/cobra"
)
func init() {
imageCmd.AddCommand(imgMirrorCmd)
Maincmd.AddCommand(imageCmd)
}
var imageCmd = &cobra.Command{
Use: "image",
Short: "图像处理",
Long: "简单的图像处理工具",
Run: func(this *cobra.Command, args []string) {
this.Help()
},
}
var imgMirrorCmd = &cobra.Command{
Use: "mirror",
Short: "图像镜像翻转",
Long: "图像镜像翻转<水平>",
Run: func(this *cobra.Command, args []string) {
if len(args) == 0 {
starlog.Errorln("请指定需要转换的图像!")
return
}
for _, v := range args {
img, err := OpenImage(v)
if err != nil {
starlog.Errorln(err, v)
continue
}
size := img.Bounds()
nimg := image.NewRGBA(size)
for x := 0; x < size.Dx(); x++ {
for y := 0; y < size.Dy(); y++ {
nimg.Set(size.Dx()-x, y, img.At(x, y))
}
}
if err := SavePhoto(v, nimg); err != nil {
starlog.Errorln(err, v)
continue
} else {
fmt.Println(v, "转换已完成!")
}
}
fmt.Println("任务完成!")
},
}
var imgAlpha = &cobra.Command{
Use: "alpha",
Short: "设置透明度",
Long: "设置alpha通道透明度",
Run: func(this *cobra.Command, args []string) {
if len(args) == 0 {
starlog.Errorln("请指定需要转换的图像!")
return
}
for _, v := range args {
img, err := OpenImage(v)
if err != nil {
starlog.Errorln(err, v)
continue
}
img = SetAlpha(img, 4)
if err := SavePhoto(v, img); err != nil {
starlog.Errorln(err, v)
continue
} else {
fmt.Println(v, "转换已完成!")
}
}
fmt.Println("任务完成!")
},
}

View File

@ -35,7 +35,7 @@ var mergecmd = &cobra.Command{
} }
}) })
if err != nil { if err != nil {
starlog.Println(err.Error, "red", "") starlog.Errorln(err.Error)
} }
}, },

807
vtqe/tools/net.go Normal file
View File

@ -0,0 +1,807 @@
package tools
import (
"fmt"
"io"
"net"
"strconv"
"strings"
"time"
"github.com/spf13/cobra"
)
func init() {
Maincmd.AddCommand(netcmd)
netcmd.AddCommand(netforwardcmd, natscmd, natccmd)
netforwardcmd.Flags().BoolP("tcp", "t", false, "TCP转发")
netforwardcmd.Flags().BoolP("udp", "u", false, "UDP转发")
netforwardcmd.Flags().IntP("port", "p", 1127, "转发本地端口")
netforwardcmd.Flags().StringP("address", "a", "0.0.0.0", "监听地址")
natscmd.Flags().BoolP("tcp", "t", false, "TCP穿透")
natscmd.Flags().BoolP("udp", "u", false, "UDP穿透")
natscmd.Flags().IntP("port", "p", 1127, "监听本地端口开始点")
natscmd.Flags().StringP("key", "k", "sakura", "认证密码")
natscmd.Flags().StringP("address", "a", "0.0.0.0", "监听本地地址")
natscmd.Flags().IntP("number", "n", 1, "监听端口数量")
natccmd.Flags().BoolP("tcp", "t", false, "TCP穿透")
natccmd.Flags().BoolP("udp", "u", false, "UDP穿透")
natccmd.Flags().IntP("port", "p", 1127, "转发穿透端口")
natccmd.Flags().StringP("key", "k", "sakura", "认证密码")
natccmd.Flags().StringP("address", "a", "127.0.0.1", "转发穿透地址")
}
var netcmd = &cobra.Command{
Use: "net",
Short: "端口转发,穿透相关",
Long: "端口转发,穿透相关",
}
var netforwardcmd = &cobra.Command{
Use: "forward",
Short: "TCP/UDP端口转发",
Long: "TCP/UDP端口转发",
Run: func(cmd *cobra.Command, args []string) {
t, _ := cmd.Flags().GetBool("tcp")
u, _ := cmd.Flags().GetBool("udp")
p, _ := cmd.Flags().GetInt("port")
a, _ := cmd.Flags().GetString("address")
if len(args) != 1 {
cmd.Help()
return
}
ra := args[0]
if !t && !u {
fmt.Println("请指定TCP或UDP协议")
return
}
localtcp, err := net.ResolveTCPAddr("tcp", a+":"+strconv.Itoa(p))
if err != nil {
fmt.Println(err)
return
}
remotetcp, err := net.ResolveTCPAddr("tcp", ra)
if err != nil {
fmt.Println(err)
return
}
localudp, _ := net.ResolveUDPAddr("udp", a+":"+strconv.Itoa(p))
remoteudp, _ := net.ResolveUDPAddr("udp", ra)
if u {
go UdpForward(localudp, remoteudp)
}
if t {
go TcpForward(localtcp, remotetcp)
}
for {
time.Sleep(time.Second * 100)
}
},
}
var natscmd = &cobra.Command{
Use: "nats",
Short: "TCP/UDP内网穿透服务端",
Long: "TCP/UDP内网穿透服务端",
Run: func(cmd *cobra.Command, args []string) {
t, _ := cmd.Flags().GetBool("tcp")
u, _ := cmd.Flags().GetBool("udp")
p, _ := cmd.Flags().GetInt("port")
k, _ := cmd.Flags().GetString("key")
a, _ := cmd.Flags().GetString("address")
n, _ := cmd.Flags().GetInt("number")
/*udplocal, err := net.ResolveUDPAddr("udp", a+":"+p)
if err != nil {
fmt.Println(err)
return
}
*/
for i := 0; i < n; i++ {
tcplocal, err := net.ResolveTCPAddr("tcp", a+":"+strconv.Itoa(p+i))
if err != nil {
fmt.Println(err)
return
}
udplocal, _ := net.ResolveUDPAddr("udp", a+":"+strconv.Itoa(p+i))
if !t && !u {
fmt.Println("请至少指定一种网络协议!")
return
}
if t {
go TcpNatServer(tcplocal, k)
}
if u {
go UdpNatServer(udplocal, k)
}
}
for {
time.Sleep(time.Second * 10)
}
},
}
var natccmd = &cobra.Command{
Use: "natc",
Short: "TCP/UDP内网穿透客户端",
Long: "TCP/UDP内网穿透客户端",
Run: func(cmd *cobra.Command, args []string) {
t, _ := cmd.Flags().GetBool("tcp")
u, _ := cmd.Flags().GetBool("udp")
p, _ := cmd.Flags().GetInt("port")
k, _ := cmd.Flags().GetString("key")
a, _ := cmd.Flags().GetString("address")
/*udplocal, err := net.ResolveUDPAddr("udp", a+":"+p)
if err != nil {
fmt.Println(err)
return
}
*/
if len(args) != 1 {
cmd.Help()
return
}
if !t && !u {
fmt.Println("请至少指定一种网络协议!")
return
}
tcprmt, err := net.ResolveTCPAddr("tcp", args[0])
if err != nil {
fmt.Println(err)
return
}
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+":"+strconv.Itoa(p))
if t {
go TcpNatClient(tcprmt, tcpforward, k)
}
if u {
go UdpNatClient(udprmt, udpforward, k)
}
for {
time.Sleep(time.Second * 10)
}
},
}
type tcpnat struct {
Conn *net.TCPConn
Msg []byte
Date int64
}
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 {
return nil, err
}
return trueconn, nil
}
defer func() {
if err := recover(); err != nil {
fmt.Println("PANIC:", err)
}
}()
for {
trueconn, err = dialudp(udpremote)
if err != nil || trueconn == nil {
time.Sleep(5 * time.Second)
fmt.Println(err)
continue
}
fmt.Println("UDP远端服务器连接成功" + trueconn.RemoteAddr().String())
trueconn.Write([]byte(pwd))
go func() {
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
}
}
}
}()
go func() {
for {
if trueconn == nil {
break
}
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
}
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)
}
}
}()
for ismain || trueconn != nil {
time.Sleep(time.Second * 4)
}
ismain = false
}
}
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 {
return nil, err
}
return trueconn, nil
}
defer func() {
if err := recover(); err != nil {
fmt.Println("PANIC:", err)
}
}()
for {
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
}
go func() {
for {
time.Sleep(time.Second * 2)
if !ismain {
if trueconn != nil {
_, err := trueconn.Write([]byte(pwd))
if err != nil {
return
}
} else {
return
}
} else {
return
}
}
}()
go func() {
for {
if trueconn == nil {
break
}
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
}
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)
}
}
}()
for ismain || trueconn != nil {
time.Sleep(time.Second * 4)
}
ismain = false
}
}
func TcpCopy3(dst net.Conn, src *net.TCPConn) {
defer dst.Close()
defer src.Close()
io.Copy(dst, src)
}
func TcpCopy2(dst *net.TCPConn, src net.Conn) {
defer src.Close()
defer dst.Close()
io.Copy(dst, src)
}
func TcpCopy(dst, src *net.TCPConn) {
defer dst.Close()
defer src.Close()
io.Copy(dst, src)
}
func UdpCopy(dst, src *net.UDPConn) {
defer dst.Close()
defer src.Close()
for {
buf := make([]byte, 131072)
n, err := src.Read(buf)
dst.Write(buf[0:n])
if err != nil {
fmt.Println(err)
break
}
}
}
type udpnat struct {
Conn *net.UDPAddr
Msg []byte
Married bool
LastTrans int64
}
func UdpNatServer(udplocal *net.UDPAddr, pwd string) {
var trueconn *net.UDPAddr
isconn := false
var lastcheck int64
udplistener, err := net.ListenUDP("udp", udplocal)
defer udplistener.Close()
if err != nil {
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 * 20)
pool := []string{}
for k, v := range udpool {
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)
}
}
}()
for {
buf := make([]byte, 131072)
n, conn, errp := udplistener.ReadFromUDP(buf)
go func() {
if !isconn {
if errp != nil {
return
}
if string(buf[0:len(pwd)]) == pwd && n == len(pwd) {
isconn = true
trueconn = conn
udplistener.WriteToUDP([]byte("yesyesi"), trueconn)
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 * 2)
go udplistener.WriteToUDP([]byte("vicregs"), trueconn)
if time.Now().Unix()-lastcheck > 6 {
fmt.Println("UDP穿透客户端已下线")
fmt.Println("UDP下线01")
isconn = false
break
}
}
}()
}
} else {
if string(buf[0:7]) == "vicregs" {
lastcheck = time.Now().Unix()
return
}
if string(buf[0:7]) == "v%2^f&K" {
fmt.Println("穿透客户端已建立新连接")
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
} else {
if v, ok := udpool[conn.String()]; ok {
if !v.Married {
for i := 0; i < n; i++ {
v.Msg = append(v.Msg, buf[i])
}
if len(v.Msg) > 10485760 {
v.Msg = []byte{}
}
} else {
_, err := udplistener.WriteToUDP(buf[0:n], v.Conn)
v.LastTrans = time.Now().Unix()
if errp != nil || err != nil {
fmt.Println(errp, err)
udplistener.WriteToUDP(nil, v.Conn)
udplistener.WriteToUDP(nil, conn)
delete(udpool, conn.String())
delete(udpdial, v.Conn.String())
return
}
}
return
}
if v, ok := udpdial[conn.String()]; ok {
_, err := udplistener.WriteToUDP(buf[0:n], v)
udpool[v.String()].LastTrans = time.Now().Unix()
if errp != nil || err != nil {
fmt.Println(errp, err)
udplistener.WriteToUDP(nil, v)
udplistener.WriteToUDP(nil, conn)
delete(udpool, v.String())
delete(udpdial, conn.String())
return
}
return
}
fmt.Println("链接已加入等待列表")
udpool[conn.String()] = &udpnat{
Msg: buf[0:n],
Married: false,
LastTrans: time.Now().Unix(),
}
udpconnlist = append(udpconnlist, conn.String())
_, err := udplistener.WriteToUDP([]byte("newconn"), trueconn)
if err != nil {
fmt.Println("UDP穿透客户端已下线")
fmt.Println("UDP下线02")
isconn = false
}
}
}
}()
}
fmt.Println("执行完毕")
}
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()
var waitconn []tcpnat
if err != nil {
fmt.Println(err)
return
}
fmt.Println("TCP已建立监听" + tcplistener.Addr().String())
for {
conn, err := tcplistener.AcceptTCP()
if err != nil {
return
}
go func() {
for {
now := time.Now().Unix()
if len(waitconn) != 0 {
if now-waitconn[0].Date > 8 {
waitconn[0].Conn.Close()
if len(waitconn) > 1 {
waitconn = waitconn[1:]
} else {
waitconn = []tcpnat{}
}
}
}
time.Sleep(time.Second * 2)
}
}()
go func() {
if !isconn {
buf := make([]byte, len(pwd)+1)
n, err := conn.Read(buf)
if n != len(pwd) || err != nil {
conn.Close()
return
}
if string(buf[0:len(pwd)]) == pwd {
isconn = true
trueconn = conn
conn.Write([]byte("yesyesi"))
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)
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
}
}
}()
}
return
} else {
isRun := false
buf := make([]byte, 7)
if strings.Split(conn.RemoteAddr().String(), ":")[0] == strings.Split(trueconn.RemoteAddr().String(), ":")[0] {
isRun = true
n, err := conn.Read(buf)
if n != 7 || err != nil {
conn.Close()
return
}
}
if string(buf) == "v%2^f&K" {
fmt.Println("穿透客户端已建立新连接")
if len(waitconn) != 0 {
if waitconn[0].Msg != nil {
conn.Write(waitconn[0].Msg)
}
waitconn[0].Msg = []byte{}
go TcpCopy(waitconn[0].Conn, conn)
go TcpCopy(conn, waitconn[0].Conn)
if len(waitconn) > 1 {
waitconn = waitconn[1:]
} else {
waitconn = []tcpnat{}
}
} else {
conn.Close()
}
} else {
fmt.Println("链接已加入等待列表")
var tcpnats tcpnat
if isRun {
tcpnats = tcpnat{Msg: buf, Conn: conn, Date: time.Now().Unix()}
} else {
tcpnats = tcpnat{Msg: nil, 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
}
}
}
}()
}
}
func TcpForward(tcplocal, tcpforward *net.TCPAddr) {
tcplistener, err := net.ListenTCP("tcp", tcplocal)
if err != nil {
fmt.Println(err)
return
}
dialtcp := func() (*net.Conn, error) {
tcpclient, err := net.DialTimeout("tcp", tcpforward.String(), time.Second*10)
if err != nil {
return nil, err
}
return &tcpclient, nil
}
fmt.Println("TCP监听已建立" + tcplocal.String())
for {
conn, err := tcplistener.AcceptTCP()
if err != nil {
continue
}
fmt.Println(conn.RemoteAddr().String() + " 已连接")
tcpclient, err := dialtcp()
if err != nil {
fmt.Println(err)
conn.Write([]byte("Dial To Remote Addr Error"))
conn.Close()
continue
}
fmt.Println("成功连接到转发端口,本地端口:" + (*tcpclient).LocalAddr().String())
go TcpCopy2(conn, *tcpclient)
go TcpCopy3(*tcpclient, conn)
}
}
func UdpForward(udplocal, udpforward *net.UDPAddr) {
udplistener, err := net.ListenUDP("udp", udplocal)
if err != nil {
fmt.Println(err)
return
}
dialudp := func() (*net.UDPConn, error) {
udpclient, err := net.DialUDP("udp", nil, udpforward)
if err != nil {
return nil, err
}
return udpclient, nil
}
fmt.Println("UDP监听已建立" + udplocal.String())
udppool := make(map[string]*net.UDPConn)
for {
buf := make([]byte, 131072)
n, conn, err := udplistener.ReadFromUDP(buf)
udpclient, ok := udppool[conn.String()]
if !ok || udpclient == nil {
fmt.Println(conn.String() + " 已连接")
udpclient, err = dialudp()
if err != nil {
fmt.Println(err)
udplistener.WriteToUDP([]byte("Dial To Remote Addr Error"), conn)
continue
}
udppool[conn.String()] = udpclient
fmt.Println("成功连接到转发端口,本地端口:" + udpclient.LocalAddr().String())
}
go udpclient.Write(buf[0:n])
go func(conns *net.UDPAddr, udpclient *net.UDPConn) {
bufs := make([]byte, 131072)
n, err := udpclient.Read(bufs)
udplistener.WriteToUDP(bufs[0:n], conns)
if err != nil {
udpclient.Close()
udppool[conn.String()] = nil
}
}(conn, udpclient)
if err != nil {
udpclient.Close()
udppool[conn.String()] = nil
}
}
}

View File

@ -2,8 +2,15 @@ package tools
import ( import (
"fmt" "fmt"
"io/ioutil"
"os"
"path/filepath"
"regexp"
"runtime"
"strings" "strings"
"b612.me/starainrt"
"b612.me/sshd" "b612.me/sshd"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -15,14 +22,17 @@ var sftpcmd = &cobra.Command{
Long: "sftp上传下载", Long: "sftp上传下载",
Run: func(this *cobra.Command, args []string) { Run: func(this *cobra.Command, args []string) {
d, _ := this.Flags().GetBool("download") d, _ := this.Flags().GetBool("download")
s, _ := this.Flags().GetString("src")
r, _ := this.Flags().GetString("dst")
i, _ := this.Flags().GetString("identify") i, _ := this.Flags().GetString("identify")
k, _ := this.Flags().GetString("password") k, _ := this.Flags().GetString("password")
p, _ := this.Flags().GetInt("port") p, _ := this.Flags().GetInt("port")
b, _ := this.Flags().GetInt("buffer") b, _ := this.Flags().GetInt("buffer")
g, _ := this.Flags().GetString("regexp")
var user, host string var user, host string
var err error var err error
if len(args) != 3 { if len(args) != 1 {
fmt.Println("sftp <[user@]Host> <Local> <Remote>") fmt.Println("sftp <[user@]Host> -s <Local> -d <Remote>")
this.Help() this.Help()
return return
} }
@ -35,20 +45,22 @@ var sftpcmd = &cobra.Command{
host = hosts[1] host = hosts[1]
} }
fmt.Println("进行SSH连接……") 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 { if err != nil {
fmt.Println(err) fmt.Println(err)
return return
} }
defer client.Close() defer myssh.Close()
fmt.Println("已连接上……") fmt.Println("已连接上……")
sftp, err := sshd.CreateSftp(client) sftp, err := sshd.CreateSftp(myssh.Client)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
return return
} }
defer sftp.Close() defer sftp.Close()
fmt.Println("已建立SFTP……") fmt.Println("已建立SFTP……")
shell := func(pect float64) { shell := func(pect float64) {
if pect != 100.0 { if pect != 100.0 {
fmt.Printf("传输已完成:%f%%\r", pect) fmt.Printf("传输已完成:%f%%\r", pect)
@ -56,10 +68,91 @@ var sftpcmd = &cobra.Command{
fmt.Printf("传输已完成:%f%%\n", pect) 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 { 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 { } 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 { if err != nil {
fmt.Println(err) fmt.Println(err)
@ -69,9 +162,12 @@ var sftpcmd = &cobra.Command{
func init() { func init() {
Maincmd.AddCommand(sftpcmd) Maincmd.AddCommand(sftpcmd)
sftpcmd.Flags().BoolP("download", "d", false, "进行下载") sftpcmd.Flags().BoolP("download", "D", false, "进行下载")
sftpcmd.Flags().StringP("identify", "i", "", "RSA登录密钥") sftpcmd.Flags().StringP("identify", "i", "", "RSA登录密钥")
sftpcmd.Flags().StringP("password", "k", "", "登录密码") sftpcmd.Flags().StringP("password", "k", "", "登录密码")
sftpcmd.Flags().StringP("src", "s", "", "本机路径/若为下载则相反")
sftpcmd.Flags().StringP("dst", "d", "", "远程路径/若为下载则相反")
sftpcmd.Flags().IntP("port", "p", 22, "登录端口") sftpcmd.Flags().IntP("port", "p", 22, "登录端口")
sftpcmd.Flags().StringP("regexp", "r", "", "正则表达式")
sftpcmd.Flags().IntP("buffer", "b", 10240, "buffer大小") sftpcmd.Flags().IntP("buffer", "b", 10240, "buffer大小")
} }

View File

@ -27,12 +27,12 @@ var splitcmd = &cobra.Command{
num, _ = this.Flags().GetInt("num") num, _ = this.Flags().GetInt("num")
} }
if !starainrt.Exists(src) { if !starainrt.Exists(src) {
starlog.Println("源文件不存在", "red", "b") starlog.Errorln("源文件不存在")
this.Help() this.Help()
return return
} }
if num == 0 { if num == 0 {
starlog.Println("参数num不合法", "red", "b") starlog.Errorln("参数num不合法", "red")
this.Help() this.Help()
return return
} }
@ -46,7 +46,7 @@ var splitcmd = &cobra.Command{
} }
}) })
if err != nil { if err != nil {
starlog.Println(err.Error, "red", "") starlog.Errorln(err.Error)
} }
}, },

443
vtqe/tools/tcp.go Normal file
View File

@ -0,0 +1,443 @@
package tools
import (
"fmt"
"io"
"io/ioutil"
"net"
"os"
"path/filepath"
"regexp"
"runtime"
"strconv"
"strings"
"time"
"b612.me/starainrt"
"b612.me/starlog"
"github.com/spf13/cobra"
)
var tcpcmd = &cobra.Command{
Use: "tcp",
Short: "发送并监听tcp数据包",
Long: "发送并监听tcp数据包",
Run: func(this *cobra.Command, args []string) {
r, _ := this.Flags().GetBool("recvonly")
if len(args) != 1 && !r {
fmt.Println("请指定远程tcp地址")
return
}
l, _ := this.Flags().GetString("port")
a, _ := this.Flags().GetString("addr")
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
}
starlog.Infof("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 {
starlog.Infof("Error from %s Where Message=%s\n", conns.RemoteAddr(), err.Error())
conn.Close()
return
}
starlog.Infof("Receive Msg From %s : %s\n", conns.RemoteAddr(), string(buf[0:n]))
if b {
starlog.Infof("%#v", buf[0:n])
}
}
}(conn)
}
}()
}
if !r {
mytcp, err := net.DialTimeout("tcp", args[0], 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 {
starlog.Errorf("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 {
starlog.Errorf("Error from %s Where Message=%s\n", mytcp.RemoteAddr().String(), err.Error())
return
}
starlog.Infof("Receive Msg From %s : %s\n", mytcp.RemoteAddr().String(), string(buf[0:n]))
if b {
starlog.Infof("%#v", buf[0:n])
}
}
} else {
for {
time.Sleep(time.Second)
}
}
},
}
/*
*/
func init() {
Maincmd.AddCommand(tcpcmd)
tcpcmd.Flags().BoolP("byte", "b", false, "发送二进制数据")
tcpcmd.Flags().StringP("port", "p", "1127", "本地监听端口")
tcpcmd.Flags().StringP("addr", "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.Flags().BoolP("recvonly", "r", false, "仅接收udp包")
tcpcmd.AddCommand(tcpsendcmd, tcprecvcmd)
}
var cansend, backsck, foldercreate bool = false, false, 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 if data == "backsck" {
backsck = true
} else if data == "folderok" {
foldercreate = 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})
time.Sleep(time.Millisecond * 100)
mytcp.Write([]byte("victorique&" + stat.Name() + "&" + prefix))
}
}
cansend = false
sum := 0
for {
buf := make([]byte, 524288)
n, err := fpsrc.Read(buf)
if err != nil {
if err == io.EOF {
err = nil
mytcp.Write([]byte{1, 9, 9, 6, 1, 1, 2, 7})
for !backsck {
time.Sleep(time.Millisecond * 150)
}
backsck = false
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()
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"))
count := 0
for !foldercreate {
time.Sleep(time.Millisecond * 100)
count++
if count%30 == 0 {
mytcp.Write([]byte("b612&" + prefix + v.Name() + "&0"))
}
}
foldercreate = false
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 int64
for {
buf := make([]byte, 393216)
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 runtime.GOOS != "windows" {
prefix = strings.Replace(prefix, "\\", "/", -1)
}
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" {
str[1] = ".\\" + str[1]
if runtime.GOOS != "windows" {
str[1] = strings.Replace(str[1], "\\", "/", -1)
}
fmt.Println("进入文件夹:" + str[1] + "\n")
os.MkdirAll(str[1], 0644)
time.Sleep(time.Millisecond * 50)
conns.Write([]byte("folderok"))
} else if str[0] == "jane" {
return
}
} else {
if buf[n-1] == byte(7) && buf[n-2] == byte(2) && buf[n-3] == byte(1) {
ok := func() bool {
for k, v := range []byte{1, 9, 9, 6, 1, 1, 2, 7} {
if buf[n-8+k] != v {
return false
}
}
return true
}()
if ok {
if n > 8 {
fpdst.Write(buf[0 : n-8])
sum += int64(n - 8)
}
fmt.Printf("已写入:%d 字节\n", sum)
fmt.Println(name + "接收成功\n")
fpdst.Close()
canrecv = false
sum = 0
conns.Write([]byte("backsck"))
continue
}
}
fpdst.Write(buf[0:n])
sum += int64(n)
fmt.Printf("已写入:%d 字节\r", sum)
}
}
}(conn)
}
},
}

View File

@ -15,19 +15,18 @@ import (
) )
var ( var (
showVersion bool counter int
version string timeout string
gitCommit string interval string
counter int sigs chan os.Signal
timeout string
interval string
sigs chan os.Signal
httpMode bool httpMode bool
httpHead bool httpHead bool
httpPost bool httpPost bool
httpUA string httpUA string
permanent bool
dnsServer []string dnsServer []string
) )
@ -48,11 +47,13 @@ var tcpingcmd = &cobra.Command{
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
sigs = make(chan os.Signal, 1) sigs = make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
if showVersion { if permanent && counter != 4 {
fmt.Printf("version: %s\n", version) fmt.Println("不能同时指定-t与-c请检查您的输入")
fmt.Printf("git: %s\n", gitCommit)
return return
} }
if permanent {
counter = 0
}
if len(args) != 2 && len(args) != 1 { if len(args) != 2 && len(args) != 1 {
cmd.Usage() cmd.Usage()
return return
@ -162,15 +163,15 @@ var tcpingcmd = &cobra.Command{
} }
func init() { func init() {
tcpingcmd.Flags().BoolVarP(&showVersion, "version", "v", false, "show the version and exit")
tcpingcmd.Flags().IntVarP(&counter, "counter", "c", 4, "ping的次数") 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(&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().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().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(&httpHead, "head", false, `使用http head模式`)
tcpingcmd.Flags().BoolVar(&httpPost, "post", false, `使用http post模式`) 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服务器`) tcpingcmd.Flags().StringArrayVarP(&dnsServer, "dns-server", "D", nil, `使用自定义DNS服务器`)

127
vtqe/tools/udp.go Normal file
View File

@ -0,0 +1,127 @@
package tools
import (
"fmt"
"net"
"strconv"
"strings"
"time"
"b612.me/starainrt"
"b612.me/starlog"
"github.com/spf13/cobra"
)
var udpcmd = &cobra.Command{
Use: "udp",
Short: "发送并监听udp数据包",
Long: "发送并监听udp数据包",
Run: func(this *cobra.Command, args []string) {
var raddr *net.UDPAddr
r, _ := this.Flags().GetBool("recvonly")
if len(args) != 1 && !r {
fmt.Println("请指定远程udp地址")
return
}
l, _ := this.Flags().GetString("port")
a, _ := this.Flags().GetString("addr")
s, _ := this.Flags().GetBool("local")
b, _ := this.Flags().GetBool("byte")
laddr, err := net.ResolveUDPAddr("udp", a+":"+l)
if !r {
raddr, err = net.ResolveUDPAddr("udp", args[0])
}
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 {
starlog.Errorln("Error from %s Where Message=%s\n", addr.String(), err.Error())
continue
}
starlog.Infof("Receive Msg From %s : %s\n", addr.String(), string(buf[0:n]))
if b {
starlog.Infof("%#v\n", buf[0:n])
}
}
}()
}
if !r {
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 {
starlog.Infof("Error from %s Where Message=%s\n", myudp.RemoteAddr().String(), err.Error())
return
}
starlog.Infof("Receive Msg From %s : %s\n", myudp.RemoteAddr().String(), string(buf[0:n]))
if b {
starlog.Infof("%#v", buf[0:n])
}
}
} else {
for {
time.Sleep(time.Second)
}
}
},
}
/*
*/
func init() {
Maincmd.AddCommand(udpcmd)
udpcmd.Flags().BoolP("byte", "b", false, "发送二进制数据")
udpcmd.Flags().StringP("port", "p", "1127", "本地监听端口")
udpcmd.Flags().StringP("addr", "a", "0.0.0.0", "本地监听ip")
udpcmd.Flags().BoolP("local", "s", false, "启动本地监听")
udpcmd.Flags().BoolP("recvonly", "r", false, "仅接收udp包")
}

View File

@ -21,11 +21,9 @@ var viccmd = &cobra.Command{
pwd, _ := this.Flags().GetString("key") pwd, _ := this.Flags().GetString("key")
rep, _ := this.Flags().GetBool("replace") rep, _ := this.Flags().GetBool("replace")
ext, _ := this.Flags().GetBool("extension") ext, _ := this.Flags().GetBool("extension")
if len(args) != 2 { if len(args) != 2 || args[1] != "sakura" {
if len(args) < 2 || args[1] != "sakura" { starlog.Errorln("ヴィクトリカだけが使えるよ")
starlog.Println("ヴィクトリカだけが使えるよ", "red", "b") return
return
}
} }
shell := func(pect float64) { shell := func(pect float64) {
if pect == 100 { if pect == 100 {
@ -79,7 +77,7 @@ var viccmd = &cobra.Command{
} }
} }
if err != nil { if err != nil {
starlog.Println(err, "red", "b") starlog.Errorln(err)
return return
} }
}, },