加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang 远程传输文件

发布时间:2020-12-16 19:15:33 所属栏目:大数据 来源:网络整理
导读:概述 之前有一篇介绍如何使用 golang 通过SSH协议来执行远程命令:golang 执行远程命令同样,通过SSH协议也可以使用 golang 来远程传输文件。 除了 SSH 的库,为了传输文件,还需要用到 github.com/pkg/sftp 这个库。 实现方式 废话不多说,直接看代码。 由
                                                                                                     

概述

之前有一篇介绍如何使用 golang 通过SSH协议来执行远程命令:golang 执行远程命令同样,通过SSH协议也可以使用 golang 来远程传输文件。

除了 SSH 的库,为了传输文件,还需要用到 github.com/pkg/sftp 这个库。

实现方式

废话不多说,直接看代码。 由于是基于 SSH 协议实现的远程文件传输,所以先创建 SSH 的连接,再创建传输文件的 sftp 客户端。

发送文件

使用上面的 connect 方法创建 sftpClient 后,发送文件很简单。

获取文件

从远程机器上获取文件的方式略有不同,但也很简单。

总结

上面的例子只是演示了文件传输,传输文件夹也很简单,只是多了遍历文件夹和创建文件夹的步骤,具体的函数可以自行查看 sftp 库中doc。

来源:http://blog.iotalabs.io/

本文来自:博客园

感谢作者:wang_yb

查看原文:golang 远程传输文件




查看原文:http://www.zoues.com/2016/10/20/golang-%e8%bf%9c%e7%a8%8b%e4%bc%a0%e8%be%93%e6%96%87%e4%bb%b6/func connect(user,password,host string,port int) (*sftp.Client,error) { var ( auth []ssh.AuthMethod addr string clientConfig *ssh.ClientConfig sshClient *ssh.Client sftpClient *sftp.Client err error ) // get auth method auth = make([]ssh.AuthMethod,0) auth = append(auth,ssh.Password(password)) clientConfig = &ssh.ClientConfig{ User: user,Auth: auth,Timeout: 30 * time.Second,} // connet to ssh addr = fmt.Sprintf("%s:%d",host,port) if sshClient,err = ssh.Dial("tcp",addr,clientConfig); err != nil { return nil,err } // create sftp client if sftpClient,err = sftp.NewClient(sshClient); err != nil { return nil,err } return sftpClient,nil }package main import ( "fmt" "log" "os" "path" "time" "github.com/pkg/sftp" "golang.org/x/crypto/ssh" ) func main() { var ( err error sftpClient *sftp.Client ) // 这里换成实际的 SSH 连接的 用户名,密码,主机名或IP,SSH端口 sftpClient,err = connect("root","rootpass","127.0.0.1",22) if err != nil { log.Fatal(err) } defer sftpClient.Close() // 用来测试的本地文件路径 和 远程机器上的文件夹 var localFilePath = "/path/to/local/file/test.txt" var remoteDir = "/remote/dir/" srcFile,err := os.Open(localFilePath) if err != nil { log.Fatal(err) } defer srcFile.Close() var remoteFileName = path.Base(localFilePath) dstFile,err := sftpClient.Create(path.Join(remoteDir,remoteFileName)) if err != nil { log.Fatal(err) } defer dstFile.Close() buf := make([]byte,1024) for { n,_ := srcFile.Read(buf) if n == 0 { break } dstFile.Write(buf) } fmt.Println("copy file to remote server finished!") }package main import ( "fmt" "log" "os" "path" "time" "github.com/pkg/sftp" "golang.org/x/crypto/ssh" ) func main() { var ( err error sftpClient *sftp.Client ) // 这里换成实际的 SSH 连接的 用户名,密码,主机名或IP,SSH端口 sftpClient,22) if err != nil { log.Fatal(err) } defer sftpClient.Close() // 用来测试的远程文件路径 和 本地文件夹 var remoteFilePath = "/path/to/remote/path/test.txt" var localDir = "/local/dir" srcFile,err := sftpClient.Open(remoteFilePath) if err != nil { log.Fatal(err) } defer srcFile.Close() var localFileName = path.Base(remoteFilePath) dstFile,err := os.Create(path.Join(localDir,localFileName)) if err != nil { log.Fatal(err) } defer dstFile.Close() if _,err = srcFile.WriteTo(dstFile); err != nil { log.Fatal(err) } fmt.Println("copy file from remote server finished!") }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读