概述

之前有一篇介绍如何使用 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/

golang 远程传输文件的更多相关文章

  1. golang sftp传输文件

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

  2. blfs(systemd版本)学习笔记-安装lrzsz软件包实现ssh远程传输文件到lfs系统

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 安装lrzsz软件包实现ssh远程传输文件到lfs系统 这个软件包在lfs系列的书中没有,这里是参照lrzsz官网的说明进行编译 ...

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

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

  4. 远程传输文件命令:scp

    1.概述 scp(secure copy)是一个基于 SSH 协议在网络之间进行安全传输的命令,其格式为“scp [参数] 本地文件 远程帐户@远程 IP 地址:远程目录”. 与第 2 章讲解的 cp ...

  5. SCP远程传输文件

    今天想用SCP通过局域网传输文件到服务器,但却发生了下面这种事情: 上面描述 连接主机端口22被拒绝,失去连接 后发现因为没有指定端口,我服务器这边改了端口,所以根据自己情况改一下命令 scp -29 ...

  6. python通过sftp远程传输文件

    python提供了一个第三方模块paramiko,通过这个模块可以实现两台机器之间的网络连接,sftp是paramiko的一个方法,使用sftp可以在两台机器之间互相传输 拷贝文件.然而paramik ...

  7. scp远程传输文件和ssh远程连接

    ssh使用方法 如果从一台linux服务器通过ssh远程登录到另一台Linux机器, 这种情况通常会在多台服务器的时候用到. 如用root帐号连接一个IP为192.168.1.102的机器,输入:“  ...

  8. secureCRT 在本地和远程传输文件方式

    securecrt 按下ALT+P就开启新的会话 进行ftp操作.输入:help命令,显示该FTP提供所有的命令          pwd:  查询linux主机所在目录(也就是远程主机目录)     ...

  9. nc,远程传输文件

    linux互传文件nc命令   使用nc命令可以很快的在两台主机传递文件,且不需要在同一网段,只要设置好端口即可. 一.安装(CentOS下) yum install -y nc  (需要root权限 ...

随机推荐

  1. js事件委托,可以使新添加的元素具有事件(event运用)

    miaov视频教程  http://study.163.com/course/courseMain.htm?courseId=231002 <!DOCTYPE html PUBLIC " ...

  2. mysql之触发器入门

    触发器语法: CREATE TRIGGER <触发器名称>  --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.{ BEFORE |  ...

  3. Mysql命令行中文乱码的解决方法

    环境:Windows 8 64位,Mysql  5.0.96 for Win64 (x86) 数据库本身安装时默认已经是使用utf8编码的了,但在命令行中执行查询时,查询到的中文依然乱码,解决方法如下 ...

  4. IP验证

    function isIP(str) { var IP = '(25[0-5]|2[0-4]\\d|1\\d\\d|\\d\\d|\\d)'; var IPdot = IP + '\\.'; var ...

  5. Activity生命周期(一) 暨 帮助文档的使用

    --------siwuxie95 首先创建一个ActivityLifeCircle 选择API:21   Android 5.0  (截止目前:2016/12/21,承上启下,兼容更好) 选择空活动 ...

  6. EditText的一些属性及用法

    EditText的一些属性及用法设置当EditText获得焦点时把文本框的内容全选中android:selectAllOnFocus="true"设置某个EditText默认获得焦 ...

  7. 评估Divide and Conquer算法时间复杂度的几种策略

    算法导论的第四章对于divide-conquer进行了阐述, 感觉这本书特别在,实际给出的例子并不多,更多其实是一些偏向数学性质的分析, 最重要的是告诉你该类算法分析的一般性策略. 估计 首先是估计算 ...

  8. db2 进程

    DB2 通用数据库进程全接触 Dwaine Snow, DB2 UDB 和 Informix IDS 产品经理, IBM 多伦多实验室 Dwaine Snow 是 DB2 UDB 分区数据库以及查询巡 ...

  9. git 常用技巧

    撤销修改 撤销本地修改 git reset --hard 或者 git checkout -- . 切换分支 切换到前一分支 git checkout - 切换到某个分支 git checkout & ...

  10. net 连mysql奇怪问题

    程序出现以上提示,采用6.3.5的connetor就好了.