golang 远程传输文件
概述
之前有一篇介绍如何使用 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 远程传输文件相关推荐
- golang sftp传输文件
之前有一篇介绍如何使用 golang 通过SSH协议来执行远程命令:golang执行远程命令 同样,通过SSH协议也可以使用 golang 来远程传输文件. 除了 SSH 的库,为了传输文件,还需要用 ...
- Linux远程传输文件免密码
首先为什么Linux远程传输要免密码? 手动使用scp命令传输每次都要输密码太过麻烦了. 开发中有一句话,能复制粘贴尽量不要手打. 运维中有一句话,能脚本化实现尽量不要手动执行. 远程传输文件免密码的 ...
- 自己实现远程传输文件类
标题 自己实现远程传输文件类 MyScp.java package com;public class MyScp {public static void main(String[] args) {ne ...
- linux scp传输文件权限被拒绝,Linux的远程传输文件scp及出现Permission denied (publickey).lost connection问题解决方法...
一.Linux的远程传输文件scp使用方法 1.当前Linux系统 --> 远程Linux系统 scp 当前Linux系统文件路径/文件名 远程Linux用户名@IP地址:远程Linux系统文件 ...
- 如何向服务器远程传输文件,如何向服务器远程传输文件
如何向服务器远程传输文件 内容精选 换一换 在本地主机和Windows云服务器上分别安装QQ.exe等工具进行数据传输.使用远程桌面连接mstsc方式进行数据传输.该方式不支持断点续传,可能存在传输中 ...
- 向服务器传输文件方法,向服务器远程传输文件
向服务器远程传输文件 内容精选 换一换 在本地主机和Windows云服务器上分别安装QQ.exe等工具进行数据传输.使用远程桌面连接mstsc方式进行数据传输.该方式不支持断点续传,可能存在传输中断的 ...
- VScode远程免密连接树莓派设备,并使用可视化界面(xming)进行代码调试,远程传输文件
(请一步一步来,大佬随意) 分为四大环节: 1.SSH篇 2.免密连接设置篇 3.文件传输篇 4.可视化界面的安装和使用 SSH篇: 一:本地电脑安装相应的软件 1.前期准备工作:安装好VScode软 ...
- scp远程传输文件报错,不是完整文件,not a regular file
错误信息: scp远程传输文件报错,不是完整文件,not a regular file -- 不是完整文件 解决办法: 如果传输的是文件 scp 文件路径 主机名:$PWD 如果传输的是文件夹 scp ...
- Linux常用命令——远程传输文件(scp/rsync)
Linux服务器可以使用scp和rsync命令来实现远程传输文件. 1. scp命令 scp语法 scp [option] 源文件 目标IP@目录 scp用法举例: eg1:将/tmp/test.lo ...
最新文章
- JupyterLab 3.0,极其强大的下一代Notebook!
- MySQL安装最后一步apply security settings错误
- C++ 函数的引用返回值
- abrtd:Executable ‘some execution‘ doesn‘t belong to any package and ProcessUnpackaged is set to ‘no‘
- [转]NopCommerce 多数据库方案
- 1006 小明与隔壁老王之间不得不说的故事(简单)
- RSync实现文件同步备份配置详解
- Visual Studio 2013 编译Notepad++源码
- Knoll Light Factory 3.2 for Mac 完整汉化版 灯光工厂 for Mac中文版 支持PSCC2019
- 五年级英语测试题软件,小学五年级英语测试题
- 十行代码替换证件照背景颜色
- 访问 github.com 的请求遭到拒绝您未获授权,无法查看此网页解决办法
- PS图层混合模式实例详解
- android 左右分栏联动布局,自定义页面分栏布局
- Python全栈开发-gitgithub快速入门
- 微信小程序怎么实现 图片按住一角缩放、旋转、拖拽
- mysql 8.0 直方图_MySQL 8.0 中统计信息直方图的尝试
- 6-9 计算捐款总量 (10 分)
- 线性dp——hdu6578经典dp
- 在线直播源码是如何实现短信验证码登录的
热门文章
- 数组指针和指针数组,函数指针和指针函数,常量指针和指针常量,常量引用
- html设置excel打开新窗口,怎么在excel的大页面上设置第几页第几页的
- Apache负载均衡+Tomcat集群
- dynamic web module 2.5与2.4
- js 里面的键盘事件对应的键码
- 1209.1——快速排序算法
- 第四次上课 PPT作业
- 谁是最好的Coder
- cannot be found on object of type xx.CacheExpressionRootObject
- 生成二维码接口,前端调用接口将二维码显示在页面上