首页 > 其他分享 >go创建简单远程ssh连接

go创建简单远程ssh连接

时间:2023-04-25 21:36:16浏览次数:32  
标签:sshUser return err nil ssh go sshAddr 远程

package util

import (
"bytes"
"errors"
"fmt"
"github.com/sirupsen/logrus"
"golang.org/x/crypto/ssh"
"strings"
"time"
)

func publicKeyAuthFunc(pemBytes, keyPassword []byte) ssh.AuthMethod {
// Create the Signer for this private key.
signer, err := ssh.ParsePrivateKeyWithPassphrase(pemBytes, keyPassword)
if err != nil {
logrus.WithError(err).Error("parse ssh key from bytes failed")
return nil
}
return ssh.PublicKeys(signer)
}

func SshRemoteRunCommand(sshClient *ssh.Client, command string) (string, error) {
session, err := sshClient.NewSession()
if err != nil {
return "", err
}
defer session.Close()
var buf bytes.Buffer
session.Stdout = &buf
err = session.Run(command)
logString := buf.String()
//logrus.WithField("CMD:", command).Info(logString)
if err != nil {
return logString, fmt.Errorf("CMD: %s OUT: %s ERROR: %s", command, logString, err)
}
return logString, err
}
func NewSshClientConfig(sshUser, sshPassword, sshType, sshKey, sshKeyPassword string) (config *ssh.ClientConfig, err error) {
if sshUser == "" {
return nil, errors.New("ssh_user can not be empty")
}
config = &ssh.ClientConfig{
Timeout: time.Second * 3,
User: sshUser,
HostKeyCallback: ssh.InsecureIgnoreHostKey(), //这个可以, 但是不够安全
//HostKeyCallback: hostKeyCallBackFunc(h.Host),
}
switch sshType {
case "password":
config.Auth = []ssh.AuthMethod{ssh.Password(sshPassword)}
case "key":
config.Auth = []ssh.AuthMethod{publicKeyAuthFunc([]byte(sshKey), []byte(sshKeyPassword))}
default:
return nil, fmt.Errorf("unknow ssh auth type: %s", sshType)
}
return
}
func CreateSimpleSshClient(sshUser, sshPassword, sshAddr string) (*ssh.Client, error) {
if !strings.Contains(sshAddr, ":") {
sshAddr = fmt.Sprintf("%s:22", sshAddr)
}

targetConfig, err := NewSshClientConfig(sshUser, sshPassword, "password", "", "")
if err != nil {
return nil, fmt.Errorf("cluster jumper proxy ssh config failed:%s", err)
}
return ssh.Dial("tcp", sshAddr, targetConfig)
}

标签:sshUser,return,err,nil,ssh,go,sshAddr,远程
From: https://www.cnblogs.com/cheyunhua/p/17353945.html

相关文章

  • Django之视图函数层 (必会三板斧 JsonResponse对象 request对象获取文件 FBV与CBV
    目录视图层之必会三板斧用来处理请求的视图函数都必须返回HttpResponse对象情况一:啥也不返回这里会报一个没有返回HttpResponse对象的错误,由此可见必须要返回一个HttpResponse对象情况二:返回HttpResponse对象点击Ctrl键查看源码可见是HttpResponse类,所以会返回一个值情......
  • Unity】一步跳过Unity启动屏/Logo, 全平台适用,Unity官方API支持
    Unity启动Logo让人非常不爽,因为展示unitylogo非常拖沓,延缓了打开游戏的时间,用0元购版本又怕收到律师函。终于....刷github学习的时候意外发现一段有趣的代码,说是能跳过UnityLogo启动屏:https://github.com/psygames/UnitySkipSplash/blob/main/SkipSplash.cs翻了一下UnityA......
  • mogodb相关信息整理
    1,什么时候需要分片?MongoDB的分片很是火热,但是问题是,我们什么时候才真的需要使用分片呢?当你需要使用到如下的几个标志性的事件时,就意味着该考虑使用分片了!1、你用光了当前机器的磁盘空间2、单个的Mongod已经无法提供你要的写入性能了3、你想把大......
  • 编程实现可靠数据传输原理 Go-Back-N
    1.编写接收端代码接收端模拟网络环境较差时情况,每次生成一个随机数,小于0.8时不丢包,大于0.8时丢包。接收数据格式:编号+空格+内容返回数据格式:丢包:Loss+空格+编号未丢包:ACK+空格+编号接收包非累计计数时不做处理。2.编写发送端代码发送端较为复杂,分为两个线程:发送线程:设......
  • Django之路由层 (有名和无名分组 反向解析 路由分发 名称空间)
    目录一、路由匹配django2.X及以上path第一个参数写什么就匹配什么django1.X第一个参数是正则表达式PS:无论什么版本django都自带加斜杠后缀的功能也可以取消,这里如果在浏览器地址栏没有写完整的/index/,而是/index,这里还是可以找到的,因为Django会帮你二次查找,浏览器会有303......
  • Go
    今日内容1go语言变量类型#数字#int整数有正负int8int16int32int64 java byteshortintlong -int8一个字节表示(8个比特位)范围:-2的7次方到+2的7次方-1-int162个字节表范围:-2的15次方到+2的15次方-1-同理以此类推......
  • go语言变量类型、常量、函数基础、函数高级
    目录1go语言变量类型2常量3函数基础4函数高级1go语言变量类型#数字#int整数有正负int8int16int32int64 java byteshortintlong -int8一个字节表示(8个比特位)范围:-2的7次方到+2的7次方-1-int162个字节表范围:-2的15次方......
  • go语言time.Timer
    go语言time.TimerTimer是一个一次性的定时器,经过指定的时间后将会触发一个时间,通知调用的goroutine使用方法funcmain(){ timer:=time.NewTimer(3*time.Second) for{ select{ caset:=<-timer.C: fmt.Println(t) return } }}数据结构Timer//The......
  • 3 go语言变量类型
    目录3go语言变量类型1数字1.1int、int8、int16、int32、int641.2uint、uint8、uint16、uint32、uint641.3浮点型1.4复数1.5byte和rune2字符串3布尔类型4常量5iota常量生成器(1)定义规则6语句块、可见规则、作用域范围6.1语句块6.2可见行规则6.3作用域范围(1)全局变量(2......
  • Django框架——路由分发、名称空间、虚拟环境、视图层三板斧、JsonResponse对象、requ
    路由分发#Django支持每个应用都可以有自己独立的路由层、静态文件、模版层。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起多个应用都有很多路由与视图函数的对应关系这个时候可以拆分到各自的路由层中使用路由分发之前总路由直接是路由与视图......