go 远程ssh操作
我的ssh的环境是腾讯云Ubuntu20.04,ssh连接root的时候不成功,应该是/etc/ssh/sshd_config配置文件中root登录的配置没开,具体的我没再去测试,感兴趣的大家可以试试,最后推荐一个项目:github.com/mojocn/feli…
package main
import (
"os"
"fmt"
"golang.org/x/crypto/ssh"
"log"
)
func main() {
// 建立SSH客户端连接
/*
设置超时连接,生成连接客户端
func Dial(network, addr string, config *ClientConfig) (*Client, error) {
conn, err := net.DialTimeout(network, addr, config.Timeout)
if err != nil {
return nil, err
}
c, chans, reqs, err := NewClientConn(conn, addr, config)
if err != nil {
return nil, err
}
return NewClient(c, chans, reqs), nil
}
*/
client, err := ssh.Dial("tcp", "127.0.0.1:22", &ssh.ClientConfig{
User: "lighthouse",
Auth: []ssh.AuthMethod{ssh.Password("123")},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
})
if err != nil {
log.Fatalf("SSH dial error: %s", err.Error())
}
// 建立新会话
session, err := client.NewSession()
if err != nil {
log.Fatalf("new session error: %s", err.Error())
}
defer session.Close()
/*
如果Stdout 被初始化过的时候就报错
func (s *Session) Output(cmd string) ([]byte, error) {
if s.Stdout != nil {
return nil, errors.New("ssh: Stdout already set")
}
var b bytes.Buffer
s.Stdout = &b
最终调用的还是Run()
err := s.Run(cmd)
return b.Bytes(), err
}
*/
result, err := session.Output("ls -al")
if err != nil {
fmt.Fprintf(os.Stdout, "Failed to run command, Err:%s", err.Error())
os.Exit(0)
}
fmt.Println(string(result))
// var b bytes.Buffer
// session.Stdout = &b
// if err := session.Run("ls"); err != nil {
// panic("Failed to run: " + err.Error())
// }
// fmt.Println(b.String())
}
禁用回显,回显就是在终端输入的命令,执行后再显示一遍
package main
import (
"golang.org/x/crypto/ssh"
"log"
"os")
func main() {
// 建立SSH客户端连接
client, err := ssh.Dial("tcp", "127.0.0.1:22", &ssh.ClientConfig{
User: "lighthouse",
Auth: []ssh.AuthMethod{ssh.Password("123")},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
})
if err != nil {
log.Fatalf("SSH dial error: %s", err.Error())
}
// 建立新会话\
session, err := client.NewSession()
defer session.Close()
if err != nil {
log.Fatalf("new session error: %s", err.Error())
}
session.Stdout = os.Stdout // 会话输出关联到系统标准输出设备
session.Stderr = os.Stderr // 会话错误输出关联到系统标准错误输出设备
session.Stdin = os.Stdin // 会话输入关联到系统标准输入设备
modes := ssh.TerminalModes{\
ssh.ECHO: 0, // 禁用回显(0禁用,1启动)
ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
ssh.TTY_OP_OSPEED: 14400, //output speed = 14.4kbaud }
if err = session.RequestPty("linux", 32, 160, modes); err != nil {
log.Fatalf("request pty error: %s", err.Error())
}
if err = session.Shell(); err != nil {
log.Fatalf("start shell error: %s", err.Error())
}
if err = session.Wait(); err != nil {
log.Fatalf("return error: %s", err.Error())
}
}