首页 > 其他分享 >go 使用ssh远程连接服务器并执行命令

go 使用ssh远程连接服务器并执行命令

时间:2023-03-04 14:36:50浏览次数:31  
标签:执行命令 string err cliConf session ssh go root

package main

import (
	"fmt"
	"log"
	"net"
	"time"

	"golang.org/x/crypto/ssh"
)

// 连接的配置
type ClientConfig struct {
	Host       string      //ip
	Port       int64       // 端口
	Username   string      //用户名
	Password   string      //密码
	Client     *ssh.Client //ssh client
	LastResult string      //最近一次运行的结果
}

func (cliConf *ClientConfig) createClient(host string, port int64, username, password string) {
	var (
		client *ssh.Client
		err    error
	)
	cliConf.Host = host
	cliConf.Port = port
	cliConf.Username = username
	cliConf.Password = password
	cliConf.Port = port
	//一般传入四个参数:user,[]ssh.AuthMethod{ssh.Password(password)}, HostKeyCallback,超时时间,
	config := ssh.ClientConfig{
		User: cliConf.Username,
		Auth: []ssh.AuthMethod{ssh.Password(password)},
		HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
			return nil
		},
		Timeout: 10 * time.Second,
	}
	addr := fmt.Sprintf("%s:%d", cliConf.Host, cliConf.Port)
	//获取client
	if client, err = ssh.Dial("tcp", addr, &config); err != nil {
		log.Fatalln("error occurred:", err)
	}
	cliConf.Client = client
}
func (cliConf *ClientConfig) RunShell(shell string) string {
	var (
		session *ssh.Session
		err     error
	)
	//获取session,这个session是用来远程执行操作的
	if session, err = cliConf.Client.NewSession(); err != nil {
		log.Fatalln("error occurred:", err)
	}
	//执行shell
	if output, err := session.CombinedOutput(shell); err != nil {
		log.Fatalln("error occurred:", err)
	} else {
		cliConf.LastResult = string(output)
	}
	return cliConf.LastResult
}
func main() {
	cliConf := new(ClientConfig)
	cliConf.createClient("10.0.0.30", 22, "root", "111111")
	/*
		可以看到我们这里每次执行一条命令都会创建一条session
		这是因为一条session默认只能执行一条命令
		并且两条命令不可以分开写
		比如:
		cliConf.RunShell("cd /opt")
		cliConf.RunShell("ls")
		这两条命令是无法连续的,下面的ls查看的依旧是~目录
		因此我们可以连着写,使用;分割
	*/
	fmt.Println(cliConf.RunShell("cd /opt; ls -l;pwd"))
	fmt.Println(cliConf.RunShell("pwd"))
	fmt.Println(cliConf.RunShell("ps -ef | grep 22"))
	/*
		total 20
		drwxr-xr-x 3 root root 4096 Nov 18 14:05 hadoop
		drwxr-xr-x 3 root root 4096 Nov 18 14:20 hive
		drwxr-xr-x 3 root root 4096 Nov 18 15:07 java
		drwxr-xr-x 3 root root 4096 Nov  4 23:01 kafka
		drwxr-xr-x 3 root root 4096 Nov  4 22:54 zookeeper
	*/
	fmt.Println(cliConf.LastResult)
}

标签:执行命令,string,err,cliConf,session,ssh,go,root
From: https://www.cnblogs.com/guangdelw/p/17178226.html

相关文章

  • go打印字符串
    packagemainimport( "fmt" "os")typepointstruct{ x,yint}funcmain(){ p:=point{1,2} fmt.Printf("001>>%v\n",p)//=>......
  • go的字符简单转换,注意 string(65)获取到的是字符在ascii中位置对应数字的zh
    packagemainimport( "fmt" "strconv")funcmain(){ //Go语言中不允许隐式转换,所有类型转换必须显式声明(强制转换),而且转换只能发生在两种相互兼容的类型之间。 ......
  • golang的指针变量,智商声明没有赋值,不能直接 *p=123之类的
    packagemainimport"fmt"funcmain(){ //申明指针的时候,如果没有指向某个变量,默认值为nil //不能直接进行操作,包括读写 //而用new返回的是有默认值的指针,为数据......
  • GoLand控制台显示无效内容太多,设置控制台折叠多余信息
    参考自:https://blog.csdn.net/qq_40607566/article/details/1231787311.在GoLand上方菜单栏点击Help->FindAction或者ctrl+shift+a2.单击FindAction,输入Registry3.......
  • go的defer里面recover和panic
    packagemainimport"fmt"funcmain(){ /* panic:词义"恐慌", recover:"恢复" go语言利用panic(),recover(),实现程序中的极特殊的异常的处理 panic(),让当前的......
  • Win10开启OpenSSH
    Win10开启OpenSSH打开设置------应用------可选功能------添加功能------找到OpenSSH、OpenSSH选择安装就可以了。这样就算是安装成功了安装完成后验证以......
  • 服务器 OpenSSH 实现免密码连接
    这个云服务器安装可把我给坑到了。CentOS版本不一样可能会有所区别,我使用的CentOS8.0,系统自带openssh-clients和openssh-server,而有的版本只默认开启clients服务。安装的......
  • go的闭包捕获变量
    packagemainimport( "fmt")funcA()int{ variint deferfunc(){ i++ fmt.Println("deferfuncA",i) }() fmt.Println("funcA",i) returni}func......
  • Study for Go ! Chapter two - Expression
    StudyforGo!Chaptertwo-Expression1.Keyword   Golang仅有25个保留关键字,体现了golang语法规则的简洁性保留关键字不能用作常量、变量、函数名......
  • linux修改ssh默认端口
    1.登录服务器,打开sshd_config文件vim/etc/ssh/sshd_config2.找到#Port22,默认是注释掉的,先把前面的#号去掉,再插入一行设置成你想要的端口号,注意不要跟现有端口号......