|
|
|
@ -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
|
|
|
|
|
}
|
|
|
|
|