golang 遠程傳輸檔案

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
                                                                                                     

概述

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

本文來自:部落格園

感謝作者:wang_yb

查看原文:golang 遠程傳輸檔案




查看原文:http://www.zoues.com/2016/10/20/golang-%e8%bf%9c%e7%a8%8b%e4%bc%a0%e8%be%93%e6%96%87%e4%bb%b6/
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.