go语言登录SSH go语言ssh模块

如何用Go语言打造一个高性能MySQL Proxy1、先安装必须的软件包:jdk和ssh:检查java -version ;ssh -version 2、Hadoop安装包: 3、安装和配置:解压安装包,然后进入conf文件夹 , 修改配置文件: Hadoop-env.sh: export JAVA_HOME=“...
如何使用Go语言实现远程执行命令一般命令
所谓一般命令,就是在一定时间内会执行完的命令 。比如 grep, cat 等等 。执行命令的步骤是:连接,执行,获取结果
连接
连接包含了认证 , 可以使用 password 或者 sshkey 2种方式来认证 。下面的示例为了简单,使用了密码认证的方式来完成连接 。
import (
"fmt"
"time"
"golang.org/x/crypto/ssh"
)
func connect(user, password, host string, port int) (*ssh.Session, error) {
var (
auth[]ssh.AuthMethod
addrstring
clientConfig *ssh.ClientConfig
client *ssh.Client
session *ssh.Session
errerror
)
// get auth method
auth = make([]ssh.AuthMethod, 0)
auth = append(auth, ssh.Password(password))
clientConfig = ssh.ClientConfig{
User: user,
Auth: auth,
Timeout: 30 * time.Second,
}
// connet to ssh
addr = fmt.Sprintf("%s:%d", host, port)
if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
return nil, err
}
// create session
if session, err = client.NewSession(); err != nil {
return nil, err
}
return session, nil
}
连接的方法很简单 , 只要提供登录主机的 用户* ,  *密码*,*主机名或者IP*,*SSH端口
执行,命令获取结果
连接成功后,执行命令很简单
import (
"fmt"
"log"
"os"
"time"
"golang.org/x/crypto/ssh"
)
func main() {
session, err := connect("root", "xxxxx", "127.0.0.1", 22)
if err != nil {
log.Fatal(err)
}
defer session.Close()
session.Run("ls /; ls /abc")
}
上面代码运行之后,虽然命令正常执行了 , 但是没有正常输出的结果,也没有异常输出的结果 。要想显示结果 , 需要将 session 的 Stdout 和 Stderr 重定向 修改 func main 为如下:
func main() {
session, err := connect("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")
}
这样就能在屏幕上显示正常,异常的信息了 。
交互式命令
上面的方式无法远程执行交互式命令,比如 top ,远程编辑一个文件,比如 vi /etc/nginx/nginx.conf 如果要支持交互式的命令 , 需要当前的terminal来接管远程的 PTY 。
func main() {
session, err := connect("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 {
panic(err)
}
defer terminal.Restore(fd, oldState)
// excute command
session.Stdout = os.Stdout
session.Stderr = os.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 {
log.Fatal(err)
}
session.Run("top")
}
Ngrok有时很不稳定 , 有什么更好的内网穿透方法?以下内容来自公众号逆锋起笔,关注每日干货及时送达

推荐阅读