社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
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 }
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!