func sshSession(user, password, host string, port int) (sshSession *ssh.Session, err error) { //参数: 远程服务器用户名, 密码, ip, 端口
sshClient, err := connector(user, password, host, port) //链接ssh
if err != nil {
fmt.Println("链接ssh失败", err)
return
}
if sshSession, err = sshClient.NewSession(); err != nil { //建立客户端
fmt.Println("建立客户端失败", err)
return
}
return
}
func connector(user, password, host string, port int) (sshClient *ssh.Client, err error) {
auth := make([]ssh.AuthMethod, 0)
auth = append(auth, ssh.Password(password))
clientConfig := &ssh.ClientConfig{
User: user,
Auth: auth,
Timeout: 30 * time.Second,
HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
return nil
},
}
addr := host + ":" + strconv.Itoa(port)
sshClient, err = ssh.Dial("tcp", addr, clientConfig) //链接ssh
if err != nil {
fmt.Println("链接ssh失败", err)
return
}
return
}
func main() {
//session, err := go_utils.SshSession("root", "ubZFVU9RSKcTuTZe", "47.107.94.236", 22)
session, err := go_utils.SshSession("root", "Xu765529", "47.92.199.4", 22)
if err != nil {
log.Fatal(err)
}
defer session.Close()
session.Stdout = os.Stdout
session.Stderr = os.Stderr
session.Stdin = os.Stdin
err = session.Run("/usr/local/start.sh") //脚本路径
if err != nil {
fmt.Println(err)
}
}
看一下脚本内容:
在服务器上直接运行脚本:java
hello world 和 2个java的版本号, 然而程序运行的实际状况:服务器
有一个java命令报command not found, 是由于ssh在链接远程的环境变量中不包含可执行文件的路径, 因此要本身加上路径session