修复sftp上传下载数据丢失问题

master
兔子 5 years ago
parent 2c1ec13a0c
commit 9bff38bd4b

@ -53,6 +53,7 @@ type StarShell struct {
isprint bool
isfuncs bool
iscolor bool
isecho bool
funcs func(string)
}
@ -101,6 +102,10 @@ func (this *StarShell) SwitchNoColor(is bool) {
this.iscolor = is
}
func (this *StarShell) SwitchEcho(is bool) {
this.isecho = is
}
func (this *StarShell) TrimColor(str string) string {
if this.iscolor {
return SedColor(str)
@ -129,6 +134,7 @@ func (this *StarShell) SetFunc(funcs func(string)) {
func (this *StarShell) Clear() {
this.outbyte = []byte{}
this.errbyte = []byte{}
time.Sleep(time.Millisecond * 5)
}
func (this *StarShell) ShellClear(cmd string, sleep int) (string, string, error) {
@ -142,7 +148,35 @@ func (this *StarShell) Shell(cmd string, sleep int) (string, string, error) {
return "", "", err
}
tmp1, tmp2, err := this.GetResult(sleep)
return this.TrimColor(strings.TrimSpace(string(tmp1))), this.TrimColor(strings.TrimSpace(string(tmp2))), err
tmps := this.TrimColor(strings.TrimSpace(string(tmp1)))
if this.isecho {
n := len(strings.Split(cmd, "\n"))
if n == 1 {
list := strings.SplitN(tmps, "\n", 2)
if len(list) == 2 {
tmps = list[1]
}
} else {
list := strings.Split(tmps, "\n")
cmds := strings.Split(cmd, "\n")
for _, v := range cmds {
for k, v2 := range list {
if strings.TrimSpace(v2) == strings.TrimSpace(v) {
list[k] = ""
break
}
}
}
tmps = ""
for _, v := range list {
if v != "" {
tmps += v + "\n"
}
}
tmps = tmps[0 : len(tmps)-1]
}
}
return tmps, this.TrimColor(strings.TrimSpace(string(tmp2))), err
}
func (this *StarShell) GetResult(sleep int) ([]byte, []byte, error) {
@ -224,12 +258,15 @@ func (this *StarSSH) NewShell() (shell *StarShell, err error) {
tmp, _ = shell.Session.StderrPipe()
shell.er = bufio.NewReader(tmp)
err = shell.Session.Shell()
shell.isecho = true
go shell.Session.Wait()
shell.WriteCommand("bash")
shell.WriteCommand("export PS1= ")
shell.WriteCommand("export PS2= ")
go shell.gohub()
time.Sleep(1 * time.Second)
shell.Clear()
shell.Clear()
return
}
@ -354,14 +391,14 @@ func NewSession(client *ssh.Client) (*ssh.Session, error) {
if session, err = client.NewSession(); err != nil {
return nil, err
}
modes := ssh.TerminalModes{
ssh.ECHO: 0, // disable echoing
ssh.ECHO: 1, // 还是要强制开启
//ssh.IGNCR: 0,
ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud
}
if err := session.RequestPty("xterm", 80, 40, modes); err != nil {
if err := session.RequestPty("vt100", 80, 40, modes); err != nil {
return nil, err
}
return session, nil
@ -412,7 +449,7 @@ func Connect(user, password, host, key string, port int, cipherList []string) (*
if len(cipherList) == 0 {
config = ssh.Config{
Ciphers: []string{"aes128-ctr", "aes192-ctr", "aes256-ctr", "aes128-gcm@openssh.com", "arcfour256", "arcfour128", "aes128-cbc", "3des-cbc", "aes192-cbc", "aes256-cbc"},
Ciphers: []string{"aes128-ctr", "aes192-ctr", "aes256-ctr", "aes128-gcm@openssh.com", "arcfour256", "arcfour128", "aes128-cbc", "3des-cbc", "aes192-cbc", "aes256-cbc", "chacha20-poly1305@openssh.com"},
}
} else {
config = ssh.Config{
@ -508,15 +545,15 @@ func FtpTransferOutFunc(localFilePath, remotePath string, bufcap int, rtefunc fu
for {
buf := make([]byte, bufcap)
n, err := srcFile.Read(buf)
num += n
go rtefunc(float64(num) / filebig * 100)
dstFile.Write(buf[:n])
if err == io.EOF {
break
}
if err != nil {
return err
}
num += n
go rtefunc(float64(num) / filebig * 100)
dstFile.Write(buf[:n])
}
return nil
}
@ -559,15 +596,15 @@ func FtpTransferInFunc(src, dst string, bufcap int, rtefunc func(float64), sftpC
for {
buf := make([]byte, bufcap)
n, err := srcFile.Read(buf)
num += n
go rtefunc(float64(num) / filebig * 100)
dstFile.Write(buf[:n])
if err == io.EOF {
break
}
if err != nil {
return err
}
num += n
go rtefunc(float64(num) / filebig * 100)
dstFile.Write(buf[:n])
}
return nil
}

@ -3,21 +3,24 @@ package sshd
import (
"fmt"
"testing"
"time"
)
func TestSSH(t *testing.T) {
myssh := new(StarSSH)
err := myssh.Connect("root", "", "9sday.me", "c:\\id_rsa", 22)
err := myssh.Connect("root", "sakua", "9sday.me", "C:\\id_rsa", 22)
if err != nil {
t.Fatalf("%e", err)
}
shell, err := myssh.NewShell()
if err != nil {
fmt.Println(err)
t.Fatalf("%e", err)
}
shell.isprint = true
time.Sleep(5 * time.Second)
a, b, err := shell.ShellClear("apt update\n", 20000)
shell.isprint = false
fmt.Println(myssh.Exists("/root"))
fmt.Println(myssh.IsFile("/root"))
fmt.Println(myssh.IsFolder("/root"))
a, b, err := shell.ShellClear("whoami", 2000)
fmt.Println(a, b, err)
}

Loading…
Cancel
Save