feat: ssh包新增本地私钥连接免密效果
This commit is contained in:
@@ -4,10 +4,13 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"os"
|
||||||
|
"os/user"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"be.ems/src/framework/logger"
|
||||||
gossh "golang.org/x/crypto/ssh"
|
gossh "golang.org/x/crypto/ssh"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -15,7 +18,7 @@ import (
|
|||||||
type ConnSSH struct {
|
type ConnSSH struct {
|
||||||
User string `json:"user"` // 主机用户名
|
User string `json:"user"` // 主机用户名
|
||||||
Addr string `json:"addr"` // 主机地址
|
Addr string `json:"addr"` // 主机地址
|
||||||
Port int `json:"port"` // SSH端口
|
Port int64 `json:"port"` // SSH端口
|
||||||
AuthMode string `json:"authMode"` // 认证模式(0密码 1主机私钥)
|
AuthMode string `json:"authMode"` // 认证模式(0密码 1主机私钥)
|
||||||
Password string `json:"password"` // 认证密码
|
Password string `json:"password"` // 认证密码
|
||||||
PrivateKey string `json:"privateKey"` // 认证私钥
|
PrivateKey string `json:"privateKey"` // 认证私钥
|
||||||
@@ -59,6 +62,7 @@ func (c *ConnSSH) NewClient() (*ConnSSH, error) {
|
|||||||
signer, err = gossh.ParsePrivateKey([]byte(c.PrivateKey))
|
signer, err = gossh.ParsePrivateKey([]byte(c.PrivateKey))
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
logger.Errorf("NewClient parse private key => %s", err.Error())
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
config.Auth = []gossh.AuthMethod{gossh.PublicKeys(signer)}
|
config.Auth = []gossh.AuthMethod{gossh.PublicKeys(signer)}
|
||||||
@@ -68,6 +72,7 @@ func (c *ConnSSH) NewClient() (*ConnSSH, error) {
|
|||||||
|
|
||||||
client, err := gossh.Dial(proto, addr, config)
|
client, err := gossh.Dial(proto, addr, config)
|
||||||
if nil != err {
|
if nil != err {
|
||||||
|
logger.Errorf("NewClient dial => %s", err.Error())
|
||||||
return c, err
|
return c, err
|
||||||
}
|
}
|
||||||
c.Client = client
|
c.Client = client
|
||||||
@@ -81,6 +86,33 @@ func (c *ConnSSH) Close() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewClientByLocalPrivate 创建SSH客户端-本地私钥(~/.ssh/id_rsa)直连
|
||||||
|
//
|
||||||
|
// ssh.ConnSSH{
|
||||||
|
// User: "user",
|
||||||
|
// Addr: "192.168.x.x",
|
||||||
|
// Port: body.Port,
|
||||||
|
// }
|
||||||
|
func (c *ConnSSH) NewClientByLocalPrivate() (*ConnSSH, error) {
|
||||||
|
c.Port = 22
|
||||||
|
c.AuthMode = "1"
|
||||||
|
usr, err := user.Current()
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("NewClientByLocal get current user => %s", err.Error())
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 读取用户默认的私钥文件
|
||||||
|
keyPath := fmt.Sprintf("%s/.ssh/id_rsa", usr.HomeDir)
|
||||||
|
key, err := os.ReadFile(keyPath)
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("NewClientByLocal [%s] read private key => %s", usr.Username, err.Error())
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
c.PrivateKey = string(key)
|
||||||
|
return c.NewClient()
|
||||||
|
}
|
||||||
|
|
||||||
// RunCMD 执行单次命令
|
// RunCMD 执行单次命令
|
||||||
func (c *ConnSSH) RunCMD(cmd string) (string, error) {
|
func (c *ConnSSH) RunCMD(cmd string) (string, error) {
|
||||||
if c.Client == nil {
|
if c.Client == nil {
|
||||||
@@ -90,11 +122,14 @@ func (c *ConnSSH) RunCMD(cmd string) (string, error) {
|
|||||||
}
|
}
|
||||||
session, err := c.Client.NewSession()
|
session, err := c.Client.NewSession()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
logger.Errorf("RunCMD failed to create session: => %s", err.Error())
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
defer session.Close()
|
defer session.Close()
|
||||||
buf, err := session.CombinedOutput(cmd)
|
buf, err := session.CombinedOutput(cmd)
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("RunCMD failed run command: => %s", err.Error())
|
||||||
|
}
|
||||||
c.LastResult = string(buf)
|
c.LastResult = string(buf)
|
||||||
return c.LastResult, err
|
return c.LastResult, err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user