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 mainimport (  "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 mainimport (  "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/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.