From 9bff38bd4b1aac164e535767bc67be7b182e427f Mon Sep 17 00:00:00 2001 From: 兔子 Date: Sat, 7 Sep 2019 11:50:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dsftp=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=95=B0=E6=8D=AE=E4=B8=A2=E5=A4=B1=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ssh.go | 61 ++++++++++++++++++++++++++++++++++++++++++----------- ssh_test.go | 13 +++++++----- 2 files changed, 57 insertions(+), 17 deletions(-) diff --git a/ssh.go b/ssh.go index dd727c6..5deaa3b 100644 --- a/ssh.go +++ b/ssh.go @@ -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 } diff --git a/ssh_test.go b/ssh_test.go index f60e45d..457fcec 100644 --- a/ssh_test.go +++ b/ssh_test.go @@ -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) }