golang 批量scp 遠(yuǎn)程傳輸文件

最近公司遇到一個問題,需要拷貝大量圖片到遠(yuǎn)程機(jī)器上去夏跷。
直接上代碼,

// main.go
package main

import (
    "fmt"
    "log"
    "net"
    "os"
    "path"
    "time"

    "github.com/pkg/sftp"
    "golang.org/x/crypto/ssh"
)
func sshconnect(user, password, host string, port int) (*ssh.Session, error) {
    var (
        auth         []ssh.AuthMethod
        addr         string
        clientConfig *ssh.ClientConfig
        client       *ssh.Client
        session      *ssh.Session
        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 client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
        return nil, err
    }

    // create session
    if session, err = client.NewSession(); err != nil {
        return nil, err
    }

    return session, nil
}

func sftpconnect(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,
              //這個是問你要不要驗證遠(yuǎn)程主機(jī)拓春,以保證安全性亚隅。這里不驗證
        HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
            return nil
        },
    }

    // 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
}


//單個copy
func scpCopy(localFilePath, remoteDir string) error {
    var (
        sftpClient *sftp.Client
        err        error
    )
    // 這里換成實際的 SSH 連接的 用戶名庶溶,密碼懂鸵,主機(jī)名或IP行疏,SSH端口
    sftpClient, err = sftpconnect("user", "passwd", "目的機(jī)器的ip", 目的機(jī)器的端口)
    if err != nil {
        log.Println("scpCopy:", err)
        return err
    }
    defer sftpClient.Close()
    srcFile, err := os.Open(localFilePath)
    if err != nil {
        log.Println("scpCopy:", err)
        return err
    }
    defer srcFile.Close()

    var remoteFileName = path.Base(localFilePath)
    dstFile, err := sftpClient.Create(path.Join(remoteDir, remoteFileName))
    if err != nil {
        log.Println("scpCopy:", err)
        return err
    }
    defer dstFile.Close()

    buf := make([]byte, 1024)
    for {
        n, _ := srcFile.Read(buf)
        if n == 0 {
            break
        }
        dstFile.Write(buf[0:n])
    }
    return nil
}

這里是批量copy

//批量copy
func scpListCopy(cinfos []CouponInfo) error {
    var localFilePath, remoteDir string

    // 這里換成實際的 SSH 連接的 用戶名酿联,密碼,主機(jī)名或IP贞让,SSH端口
    sshftpClient := NewSftpClient()

    // 用來測試的本地文件路徑 和 遠(yuǎn)程機(jī)器上的文件夾
    for _, v := range cinfos {
        for i := 0; i < len(v.Coupons); i++ {
            localFilePath = v.Coupons[i].Addr
            remoteDir = "目的地址"

            srcFile, err := os.Open(localFilePath)
            if err != nil {
                logger.Println("scpListCopy1:", err)
                return err
            }
            defer srcFile.Close()

            var remoteFileName = path.Base(localFilePath)
            dstFile, err := sshftpClient.Create(path.Join(remoteDir, remoteFileName))
            if err != nil {
                logger.Println("scpListCopy2:", err)
                return err
            }
            defer dstFile.Close()

            buf := make([]byte, 1024)
            for {
                n, _ := srcFile.Read(buf)
                if n == 0 {
                    break
                }
                dstFile.Write(buf[0:n])
            }
        }
    }
    return nil
}
/*
NewSftpClient 這個方法喳张,此文件應(yīng)該有個全局變量
var sftpClient *sftp.Client
全局變量,保證不會出現(xiàn)tcp關(guān)閉不掉的錯誤摸航,這個惡心的錯誤就是:
 ssh: unexpected packet in response to channel open: <nil>
*/
func NewSftpClient() *sftp.Client {
    var err error
    if sftpClient == nil {
        sftpClient, err = sftpconnect("duyq", "duyuqing123456", "10.250.129.22", 22)
        if err != nil {
            logger.Fatalln("NewSftpClient:", err)
        }
    }
    return sftpClient
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酱虎,一起剝皮案震驚了整個濱河市擂涛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歼指,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胀茵,死亡現(xiàn)場離奇詭異挟阻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)附鸽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熄浓,“玉大人省撑,你說我怎么就攤上這事俯在⊥薰撸” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵愕提,是天一觀的道長。 經(jīng)常有香客問我皿哨,道長揪荣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任往史,我火速辦了婚禮仗颈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘椎例。我一直安慰自己挨决,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布订歪。 她就那樣靜靜地躺著脖祈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刷晋。 梳的紋絲不亂的頭發(fā)上盖高,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死罐韩,一個胖子當(dāng)著我的面吹牛捌归,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼甥厦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寇钉,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤刀疙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后扫倡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谦秧,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了油够。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚁袭。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡征懈,死狀恐怖石咬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卖哎,我是刑警寧澤鬼悠,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站亏娜,受9級特大地震影響焕窝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜维贺,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一它掂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧溯泣,春花似錦虐秋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肢簿,卻和暖如春靶剑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背池充。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工桩引, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人收夸。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓阐污,卻偏偏與公主長得像,于是被迫代替她去往敵國和親咱圆。 傳聞我的和親對象是個殘疾皇子笛辟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 北京時間10月1日,2017-18賽季季前賽揭幕戰(zhàn)今天正式打響序苏,金州勇士隊主場以102比108不敵勝丹佛掘金手幢。不過...
    coco9981閱讀 387評論 0 2
  • http://blog.csdn.net/david21984/article/details/57451917 ...
    紫色冰雨閱讀 296評論 0 1
  • 由于公司電腦更換,特此記錄下之前保存的記錄 afnetwork封裝: https://github.com/shy...
    chushen61閱讀 694評論 0 2
  • 記得剛買回來的時候綠枝哥哥還是只高冷的龜忱详,就靜靜地趴在那里围来,任燕草弟弟爬上爬下,翻來翻去。所以他叫綠枝监透,弟弟叫燕草...
    臨鳶羨魚閱讀 209評論 0 0
  • 在泰國的七周(自己多玩耍了一周)桶错,有過很多人問我,你為什么選擇做志愿者而不是旅游胀蛮?我的回答一直是:“我想要的是深入...
    744c7e4d4244閱讀 384評論 0 0