欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-10 12:18:47
前言 之前有一篇介绍如何使用go语言通过ssh协议来执行远程命令:如何使用go语言实现远程执行命令 同样,通过ssh协议也可以使用go语言来远程传输文件。 除了 s...

前言

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