master v0.1.20
兔子 5 years ago
parent 7c2dab6aa6
commit 874012fe56

@ -4,7 +4,7 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
var Version string = "0.1.18" var Version string = "0.1.20"
var Maincmd = &cobra.Command{ var Maincmd = &cobra.Command{
Use: "", Use: "",

@ -113,8 +113,8 @@ 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) fmt.Println(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)
@ -160,19 +160,20 @@ func ReadFolder(w http.ResponseWriter, r *http.Request, fullpath string, isroot
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(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>Victorique 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 !isroot {
w.Write([]byte(fmt.Sprintf("<p><a href='%s'>%s</a> %s</p>\n", r.URL.Path+"/..", "..", "上层文件夹")))
}
if r.URL.Path == "/" { if r.URL.Path == "/" {
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("<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() != ".." {

@ -27,8 +27,8 @@ func init() {
natccmd.Flags().BoolP("tcp", "t", false, "TCP穿透") natccmd.Flags().BoolP("tcp", "t", false, "TCP穿透")
natccmd.Flags().BoolP("udp", "u", false, "UDP穿透") natccmd.Flags().BoolP("udp", "u", false, "UDP穿透")
natccmd.Flags().StringP("port", "p", "1127", "转发穿透端口") natccmd.Flags().IntP("port", "p", 1127, "转发穿透端口")
natccmd.Flags().StringP("key", "k", "1127", "认证密码") natccmd.Flags().StringP("key", "k", "sakura", "认证密码")
natccmd.Flags().StringP("address", "a", "127.0.0.1", "转发穿透地址") natccmd.Flags().StringP("address", "a", "127.0.0.1", "转发穿透地址")
} }
@ -130,7 +130,7 @@ var natccmd = &cobra.Command{
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
t, _ := cmd.Flags().GetBool("tcp") t, _ := cmd.Flags().GetBool("tcp")
u, _ := cmd.Flags().GetBool("udp") u, _ := cmd.Flags().GetBool("udp")
p, _ := cmd.Flags().GetString("port") p, _ := cmd.Flags().GetInt("port")
k, _ := cmd.Flags().GetString("key") k, _ := cmd.Flags().GetString("key")
a, _ := cmd.Flags().GetString("address") a, _ := cmd.Flags().GetString("address")
/*udplocal, err := net.ResolveUDPAddr("udp", a+":"+p) /*udplocal, err := net.ResolveUDPAddr("udp", a+":"+p)
@ -152,13 +152,13 @@ var natccmd = &cobra.Command{
fmt.Println(err) fmt.Println(err)
return return
} }
tcpforward, err := net.ResolveTCPAddr("tcp", a+":"+p) tcpforward, err := net.ResolveTCPAddr("tcp", a+":"+strconv.Itoa(p))
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
return return
} }
udprmt, _ := net.ResolveUDPAddr("udp", args[0]) udprmt, _ := net.ResolveUDPAddr("udp", args[0])
udpforward, _ := net.ResolveUDPAddr("udp", a+":"+p) udpforward, _ := net.ResolveUDPAddr("udp", a+":"+strconv.Itoa(p))
if t { if t {
go TcpNatClient(tcprmt, tcpforward, k) go TcpNatClient(tcprmt, tcpforward, k)
} }
@ -181,6 +181,7 @@ func UdpNatClient(udpremote, udpforward *net.UDPAddr, pwd string) {
var trueconn *net.UDPConn var trueconn *net.UDPConn
var err error var err error
ismain := false ismain := false
var lastcheck int64
dialudp := func(udpaddr *net.UDPAddr) (*net.UDPConn, error) { dialudp := func(udpaddr *net.UDPAddr) (*net.UDPConn, error) {
trueconn, err := net.DialUDP("udp", nil, udpaddr) trueconn, err := net.DialUDP("udp", nil, udpaddr)
if err != nil { if err != nil {
@ -188,45 +189,71 @@ func UdpNatClient(udpremote, udpforward *net.UDPAddr, pwd string) {
} }
return trueconn, nil return trueconn, nil
} }
defer func() {
if err := recover(); err != nil {
fmt.Println("PANIC:", err)
}
}()
for { for {
for trueconn, err = dialudp(udpremote); err != nil; trueconn, err = dialudp(udpremote) { trueconn, err = dialudp(udpremote)
fmt.Println(err) if err != nil || trueconn == nil {
time.Sleep(5 * time.Second) time.Sleep(5 * time.Second)
fmt.Println(err)
continue
} }
fmt.Println("UDP远端服务器连接成功" + trueconn.RemoteAddr().String())
fmt.Println("远端服务器连接成功" + trueconn.RemoteAddr().String())
trueconn.Write([]byte(pwd)) trueconn.Write([]byte(pwd))
go func() { go func() {
for { for !ismain {
time.Sleep(time.Second * 5) time.Sleep(time.Second * 2)
if !ismain { if trueconn != nil {
if ismain {
return
}
_, err := trueconn.Write([]byte(pwd)) _, err := trueconn.Write([]byte(pwd))
if err != nil { if err != nil {
fmt.Println(err)
return return
} }
} }
} }
}() }()
go func() {
for { for {
if trueconn == nil {
break
}
var conn1, conn2 *net.UDPConn var conn1, conn2 *net.UDPConn
buf := make([]byte, 7) buf := make([]byte, 7)
n, err := trueconn.Read(buf) n, err := trueconn.Read(buf)
if n != 7 || err != nil { if n != 7 || err != nil {
fmt.Println(err) fmt.Println(err)
trueconn.Close() trueconn = nil
ismain = false ismain = false
fmt.Println("UDP下线01")
break break
} }
switch string(buf) { switch string(buf) {
case "yesyesi": case "yesyesi":
ismain = true ismain = true
fmt.Println("主节点认证成功") fmt.Println("UDP主节点认证成功")
lastcheck = time.Now().Unix()
go func() { go func() {
for { for {
time.Sleep(time.Second * 2) time.Sleep(time.Second * 2)
trueconn.Write([]byte("vicregs")) 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": case "newconn":
if !ismain { if !ismain {
trueconn.Close() trueconn.Close()
@ -235,16 +262,21 @@ func UdpNatClient(udpremote, udpforward *net.UDPAddr, pwd string) {
for conn1, err = dialudp(udpforward); err != nil; conn1, err = dialudp(udpforward) { for conn1, err = dialudp(udpforward); err != nil; conn1, err = dialudp(udpforward) {
time.Sleep(time.Second * 2) time.Sleep(time.Second * 2)
} }
fmt.Println("已连接转发远端:" + conn1.RemoteAddr().String()) fmt.Println("UDP已连接转发远端:" + conn1.RemoteAddr().String())
for conn2, err = dialudp(udpremote); err != nil; conn2, err = dialudp(udpremote) { for conn2, err = dialudp(udpremote); err != nil; conn2, err = dialudp(udpremote) {
time.Sleep(time.Second * 2) time.Sleep(time.Second * 2)
} }
conn2.Write([]byte("v%2^f&K")) conn2.Write([]byte("v%2^f&K"))
fmt.Println("已连接主控远端:" + conn2.RemoteAddr().String()) fmt.Println("UDP已连接主控远端:" + conn2.RemoteAddr().String())
go UdpCopy(conn1, conn2) go UdpCopy(conn1, conn2)
go UdpCopy(conn2, conn1) 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 trueconn *net.TCPConn
var err error var err error
ismain := false ismain := false
var lastcheck int64
dialtcp := func(tcpaddr *net.TCPAddr) (*net.TCPConn, error) { dialtcp := func(tcpaddr *net.TCPAddr) (*net.TCPConn, error) {
trueconn, err := net.DialTCP("tcp", nil, tcpaddr) trueconn, err := net.DialTCP("tcp", nil, tcpaddr)
if err != nil { if err != nil {
@ -259,57 +292,103 @@ func TcpNatClient(tcpremote, tcpforward *net.TCPAddr, pwd string) {
} }
return trueconn, nil return trueconn, nil
} }
defer func() {
if err := recover(); err != nil {
fmt.Println("PANIC:", err)
}
}()
for { for {
for trueconn, err = dialtcp(tcpremote); err != nil; trueconn, err = dialtcp(tcpremote) { trueconn, err = dialtcp(tcpremote)
if err != nil || trueconn == nil {
fmt.Println(err) fmt.Println(err)
time.Sleep(5 * time.Second) 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() { go func() {
for { for {
time.Sleep(time.Second * 5) time.Sleep(time.Second * 2)
if !ismain { if !ismain {
if trueconn != nil {
_, err := trueconn.Write([]byte(pwd)) _, err := trueconn.Write([]byte(pwd))
if err != nil { if err != nil {
return return
} }
} else {
return
}
} else {
return
} }
} }
}() }()
go func() {
for { for {
if trueconn == nil {
break
}
var conn1, conn2 *net.TCPConn var conn1, conn2 *net.TCPConn
buf := make([]byte, 7) buf := make([]byte, 7)
n, err := trueconn.Read(buf) n, err := trueconn.Read(buf)
if n != 7 || err != nil { if n != 7 || err != nil {
fmt.Println("TCP下线01")
fmt.Println(err) fmt.Println(err)
trueconn.Close() trueconn = nil
ismain = false ismain = false
break break
} }
switch string(buf) { switch string(buf) {
case "yesyesi": case "yesyesi":
ismain = true ismain = true
fmt.Println("主节点认证成功") 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": case "newconn":
if !ismain { if !ismain {
trueconn.Close() trueconn.Close()
trueconn = nil
fmt.Println("TCP下线03")
break break
} }
for conn1, err = dialtcp(tcpforward); err != nil; conn1, err = dialtcp(tcpforward) { for conn1, err = dialtcp(tcpforward); err != nil; conn1, err = dialtcp(tcpforward) {
time.Sleep(time.Second * 2) time.Sleep(time.Second * 2)
} }
fmt.Println("已连接转发远端:" + conn1.RemoteAddr().String()) fmt.Println("TCP已连接转发远端:" + conn1.RemoteAddr().String())
for conn2, err = dialtcp(tcpremote); err != nil; conn2, err = dialtcp(tcpremote) { for conn2, err = dialtcp(tcpremote); err != nil; conn2, err = dialtcp(tcpremote) {
time.Sleep(time.Second * 2) time.Sleep(time.Second * 2)
} }
conn2.Write([]byte("v%2^f&K")) conn2.Write([]byte("v%2^f&K"))
fmt.Println("已连接主控远端:" + conn2.RemoteAddr().String()) fmt.Println("TCP已连接主控远端:" + conn2.RemoteAddr().String())
go TcpCopy(conn1, conn2) go TcpCopy(conn1, conn2)
go TcpCopy(conn2, conn1) 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) fmt.Println(err)
return return
} }
udpconnlist := []string{}
udpool := make(map[string]*udpnat) udpool := make(map[string]*udpnat)
udpdial := make(map[string]*net.UDPAddr) udpdial := make(map[string]*net.UDPAddr)
fmt.Println("UDP已建立监听" + udplistener.LocalAddr().String()) 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() { go func() {
for { for {
time.Sleep(time.Second * 300) time.Sleep(time.Second * 20)
pool := []string{} pool := []string{}
for k, v := range udpool { for k, v := range udpool {
if time.Now().Unix()-v.LastTrans > 600 { if time.Now().Unix()-v.LastTrans > 30 {
pool = append(pool, k) pool = append(pool, k)
} }
} }
for _, v := range pool { for _, v := range pool {
if udpool[v].Married { if udpool[v].Married {
delete(udpdial, udpool[v].Conn.String()) delete(udpdial, udpool[v].Conn.String())
} else {
removeudplist(v)
} }
delete(udpool, v) delete(udpool, v)
} }
@ -390,17 +481,22 @@ func UdpNatServer(udplocal *net.UDPAddr, pwd string) {
if errp != nil { if errp != nil {
return return
} }
if string(buf[0:len(pwd)]) == pwd { if string(buf[0:len(pwd)]) == pwd && n == len(pwd) {
isconn = true isconn = true
trueconn = conn trueconn = conn
udplistener.WriteToUDP([]byte("yesyesi"), trueconn) 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() lastcheck = time.Now().Unix()
go func() { go func() {
for { for {
time.Sleep(time.Second * 5) time.Sleep(time.Second * 2)
if time.Now().Unix()-lastcheck > 4 { go udplistener.WriteToUDP([]byte("vicregs"), trueconn)
fmt.Println("穿透客户端已下线") if time.Now().Unix()-lastcheck > 6 {
fmt.Println("UDP穿透客户端已下线")
fmt.Println("UDP下线01")
isconn = false isconn = false
break break
} }
@ -414,15 +510,21 @@ func UdpNatServer(udplocal *net.UDPAddr, pwd string) {
} }
if string(buf[0:7]) == "v%2^f&K" { if string(buf[0:7]) == "v%2^f&K" {
fmt.Println("穿透客户端已建立新连接") fmt.Println("穿透客户端已建立新连接")
for k, v := range udpool { if len(udpconnlist) != 0 {
if v, ok := udpool[udpconnlist[0]]; ok {
if !v.Married { if !v.Married {
v.Conn = conn v.Conn = conn
udplistener.WriteToUDP(v.Msg, conn) udplistener.WriteToUDP(v.Msg, conn)
v.Msg = []byte{} v.Msg = []byte{}
udpaddr, _ := net.ResolveUDPAddr("udp", k) udpaddr, _ := net.ResolveUDPAddr("udp", udpconnlist[0])
udpdial[conn.String()] = udpaddr udpdial[conn.String()] = udpaddr
v.Married = true v.Married = true
break }
}
if len(udpconnlist) == 1 {
udpconnlist = []string{}
} else {
udpconnlist = udpconnlist[1:]
} }
} }
return return
@ -468,9 +570,11 @@ func UdpNatServer(udplocal *net.UDPAddr, pwd string) {
Married: false, Married: false,
LastTrans: time.Now().Unix(), LastTrans: time.Now().Unix(),
} }
udpconnlist = append(udpconnlist, conn.String())
_, err := udplistener.WriteToUDP([]byte("newconn"), trueconn) _, err := udplistener.WriteToUDP([]byte("newconn"), trueconn)
if err != nil { if err != nil {
fmt.Println("穿透客户端已下线") fmt.Println("UDP穿透客户端已下线")
fmt.Println("UDP下线02")
isconn = false isconn = false
} }
} }
@ -482,6 +586,7 @@ func UdpNatServer(udplocal *net.UDPAddr, pwd string) {
func TcpNatServer(tcplocal *net.TCPAddr, pwd string) { func TcpNatServer(tcplocal *net.TCPAddr, pwd string) {
var trueconn *net.TCPConn var trueconn *net.TCPConn
lastcheck := int64(0)
isconn := false isconn := false
tcplistener, err := net.ListenTCP("tcp", tcplocal) tcplistener, err := net.ListenTCP("tcp", tcplocal)
defer tcplistener.Close() 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() { go func() {
if !isconn { if !isconn {
buf := make([]byte, len(pwd)) buf := make([]byte, len(pwd)+1)
n, err := conn.Read(buf) n, err := conn.Read(buf)
if n != len(pwd) { if n != len(pwd) || err != nil {
conn.Close()
return
}
if err != nil {
conn.Close() conn.Close()
return return
} }
if string(buf) == pwd { if string(buf[0:len(pwd)]) == pwd {
isconn = true isconn = true
trueconn = conn trueconn = conn
conn.Write([]byte("yesyesi")) 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() { go func() {
for { for {
time.Sleep(time.Second * 2) time.Sleep(time.Second * 2)
if trueconn != nil {
_, err := trueconn.Write([]byte("vicb612")) _, err := trueconn.Write([]byte("vicb612"))
if err != nil { if err != nil {
trueconn.Close() 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 isconn = false
return return
} }
@ -548,14 +674,11 @@ func TcpNatServer(tcplocal *net.TCPAddr, pwd string) {
if isconn { if isconn {
buf := make([]byte, 7) buf := make([]byte, 7)
n, err := conn.Read(buf) n, err := conn.Read(buf)
if n != 7 { if n != 7 || err != nil {
conn.Close()
return
}
if err != nil {
conn.Close() conn.Close()
return return
} }
if string(buf) == "v%2^f&K" { if string(buf) == "v%2^f&K" {
fmt.Println("穿透客户端已建立新连接") fmt.Println("穿透客户端已建立新连接")
if len(waitconn) != 0 { if len(waitconn) != 0 {
@ -574,10 +697,17 @@ func TcpNatServer(tcplocal *net.TCPAddr, pwd string) {
fmt.Println("链接已加入等待列表") fmt.Println("链接已加入等待列表")
tcpnats := tcpnat{Msg: buf, Conn: conn, Date: time.Now().Unix()} tcpnats := tcpnat{Msg: buf, Conn: conn, Date: time.Now().Unix()}
waitconn = append(waitconn, tcpnats) waitconn = append(waitconn, tcpnats)
if trueconn == nil {
isconn = false
fmt.Println("TCP下线04")
return
}
_, err := trueconn.Write([]byte("newconn")) _, err := trueconn.Write([]byte("newconn"))
if err != nil { if err != nil {
fmt.Println("穿透客户端已下线") fmt.Println("穿透客户端已下线")
fmt.Println("TCP下线03")
trueconn.Close() trueconn.Close()
trueconn = nil
isconn = false isconn = false
} }
} }

@ -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 {
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 { } else {
err = sshd.FtpTransferInFunc(args[1], args[2], b, shell, sftp) 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大小")
} }

Loading…
Cancel
Save