介绍
小编给大家分享一下怎么使用去语言实现远程执行命令,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
<强>一般命令强>
所谓一般命令,就是在一定时间内会执行完的命令。比如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.参看强>之类的命令来远程编辑文件。