diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..a460645 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "go.inferGopath": false +} \ No newline at end of file diff --git a/myssh/myssh.go b/myssh/myssh.go index c201159..73dfefe 100644 --- a/myssh/myssh.go +++ b/myssh/myssh.go @@ -39,21 +39,6 @@ func New(ip string, username string, password string, port ...int) (*Cli, error) return cli, cli.connect() } -// NewSession new session -func (c Cli) newSession() (*ssh.Session, error) { - if c.client == nil { - if err := c.connect(); err != nil { - return nil, err - } - } - session, err := c.client.NewSession() - if err != nil { - return nil, err - } - - return session, nil -} - // Run 执行 shell脚本命令 func (c Cli) Run(shell string) (string, error) { session, err := c.newSession() @@ -118,7 +103,38 @@ func (c Cli) EnterTerminal() error { } defer session.Close() - return c.enterTerminalSession(session, os.Stdout, os.Stdin) + fd := int(os.Stdin.Fd()) + oldState, err := terminal.MakeRaw(fd) + if err != nil { + return err + } + defer terminal.Restore(fd, oldState) + + session.Stdout = os.Stdout + session.Stderr = os.Stdin + session.Stdin = os.Stdin + + termWidth, termHeight, err := terminal.GetSize(fd) + if err != nil { + return err + } + + modes := ssh.TerminalModes{ + ssh.ECHO: 1, + ssh.TTY_OP_ISPEED: 14400, + ssh.TTY_OP_OSPEED: 14400, + } + err = session.RequestPty("xterm-256color", termHeight, termWidth, modes) + if err != nil { + return err + } + + err = session.Shell() + if err != nil { + return err + } + + return session.Wait() } // Enter 完全进入终端 @@ -129,17 +145,12 @@ func (c Cli) Enter(w io.Writer, r io.Reader) error { } defer session.Close() - return c.enterTerminalSession(session, w, r) -} - -// EnterTerminalSession 进入终端 -func (c Cli) enterTerminalSession(session *ssh.Session, w io.Writer, r io.Reader) error { fd := int(os.Stdin.Fd()) - oldState, err := terminal.MakeRaw(fd) - if err != nil { - return err - } - defer terminal.Restore(fd, oldState) + // oldState, err := terminal.MakeRaw(fd) + // if err != nil { + // return err + // } + // defer terminal.Restore(fd, oldState) session.Stdout = w session.Stderr = os.Stdin @@ -186,3 +197,18 @@ func (c *Cli) connect() error { c.client = sshClient return nil } + +// newSession new session +func (c Cli) newSession() (*ssh.Session, error) { + if c.client == nil { + if err := c.connect(); err != nil { + return nil, err + } + } + session, err := c.client.NewSession() + if err != nil { + return nil, err + } + + return session, nil +} diff --git a/myssh/reader.go b/myssh/reader.go index c38f929..4b48ad6 100644 --- a/myssh/reader.go +++ b/myssh/reader.go @@ -23,14 +23,11 @@ func NewReader() *MyReader { } func (r *MyReader) Read(p []byte) (n int, err error) { - fmt.Println("into Read...") - fmt.Println("=======:", string(p)) cmd := <-r.channel tmp := []byte(cmd + "\n") for i, v := range tmp { p[i] = v } - fmt.Println("leave Read.") return len(tmp), err } @@ -51,9 +48,7 @@ func (r *MyReader) ListenStdin() { arg = " " + arg } - fmt.Println("yes:::::", str+arg) if atomic.LoadInt32(&r.isClose) == 1 { - fmt.Println("outtttttt") break } else { r.channel <- str + arg diff --git a/myssh/write.go b/myssh/write.go index 0037a2b..b2a2e1a 100644 --- a/myssh/write.go +++ b/myssh/write.go @@ -37,6 +37,9 @@ func (w *MyWriter) Run() { go func() { for res := range w.channel { fmt.Print(res) + // 以下去掉命令行显示 + // index := strings.Index(res, "\n") + // fmt.Print(res[index+1:]) } }() }