最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Go語(yǔ)言實(shí)現(xiàn)遠(yuǎn)程傳輸文件

 更新時(shí)間:2016年08月09日 16:18:54   投稿:daisy  
本文主要介紹如何利用Go語(yǔ)言實(shí)現(xiàn)遠(yuǎn)程傳輸文件的功能,有需要的小伙伴們可以參考學(xué)習(xí)。下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)。

前言

之前有一篇介紹如何使用Go語(yǔ)言通過(guò)SSH協(xié)議來(lái)執(zhí)行遠(yuǎn)程命令:如何使用Go語(yǔ)言實(shí)現(xiàn)遠(yuǎn)程執(zhí)行命令 同樣,通過(guò)SSH協(xié)議也可以使用Go語(yǔ)言來(lái)遠(yuǎn)程傳輸文件。

除了 SSH 的庫(kù),為了傳輸文件,還需要用到 github.com/pkg/sftp 這個(gè)庫(kù)。

實(shí)現(xiàn)方式

廢話(huà)不多說(shuō),直接看代碼。 由于是基于 SSH 協(xié)議實(shí)現(xiàn)的遠(yuǎn)程文件傳輸,所以先創(chuàng)建 SSH 的連接,再創(chuàng)建傳輸文件的 sftp 客戶(hù)端。

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
}

發(fā)送文件

使用上面的 connect 方法創(chuàng)建 sftpClient 后,發(fā)送文件很簡(jiǎn)單。

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
 )

 // 這里換成實(shí)際的 SSH 連接的 用戶(hù)名,密碼,主機(jī)名或IP,SSH端口
 sftpClient, err = connect("root", "rootpass", "127.0.0.1", 22)
 if err != nil {
 log.Fatal(err)
 }
 defer sftpClient.Close()

 // 用來(lái)測(cè)試的本地文件路徑 和 遠(yuǎn)程機(jī)器上的文件夾
 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!")
}

獲取文件

從遠(yuǎn)程機(jī)器上獲取文件的方式略有不同,但也很簡(jiǎn)單。

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
 )

 // 這里換成實(shí)際的 SSH 連接的 用戶(hù)名,密碼,主機(jī)名或IP,SSH端口
 sftpClient, err = connect("root", "rootpass", "127.0.0.1", 22)
 if err != nil {
 log.Fatal(err)
 }
 defer sftpClient.Close()

 // 用來(lái)測(cè)試的遠(yuǎn)程文件路徑 和 本地文件夾
 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!")
}

總結(jié)

上面的例子只是演示了文件傳輸,傳輸文件夾也很簡(jiǎn)單,只是多了遍歷文件夾和創(chuàng)建文件夾的步驟,具體的函數(shù)可以自行查看 sftp 庫(kù)中doc。以上就是Go語(yǔ)言實(shí)現(xiàn)遠(yuǎn)程傳輸文件的全部?jī)?nèi)容,希望本文對(duì)大家學(xué)習(xí)Go語(yǔ)言有所幫助。

相關(guān)文章

  • 一文帶你了解Go中的內(nèi)存對(duì)齊

    一文帶你了解Go中的內(nèi)存對(duì)齊

    一旦涉及到較為底層的編程,特別是與硬件交互,內(nèi)存對(duì)齊是一個(gè)必修的課題,所以這篇文章小編就想來(lái)和大家聊一聊Go語(yǔ)言中的內(nèi)存對(duì)齊,希望對(duì)大家有所幫助
    2023-10-10
  • Go?的入口函數(shù)和包初始化的使用

    Go?的入口函數(shù)和包初始化的使用

    本文主要介紹了Go?的入口函數(shù)和包初始化的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 完美解決beego 根目錄不能訪問(wèn)靜態(tài)文件的問(wèn)題

    完美解決beego 根目錄不能訪問(wèn)靜態(tài)文件的問(wèn)題

    下面小編就為大家?guī)?lái)一篇完美解決beego 根目錄不能訪問(wèn)靜態(tài)文件的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • golang struct, map, json之間的相互轉(zhuǎn)換

    golang struct, map, json之間的相互轉(zhuǎn)換

    本文用于記錄我在 golang 學(xué)習(xí)階段遇到的類(lèi)型轉(zhuǎn)換問(wèn)題,針對(duì)的是 json 、map、struct 之間相互轉(zhuǎn)換的問(wèn)題,感興趣的可以了解一下
    2021-06-06
  • 解決golang中container/list包中的坑

    解決golang中container/list包中的坑

    這篇文章主要介紹了解決golang中container/list包中的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Go數(shù)據(jù)結(jié)構(gòu)之HeapMap實(shí)現(xiàn)指定Key刪除堆

    Go數(shù)據(jù)結(jié)構(gòu)之HeapMap實(shí)現(xiàn)指定Key刪除堆

    這篇文章主要給大家介紹了Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之HeapMap實(shí)現(xiàn)指定Key刪除堆,通過(guò)使用Go語(yǔ)言中的container/heap包,我們可以輕松地實(shí)現(xiàn)一個(gè)優(yōu)先級(jí)隊(duì)列,文中有詳細(xì)的代碼示例講解,需要的朋友可以參考下
    2023-07-07
  • 淺析Golang中float64的精度問(wèn)題

    淺析Golang中float64的精度問(wèn)題

    這篇文章主要來(lái)和大家一起探討一下Golang中關(guān)于float64的精度問(wèn)題,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下
    2023-08-08
  • Go標(biāo)準(zhǔn)庫(kù)常見(jiàn)錯(cuò)誤分析和解決辦法

    Go標(biāo)準(zhǔn)庫(kù)常見(jiàn)錯(cuò)誤分析和解決辦法

    Go語(yǔ)言的標(biāo)準(zhǔn)庫(kù)為開(kāi)發(fā)者提供了豐富且高效的工具,涵蓋了從網(wǎng)絡(luò)編程到文件操作等各個(gè)方面,然而,標(biāo)準(zhǔn)庫(kù)雖好,使用不當(dāng)卻可能適得其反,正所謂"工欲善其事,必先利其器",本文將深入剖析Go標(biāo)準(zhǔn)庫(kù)使用中的常見(jiàn)錯(cuò)誤,幫助開(kāi)發(fā)者避開(kāi)這些坑,寫(xiě)出更加健壯的代碼
    2025-04-04
  • golang批量執(zhí)行任務(wù)的通用模板分享

    golang批量執(zhí)行任務(wù)的通用模板分享

    這篇文章主要為大家詳細(xì)介紹了golang實(shí)現(xiàn)批量執(zhí)行任務(wù)的通用模板,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-11-11
  • 深入了解Go的HttpClient超時(shí)機(jī)制

    深入了解Go的HttpClient超時(shí)機(jī)制

    在寫(xiě)?Go?的過(guò)程中經(jīng)常對(duì)比這Java和GO語(yǔ)言的特性,踩了不少坑,也發(fā)現(xiàn)了不少有意思的地方,今天就來(lái)聊聊?Go?自帶的?HttpClient?的超時(shí)機(jī)制
    2022-11-11

最新評(píng)論

临猗县| 高州市| 古丈县| 新建县| 永宁县| 全椒县| 沙河市| 汕尾市| 横峰县| 阳谷县| 大悟县| 宜章县| 丹江口市| 余姚市| 克什克腾旗| 扶余县| 宁安市| 东乌珠穆沁旗| 南华县| 吐鲁番市| 剑川县| 南充市| 济源市| 呼伦贝尔市| 县级市| 德阳市| 临江市| 靖西县| 宜丰县| 余庆县| 当涂县| 乡宁县| 贵州省| 通许县| 乳源| 盈江县| 德庆县| 科技| 松溪县| 聂拉木县| 连云港市|