go语言连接远程服务器 - Go语言中文社区

go语言连接远程服务器


1、go语言通过ssh连接远程服务器执行命令

2、go语言通过sftp连接远程服务器上传和下载文件

3、相关依赖

github.com/pkg/sftp 
golang.org/x/crypto/ssh
github.com/pkg/errors

 

4、所有代码展示

package controllers

import (
       "github.com/astaxie/beego"
       "github.com/pkg/sftp"
       "github.com/astaxie/beego/logs"
       "golang.org/x/crypto/ssh"
       "net"
       "os"
       "path"
)
//根据ip获取sftpClient
func getSftpClientByIp(ip string) (*sftp.Client) {
       logs.Info(ip)
       return getSftpClientBySshClient(getSshClientByIp(ip))
}

//根据sshClient获取sftpClient
func getSftpClientBySshClient(client *ssh.Client) (*sftp.Client) {
       var (
              sftpClient   *sftp.Client
              err error
       )
       // create sftp client
       if sftpClient, err = sftp.NewClient(client); err != nil {
              logs.Error("Failed to NewClient: ", err)
              panic(err)
       }

       return sftpClient
}

//根据ip获取sshClient
func getSshClientByIp(ip string) (*ssh.Client) {
       config := &ssh.ClientConfig{
              User: beego.AppConfig.String("linuxUserName"),
              Auth: []ssh.AuthMethod{
                     ssh.Password(beego.AppConfig.String("linuxPwd")),
              },
              //需要验证服务端,不做验证返回nil就可以,点击HostKeyCallback看源码就知道了
              HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
                     return nil
              },
       }
       client, err := ssh.Dial("tcp", ip + ":" + beego.AppConfig.String("linuxPort"), config)
       if err != nil {
              logs.Error("Failed to dial: ", err)
              panic(err)
       }
       return client
}

//上传文件
func uploadFile(ip string, localFilePath string, remoteDir string) {
       sftpClient := getSftpClientByIp(ip)
       defer sftpClient.Close()
       srcFile, err := os.Open(localFilePath)
       if err != nil {
              logs.Error("Failed to open file : ", err)
              panic(err)
       }
       defer srcFile.Close()
       var remoteFileName = path.Base(localFilePath)
       dstFile, err := sftpClient.Create(path.Join(remoteDir, remoteFileName))
       if err != nil {
              logs.Error("Failed to create file : ", err)
              panic(err)
       }
       defer dstFile.Close()
       buf := make([]byte, 1024)
       for {
              n, _ := srcFile.Read(buf)
              if n == 0 {
                     break
              }
              dstFile.Write(buf)
       }
       logs.Info("copy file to remote server finished!")
}
//下载文件
func downFile(ip string, remoteFilePath string, localDir string) {

       client := getSshClientByIp(ip)

       session, err := client.NewSession()
       if err != nil {
              logs.Error("Failed to NewSession : ", err)
              panic(err)
       }
       defer session.Close()
       session.Run("gzip " + remoteFilePath)
       remoteFilePathGz := remoteFilePath + ".gz";
       sftpClient := getSftpClientBySshClient(client)

       defer sftpClient.Close()    // 用来测试的远程文件路径 和 本地文件夹
       srcFile, err := sftpClient.Open(remoteFilePathGz)
       if err != nil {
              logs.Error("Failed to Open file : ", err)
              panic(err)
       }
       defer srcFile.Close()
       var localFileName = path.Base(remoteFilePathGz)
       dstFile, err := os.Create(path.Join(localDir, localFileName))
       if err != nil {
              logs.Error("Failed to Create file : ", err)
              panic(err)
       }
       defer dstFile.Close()
       if _, err = srcFile.WriteTo(dstFile); err != nil {
              logs.Error("Failed to write file : ", err)
              panic(err)
       }
       session.Run("rm -rf " + remoteFilePathGz)
}
// @router /server/log/down [get]
func (c *ServerLogController) Get() {
       downFile("192.168.31.116","/home/wlogs/catalina_20180720.log","e:/tmp/")
       logs.Info("copy file to remote server finished!")
       c.ServeJSON()
       c.StopRun()
       return
}
// @router /publish/upload [get]
func (c *PublishController) UploadPublish() {
       var localFilePath = "E:/yumengyao/Desktop/hl-p-loans-realname01_catalina_20180720.log/data/tomcat-app/logs/catalina_20180720.log"
       var remoteDir = "/home/wlogs/"
       uploadFile("192.168.31.116",localFilePath,remoteDir)
       logs.Info("copy file to remote server finished!")
       c.ServeJSON()
       c.StopRun()
       return
}
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_15418761/article/details/81347174
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-02 17:59:04
  • 阅读 ( 1103 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢