From 507a1690bd7e49d665500969c3e4503d16bc3a36 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Thu, 11 Apr 2024 21:04:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20ssh=E6=94=AF=E6=8C=81=E5=85=8D=E8=AE=A4?= =?UTF-8?q?=E8=AF=81=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../network_element/controller/ne_host.go | 63 ++++++++++++------- src/modules/network_element/model/ne_host.go | 2 +- .../network_element/service/ne_info.impl.go | 8 ++- src/modules/ws/controller/ws.go | 10 ++- 4 files changed, 55 insertions(+), 28 deletions(-) diff --git a/src/modules/network_element/controller/ne_host.go b/src/modules/network_element/controller/ne_host.go index 7baca4bd..3aad7628 100644 --- a/src/modules/network_element/controller/ne_host.go +++ b/src/modules/network_element/controller/ne_host.go @@ -167,8 +167,7 @@ func (s *NeHostController) Remove(c *gin.Context) { func (s *NeHostController) Test(c *gin.Context) { language := ctx.AcceptLanguage(c) var body model.NeHost - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil { + if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -176,8 +175,13 @@ func (s *NeHostController) Test(c *gin.Context) { if body.HostType == "ssh" { var connSSH ssh.ConnSSH body.CopyTo(&connSSH) - - client, err := connSSH.NewClient() + var client *ssh.ConnSSH + var err error + if body.AuthMode == "2" { + client, err = connSSH.NewClientByLocalPrivate() + } else { + client, err = connSSH.NewClient() + } if err != nil { // 连接主机失败,请检查连接参数后重试 c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) @@ -213,8 +217,7 @@ func (s *NeHostController) Cmd(c *gin.Context) { HostID string `json:"hostId" binding:"required"` // 主机ID Cmd string `json:"cmd" binding:"required"` // 执行命令 } - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil { + if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -230,8 +233,13 @@ func (s *NeHostController) Cmd(c *gin.Context) { if neHost.HostType == "ssh" { var connSSH ssh.ConnSSH neHost.CopyTo(&connSSH) - - client, err := connSSH.NewClient() + var client *ssh.ConnSSH + var err error + if neHost.AuthMode == "2" { + client, err = connSSH.NewClientByLocalPrivate() + } else { + client, err = connSSH.NewClient() + } if err != nil { // 连接主机失败,请检查连接参数后重试 c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) @@ -278,17 +286,21 @@ func (s *NeHostController) Cmd(c *gin.Context) { func (s *NeHostController) CheckBySSH(c *gin.Context) { language := ctx.AcceptLanguage(c) var body model.NeHost - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil { + if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } var connSSH ssh.ConnSSH body.CopyTo(&connSSH) - // 创建链接SSH客户端 - client, err := connSSH.NewClient() + var client *ssh.ConnSSH + var err error + if body.AuthMode == "2" { + client, err = connSSH.NewClientByLocalPrivate() + } else { + client, err = connSSH.NewClient() + } if err != nil { // 连接主机失败,请检查连接参数后重试 c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) @@ -339,18 +351,22 @@ func (s *NeHostController) CheckBySSH(c *gin.Context) { } // 本地免密创建链接直连 - lcoalConnSSH := ssh.ConnSSH{ - User: body.User, - Addr: body.Addr, - Port: body.Port, - } - lcoalClient, err := lcoalConnSSH.NewClientByLocalPrivate() - if err == nil { + if body.AuthMode == "2" { data["sshLink"] = true } else { - data["sshLink"] = false + lcoalConnSSH := ssh.ConnSSH{ + User: body.User, + Addr: body.Addr, + Port: body.Port, + } + lcoalClient, err := lcoalConnSSH.NewClientByLocalPrivate() + if err == nil { + data["sshLink"] = true + defer lcoalClient.Close() + } else { + data["sshLink"] = false + } } - defer lcoalClient.Close() c.JSON(200, result.OkData(data)) } @@ -361,8 +377,7 @@ func (s *NeHostController) CheckBySSH(c *gin.Context) { func (s *NeHostController) AuthorizedBySSH(c *gin.Context) { language := ctx.AcceptLanguage(c) var body model.NeHost - err := c.ShouldBindBodyWith(&body, binding.JSON) - if err != nil { + if err := c.ShouldBindBodyWith(&body, binding.JSON); err != nil || body.AuthMode == "2" { c.JSON(400, result.CodeMsg(400, i18n.TKey(language, "app.common.err400"))) return } @@ -377,8 +392,8 @@ func (s *NeHostController) AuthorizedBySSH(c *gin.Context) { lcoalClient, err := lcoalConnSSH.NewClientByLocalPrivate() if err == nil { sshLink = true + defer lcoalClient.Close() } - defer lcoalClient.Close() if sshLink { // 连接主机成功,无需重复免密授权认证 c.JSON(200, result.OkMsg(i18n.TKey(language, "neHost.okBySSHLink"))) diff --git a/src/modules/network_element/model/ne_host.go b/src/modules/network_element/model/ne_host.go index a479635b..ba7362b2 100644 --- a/src/modules/network_element/model/ne_host.go +++ b/src/modules/network_element/model/ne_host.go @@ -11,7 +11,7 @@ type NeHost struct { Addr string `json:"addr" gorm:"column:addr" binding:"required"` // 主机地址 Port int64 `json:"port" gorm:"column:port" binding:"required,number,max=65535,min=1"` // SSH端口 User string `json:"user" gorm:"column:user" binding:"required"` // 主机用户名 - AuthMode string `json:"authMode" gorm:"column:auth_mode" binding:"oneof=0 1"` // 认证模式(0密码 1主机私钥) + AuthMode string `json:"authMode" gorm:"column:auth_mode" binding:"oneof=0 1 2"` // 认证模式(0密码 1主机私钥 2已免密) Password string `json:"password" gorm:"column:password"` // 认证密码 PrivateKey string `json:"privateKey" gorm:"column:private_key"` // 认证私钥 PassPhrase string `json:"passPhrase" gorm:"column:pass_phrase"` // 认证私钥密码 diff --git a/src/modules/network_element/service/ne_info.impl.go b/src/modules/network_element/service/ne_info.impl.go index bb428387..3b44020a 100644 --- a/src/modules/network_element/service/ne_info.impl.go +++ b/src/modules/network_element/service/ne_info.impl.go @@ -332,7 +332,13 @@ func (r *NeInfoImpl) NeRunSSHclient(neType, neId string) (*ssh.ConnSSH, error) { var connSSH ssh.ConnSSH neHost.CopyTo(&connSSH) - client, err := connSSH.NewClient() + var client *ssh.ConnSSH + var err error + if neHost.AuthMode == "2" { + client, err = connSSH.NewClientByLocalPrivate() + } else { + client, err = connSSH.NewClient() + } if err != nil { logger.Errorf("NeRunSSHclient NewClient err => %s", err.Error()) return nil, fmt.Errorf("neinfo ssh client new err") diff --git a/src/modules/ws/controller/ws.go b/src/modules/ws/controller/ws.go index 50fd01fa..297b8a01 100644 --- a/src/modules/ws/controller/ws.go +++ b/src/modules/ws/controller/ws.go @@ -144,8 +144,14 @@ func (s *WSController) SSH(c *gin.Context) { // 创建链接SSH客户端 var connSSH ssh.ConnSSH neHost.CopyTo(&connSSH) - client, err := connSSH.NewClient() - if err != nil { + var client *ssh.ConnSSH + var clientErr error + if neHost.AuthMode == "2" { + client, clientErr = connSSH.NewClientByLocalPrivate() + } else { + client, clientErr = connSSH.NewClient() + } + if clientErr != nil { // 连接主机失败,请检查连接参数后重试 c.JSON(200, result.ErrMsg(i18n.TKey(language, "neHost.errByHostInfo"))) return