mirror of
				https://gitee.com/dromara/mayfly-go
				synced 2025-11-04 16:30:25 +08:00 
			
		
		
		
	
		
			
	
	
		
			75 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			75 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package machine
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"bufio"
							 | 
						||
| 
								 | 
							
									"io"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"golang.org/x/crypto/ssh"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type Terminal struct {
							 | 
						||
| 
								 | 
							
									SshSession   *ssh.Session
							 | 
						||
| 
								 | 
							
									StdinPipe    io.WriteCloser
							 | 
						||
| 
								 | 
							
									StdoutReader *bufio.Reader
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// 新建机器ssh终端
							 | 
						||
| 
								 | 
							
								func NewTerminal(cli *Cli) (*Terminal, error) {
							 | 
						||
| 
								 | 
							
									sshSession, err := cli.GetSession()
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									stdoutPipe, err := sshSession.StdoutPipe()
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									stdoutReader := bufio.NewReader(stdoutPipe)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									stdinPipe, err := sshSession.StdinPipe()
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									terminal := Terminal{
							 | 
						||
| 
								 | 
							
										SshSession:   sshSession,
							 | 
						||
| 
								 | 
							
										StdinPipe:    stdinPipe,
							 | 
						||
| 
								 | 
							
										StdoutReader: stdoutReader,
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return &terminal, nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (t *Terminal) Write(p []byte) (int, error) {
							 | 
						||
| 
								 | 
							
									return t.StdinPipe.Write(p)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (t *Terminal) ReadRune() (r rune, size int, err error) {
							 | 
						||
| 
								 | 
							
									return t.StdoutReader.ReadRune()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (t *Terminal) Close() error {
							 | 
						||
| 
								 | 
							
									if t.SshSession != nil {
							 | 
						||
| 
								 | 
							
										return t.SshSession.Close()
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (t *Terminal) WindowChange(h int, w int) error {
							 | 
						||
| 
								 | 
							
									return t.SshSession.WindowChange(h, w)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (t *Terminal) RequestPty(term string, h, w int) error {
							 | 
						||
| 
								 | 
							
									modes := ssh.TerminalModes{
							 | 
						||
| 
								 | 
							
										ssh.ECHO:          1,
							 | 
						||
| 
								 | 
							
										ssh.TTY_OP_ISPEED: 14400,
							 | 
						||
| 
								 | 
							
										ssh.TTY_OP_OSPEED: 14400,
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return t.SshSession.RequestPty(term, h, w, modes)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (t *Terminal) Shell() error {
							 | 
						||
| 
								 | 
							
									return t.SshSession.Shell()
							 | 
						||
| 
								 | 
							
								}
							 |