当前位置: 移动技术网 > IT编程>脚本编程>Go语言 > 使用Go语言实现远程传输文件

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

2017年12月08日  | 移动技术网IT编程  | 我要评论

前言

之前有一篇介绍如何使用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语言有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网