Go執行遠程ssh命令
阿新 • • 發佈:2018-01-11
令行 lds 交互 == stp stdin 需要 run ssh命令
使用包:golang.org/x/crypto/ssh
以下封裝一個發送命令的Cli結構體
type Cli struct { IP string //IP地址 Username string //用戶名 Password string //密碼 Port int //端口號 client *ssh.Client //ssh客戶端 LastResult string //最近一次Run的結果 } //創建命令行對象 //@param ip IP地址 //@param username 用戶名 //@param password 密碼 //@param port 端口號,默認22 func New(ip string, username string, password string, port ...int) *Cli { cli := new(Cli) cli.IP = ip cli.Username = username cli.Password = password if len(port) <= 0 { cli.Port = 22 } else { cli.Port = port[0] } return cli } //執行shell //@param shell shell腳本命令 func (c Cli) Run(shell string) (string, error) { if c.client == nil { if err := c.connect(); err != nil { return "", err } } session, err := c.client.NewSession() if err != nil { return "", err } defer session.Close() buf, err := session.CombinedOutput(shell) c.LastResult = string(buf) return c.LastResult, err }
測試執行shell代碼
cli := New("IP", "用戶名", "密碼", 端口號) output, err := cli.Run("free -h") fmt.Printf("%v\n%v", output, err)
還有類似top或者vim的命令是需要交互的,可以利用包golang.org/x/crypto/ssh/terminal實現
再封裝一個方法RunTerminal
//執行帶交互的命令 func (c *Cli) RunTerminal(shell string, stdout, stderr io.Writer) error { if c.client == nil { if err := c.connect(); err != nil { return err } } session, err := c.client.NewSession() if err != nil { return err } defer session.Close() fd := int(os.Stdin.Fd()) oldState, err := terminal.MakeRaw(fd) if err != nil { panic(err) } defer terminal.Restore(fd, oldState) session.Stdout = stdout session.Stderr = stderr session.Stdin = os.Stdin termWidth, termHeight, err := terminal.GetSize(fd) if err != nil { panic(err) } // Set up terminal modes modes := ssh.TerminalModes{ ssh.ECHO: 1, // enable echoing ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud } // Request pseudo terminal if err := session.RequestPty("xterm-256color", termHeight, termWidth, modes); err != nil { return err } session.Run(shell) return nil }
測試RunTerminal方法
cli := New("IP", "用戶名", "密碼", 端口號)
cli.RunTerminal("top", os.Stdout, os.Stdin)
Go執行遠程ssh命令