golang 远程传输文件

u012798391 · · 2692 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
                                                                                                     

概述

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

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

实现方式

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

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 }

发送文件

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

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, err = connect("root", "rootpass", "127.0.0.1", 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!") }

总结

上面的例子只是演示了文件传输,传输文件夹也很简单,只是多了遍历文件夹和创建文件夹的步骤,具体的函数可以自行查看 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/

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:u012798391

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

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:1006366459

2692 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传