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("
\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
}
- for {
- for trueconn, err = dialudp(udpremote); err != nil; trueconn, err = dialudp(udpremote) {
- fmt.Println(err)
- time.Sleep(5 * time.Second)
+ defer func() {
+ if err := recover(); err != nil {
+ fmt.Println("PANIC:", err)
}
-
- fmt.Println("远端服务器连接成功" + trueconn.RemoteAddr().String())
+ }()
+ 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 {
- 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大小")
}