使用Go语言实现远程传输文件

 更新时间:2016年08月09日 16:18:54   投稿:daisy  
本文主要介绍如何利用Go语言实现远程传输文件的功能,有需要的小伙伴们可以参考学习。下面跟着小编一起来学习学习。

前言

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

除了 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。以上就是Go语言实现远程传输文件的全部内容,希望本文对大家学习Go语言有所帮助。

相关文章

  • 一文带你了解Go中的内存对齐

    一文带你了解Go中的内存对齐

    一旦涉及到较为底层的编程,特别是与硬件交互,内存对齐是一个必修的课题,所以这篇文章小编就想来和大家聊一聊Go语言中的内存对齐,希望对大家有所帮助
    2023-10-10
  • Go 的入口函数和包初始化的使用

    Go 的入口函数和包初始化的使用

    本文主要介绍了Go 的入口函数和包初始化的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 完美解决beego 根目录不能访问静态文件的问题

    完美解决beego 根目录不能访问静态文件的问题

    下面小编就为大家带来一篇完美解决beego 根目录不能访问静态文件的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • golang struct, map, json之间的相互转换

    golang struct, map, json之间的相互转换

    本文用于记录我在 golang 学习阶段遇到的类型转换问题,针对的是 json 、map、struct 之间相互转换的问题,感兴趣的可以了解一下
    2021-06-06
  • 解决golang中container/list包中的坑

    解决golang中container/list包中的坑

    这篇文章主要介绍了解决golang中container/list包中的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go数据结构之HeapMap实现指定Key删除堆

    Go数据结构之HeapMap实现指定Key删除堆

    这篇文章主要给大家介绍了Go语言数据结构之HeapMap实现指定Key删除堆,通过使用Go语言中的container/heap包,我们可以轻松地实现一个优先级队列,文中有详细的代码示例讲解,需要的朋友可以参考下
    2023-07-07
  • 浅析Golang中float64的精度问题

    浅析Golang中float64的精度问题

    这篇文章主要来和大家一起探讨一下Golang中关于float64的精度问题,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解下
    2023-08-08
  • Go标准库常见错误分析和解决办法

    Go标准库常见错误分析和解决办法

    Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓"工欲善其事,必先利其器",本文将深入剖析Go标准库使用中的常见错误,帮助开发者避开这些坑,写出更加健壮的代码
    2025-04-04
  • golang批量执行任务的通用模板分享

    golang批量执行任务的通用模板分享

    这篇文章主要为大家详细介绍了golang实现批量执行任务的通用模板,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-11-11
  • 深入了解Go的HttpClient超时机制

    深入了解Go的HttpClient超时机制

    在写 Go 的过程中经常对比这Java和GO语言的特性,踩了不少坑,也发现了不少有意思的地方,今天就来聊聊 Go 自带的 HttpClient 的超时机制
    2022-11-11

最新评论