This commit is contained in:
谢小军
2020-05-26 17:39:14 +08:00
parent eb574b852a
commit bcbe69aa5a
4 changed files with 58 additions and 31 deletions

3
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"go.inferGopath": false
}

View File

@@ -39,21 +39,6 @@ func New(ip string, username string, password string, port ...int) (*Cli, error)
return cli, cli.connect() 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脚本命令 // Run 执行 shell脚本命令
func (c Cli) Run(shell string) (string, error) { func (c Cli) Run(shell string) (string, error) {
session, err := c.newSession() session, err := c.newSession()
@@ -118,7 +103,38 @@ func (c Cli) EnterTerminal() error {
} }
defer session.Close() 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 完全进入终端 // Enter 完全进入终端
@@ -129,17 +145,12 @@ func (c Cli) Enter(w io.Writer, r io.Reader) error {
} }
defer session.Close() 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()) fd := int(os.Stdin.Fd())
oldState, err := terminal.MakeRaw(fd) // oldState, err := terminal.MakeRaw(fd)
if err != nil { // if err != nil {
return err // return err
} // }
defer terminal.Restore(fd, oldState) // defer terminal.Restore(fd, oldState)
session.Stdout = w session.Stdout = w
session.Stderr = os.Stdin session.Stderr = os.Stdin
@@ -186,3 +197,18 @@ func (c *Cli) connect() error {
c.client = sshClient c.client = sshClient
return nil 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
}

View File

@@ -23,14 +23,11 @@ func NewReader() *MyReader {
} }
func (r *MyReader) Read(p []byte) (n int, err error) { func (r *MyReader) Read(p []byte) (n int, err error) {
fmt.Println("into Read...")
fmt.Println("=======:", string(p))
cmd := <-r.channel cmd := <-r.channel
tmp := []byte(cmd + "\n") tmp := []byte(cmd + "\n")
for i, v := range tmp { for i, v := range tmp {
p[i] = v p[i] = v
} }
fmt.Println("leave Read.")
return len(tmp), err return len(tmp), err
} }
@@ -51,9 +48,7 @@ func (r *MyReader) ListenStdin() {
arg = " " + arg arg = " " + arg
} }
fmt.Println("yes:::::", str+arg)
if atomic.LoadInt32(&r.isClose) == 1 { if atomic.LoadInt32(&r.isClose) == 1 {
fmt.Println("outtttttt")
break break
} else { } else {
r.channel <- str + arg r.channel <- str + arg

View File

@@ -37,6 +37,9 @@ func (w *MyWriter) Run() {
go func() { go func() {
for res := range w.channel { for res := range w.channel {
fmt.Print(res) fmt.Print(res)
// 以下去掉命令行显示
// index := strings.Index(res, "\n")
// fmt.Print(res[index+1:])
} }
}() }()
} }