怎么使用去语言实现远程执行命令

  介绍

小编给大家分享一下怎么使用去语言实现远程执行命令,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

<强>一般命令

所谓一般命令,就是在一定时间内会执行完的命令。比如grep,猫等等。执行命令的步骤是:连接,执行,获取结果

<强>连接

连接包含了认证,可以使用密码或者sshkey 2种方式来认证。下面的示例为了简单,使用了密码认证的方式来完成连接。

import  (,   ,“fmt"   ,“time"      ,“;golang.org/x/crypto/ssh"   )      func 连接(用户,密码,host 字符串,port  int), (* ssh.Session,,错误),{,   ,var  (   ,auth  [] ssh.AuthMethod   ,addr 字符串   clientConfig  * ssh.ClientConfig   client  * ssh.Client   session  * ssh.Session   ,err 错误   ,)   ,//get  auth 方法=,auth 使([]ssh.AuthMethod,, 0)=,auth 附加(auth, ssh.Password(密码))=,clientConfig , ssh.ClientConfig {   ,用户:用户,   ,身份验证:身份验证,   ,超时:30,*,time.Second,   ,}      ,//connet 用ssh=,,addr  fmt.Sprintf (“% s: % d",,主机,端口)      ,if 客户端,err =, ssh.Dial (addr,“tcp",, clientConfig);, err  !=, nil  {   ,return  nil,犯错   ,}      ,//create 会话   ,if 会话,err =, client.NewSession ();, err  !=, nil  {   ,return  nil,犯错   ,}      ,return 会话,nil   }

连接的方法很简单,只要提供登录主机的用户* *密码* *主机名或者IP * * SSH端口

<强>执行,命令获取结果

连接成功后,执行命令很简单

import  (,   ,“fmt"   ,“log"   ,“os"   ,“time"      ,“;golang.org/x/crypto/ssh"   )      func  main (), {,   ,会话,err :=,连接(“root",,“xxxxx",,“127.0.0.1",, 22)   ,if  err  !=, nil  {   ,log.Fatal (err)   ,}   ,defer  session.Close ()      ,session.Run (“ls /;, ls /abc")   }

上面代码运行之后,虽然命令正常执行了,但是没有正常输出的结果,也没有异常输出的结果。要想显示结果,需要将会话的Stdout和Stderr重定向修改函数主要为如下:

func 主要(),{,   ,会话,err :=,连接(“root",,“xxxxx",,“127.0.0.1",, 22)   ,if  err  !=, nil  {   ,log.Fatal (err)   ,}   ,defer  session.Close ()=,session.Stdout  os.Stdout=,session.Stderr  os.Stderr   ,session.Run (“ls /;, ls /abc")   }

这样就能在屏幕上显示正常,异常的信息了。

<强>交互式命令

上面的方式无法远程执行交互式命令,比如,远程编辑一个文件,比如<代码> vi/etc/nginx/nginx.设计> func 主要(),{,   ,会话,err :=,连接(“root",,“olordjesus",,“dockers.iotalabs.io",, 2210)   ,if  err  !=, nil  {   ,log.Fatal (err)   ,}   ,defer  session.Close ()      ,fd :=, int (os.Stdin.Fd ())   ,oldState, err :=, terminal.MakeRaw (fd)   ,if  err  !=, nil  {   ,恐慌(err)   ,}   ,defer  terminal.Restore (fd, oldState)      ,//excute 命令=,session.Stdout  os.Stdout=,session.Stderr  os.Stderr=,session.Stdin  os.Stdin      ,termWidth, termHeight, err :=, terminal.GetSize (fd)   ,if  err  !=, nil  {   ,恐慌(err)   ,}      ,//Set  up  terminal 模式   ,modes :=, ssh.TerminalModes {   ,ssh.ECHO:,, 1,,//enable 呼应   14400年,ssh.TTY_OP_ISPEED:,,//, input  speed =14.4 k波特   14400年,ssh.TTY_OP_OSPEED:,,//, output  speed =14.4 k波特   ,}      ,//Request  pseudo 终端   ,if  err :=, session.RequestPty (“xterm - 256 color",, termHeight,, termWidth,,模式);,err  !=, nil  {   ,log.Fatal (err)   ,}      ,session.Run (“top")   }

好了,这样就可以执行交互式命令了,比如上面最大的也可以通过<强> vi/etc/nginx/nignx.参看之类的命令来远程编辑文件。

怎么使用去语言实现远程执行命令