概述

之前有一篇介绍如何使用 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.AuthMethodaddr         stringclientConfig *ssh.ClientConfigsshClient    *ssh.ClientsftpClient   *sftp.Clienterr          error)// get auth methodauth = make([]ssh.AuthMethod, 0)auth = append(auth, ssh.Password(password))clientConfig = &ssh.ClientConfig{User:    user,Auth:    auth,Timeout: 30 * time.Second,}// connet to sshaddr = fmt.Sprintf("%s:%d", host, port)if sshClient, err = ssh.Dial("tcp", addr, clientConfig); err != nil {return nil, err}// create sftp clientif sftpClient, err = sftp.NewClient(sshClient); err != nil {return nil, err}return sftpClient, nil
}

发送文件

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

package mainimport ("fmt""log""os""path""time""github.com/pkg/sftp""golang.org/x/crypto/ssh"
)func main() {var (err        errorsftpClient *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 mainimport ("fmt""log""os""path""time""github.com/pkg/sftp""golang.org/x/crypto/ssh"
)func main() {var (err        errorsftpClient *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/

转载于:https://www.cnblogs.com/wang_yb/p/5741401.html

golang 远程传输文件相关推荐

  1. golang sftp传输文件

    之前有一篇介绍如何使用 golang 通过SSH协议来执行远程命令:golang执行远程命令 同样,通过SSH协议也可以使用 golang 来远程传输文件. 除了 SSH 的库,为了传输文件,还需要用 ...

  2. Linux远程传输文件免密码

    首先为什么Linux远程传输要免密码? 手动使用scp命令传输每次都要输密码太过麻烦了. 开发中有一句话,能复制粘贴尽量不要手打. 运维中有一句话,能脚本化实现尽量不要手动执行. 远程传输文件免密码的 ...

  3. 自己实现远程传输文件类

    标题 自己实现远程传输文件类 MyScp.java package com;public class MyScp {public static void main(String[] args) {ne ...

  4. linux scp传输文件权限被拒绝,Linux的远程传输文件scp及出现Permission denied (publickey).lost connection问题解决方法...

    一.Linux的远程传输文件scp使用方法 1.当前Linux系统 --> 远程Linux系统 scp 当前Linux系统文件路径/文件名 远程Linux用户名@IP地址:远程Linux系统文件 ...

  5. 如何向服务器远程传输文件,如何向服务器远程传输文件

    如何向服务器远程传输文件 内容精选 换一换 在本地主机和Windows云服务器上分别安装QQ.exe等工具进行数据传输.使用远程桌面连接mstsc方式进行数据传输.该方式不支持断点续传,可能存在传输中 ...

  6. 向服务器传输文件方法,向服务器远程传输文件

    向服务器远程传输文件 内容精选 换一换 在本地主机和Windows云服务器上分别安装QQ.exe等工具进行数据传输.使用远程桌面连接mstsc方式进行数据传输.该方式不支持断点续传,可能存在传输中断的 ...

  7. VScode远程免密连接树莓派设备,并使用可视化界面(xming)进行代码调试,远程传输文件

    (请一步一步来,大佬随意) 分为四大环节: 1.SSH篇 2.免密连接设置篇 3.文件传输篇 4.可视化界面的安装和使用 SSH篇: 一:本地电脑安装相应的软件 1.前期准备工作:安装好VScode软 ...

  8. scp远程传输文件报错,不是完整文件,not a regular file

    错误信息: scp远程传输文件报错,不是完整文件,not a regular file -- 不是完整文件 解决办法: 如果传输的是文件 scp 文件路径 主机名:$PWD 如果传输的是文件夹 scp ...

  9. Linux常用命令——远程传输文件(scp/rsync)

    Linux服务器可以使用scp和rsync命令来实现远程传输文件. 1. scp命令 scp语法 scp [option] 源文件 目标IP@目录 scp用法举例: eg1:将/tmp/test.lo ...

最新文章

  1. JupyterLab 3.0,极其强大的下一代Notebook!
  2. MySQL安装最后一步apply security settings错误
  3. C++ 函数的引用返回值
  4. abrtd:Executable ‘some execution‘ doesn‘t belong to any package and ProcessUnpackaged is set to ‘no‘
  5. [转]NopCommerce 多数据库方案
  6. 1006 小明与隔壁老王之间不得不说的故事(简单)
  7. RSync实现文件同步备份配置详解
  8. Visual Studio 2013 编译Notepad++源码
  9. Knoll Light Factory 3.2 for Mac 完整汉化版 灯光工厂 for Mac中文版 支持PSCC2019
  10. 五年级英语测试题软件,小学五年级英语测试题
  11. 十行代码替换证件照背景颜色
  12. 访问 github.com 的请求遭到拒绝您未获授权,无法查看此网页解决办法
  13. PS图层混合模式实例详解
  14. android 左右分栏联动布局,自定义页面分栏布局
  15. Python全栈开发-gitgithub快速入门
  16. 微信小程序怎么实现 图片按住一角缩放、旋转、拖拽
  17. mysql 8.0 直方图_MySQL 8.0 中统计信息直方图的尝试
  18. 6-9 计算捐款总量 (10 分)
  19. 线性dp——hdu6578经典dp
  20. 在线直播源码是如何实现短信验证码登录的

热门文章

  1. 数组指针和指针数组,函数指针和指针函数,常量指针和指针常量,常量引用
  2. html设置excel打开新窗口,怎么在excel的大页面上设置第几页第几页的
  3. Apache负载均衡+Tomcat集群
  4. dynamic web module 2.5与2.4
  5. js 里面的键盘事件对应的键码
  6. 1209.1——快速排序算法
  7. 第四次上课 PPT作业
  8. 谁是最好的Coder
  9. cannot be found on object of type xx.CacheExpressionRootObject
  10. 生成二维码接口,前端调用接口将二维码显示在页面上