亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 go 中通過 SSH 發送文件

在 go 中通過 SSH 發送文件

Go
萬千封印 2023-05-08 15:47:50
我在發布這個問題之前找到了這個答案,但我不清楚答案。這是答案的代碼:conn, err := ssh.Dial("tcp", hostname+":22", config)if err != nil {    return err}session, err := conn.NewSession()if err != nil {    return err}defer session.Close()r, err := session.StdoutPipe()if err != nil {    return err}name := fmt.Sprintf("%s/backup_folder_%v.tar.gz", path, time.Now().Unix())file, err := os.OpenFile(name, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)if err != nil {    return err}defer file.Close()if err := session.Start(cmd); err != nil {    return err}n, err := io.Copy(file, r)if err != nil {    return err}if err := session.Wait(); err != nil {    return err}return nil我不明白 cmd 變量和 io.Copy 之間的關系,它在哪里以及如何知道要復制哪個文件。我喜歡使用 io.Copy 的想法,但我不知道如何通過 ssh 創建文件并開始使用 io.Copy 向它發送內容。
查看完整描述

2 回答

?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

您也可以使用 sftp 包 - “github.com/pkg/sftp”



func SSHCopyFile(srcPath, dstPath string) error {

    config := &ssh.ClientConfig{

        User: "user",

        Auth: []ssh.AuthMethod{

            ssh.Password("pass"),

        },

        HostKeyCallback: ssh.InsecureIgnoreHostKey(),

    }


    client, _ := ssh.Dial("tcp", "remotehost:22", config)

    defer client.Close()



    // open an SFTP session over an existing ssh connection.

    sftp, err := sftp.NewClient(client)

    if err != nil {

        return err

    }

    defer sftp.Close()


    // Open the source file

    srcFile, err := os.Open(srcPath)

    if err != nil {

        return err

    }

    defer srcFile.Close()


    // Create the destination file

    dstFile, err := sftp.Create(dstPath)

    if err != nil {

        return err

    }

    defer dstFile.Close()


    // write to file

    if  _, err := dstFile.ReadFrom(srcFile); err!= nil {

        return err

    }

    return nil

}


然后像這樣稱呼它


SSHCopyFile("/path/to/local/file.txt", "/path/on/remote/file.txt")

這些是必需的包


"github.com/pkg/sftp"

"golang.org/x/crypto/ssh"


查看完整回答
反對 回復 2023-05-08
?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

這是一個關于如何將 Go 作為scp客戶端使用的最小示例:


config := &ssh.ClientConfig{

    User: "user",

    Auth: []ssh.AuthMethod{

        ssh.Password("pass"),

    },

    HostKeyCallback: ssh.InsecureIgnoreHostKey(),

}


client, _ := ssh.Dial("tcp", "remotehost:22", config)

defer client.Close()


session, _ := client.NewSession()

defer session.Close()


file, _ := os.Open("filetocopy")

defer file.Close()

stat, _ := file.Stat()


wg := sync.WaitGroup{}

wg.Add(1)


go func() {

    hostIn, _ := session.StdinPipe()

    defer hostIn.Close()

    fmt.Fprintf(hostIn, "C0664 %d %s\n", stat.Size(), "filecopyname")

    io.Copy(hostIn, file)

    fmt.Fprint(hostIn, "\x00")

    wg.Done()

}()


session.Run("/usr/bin/scp -t /remotedirectory/")

wg.Wait()

請注意,為了簡潔起見,我忽略了所有錯誤。

  1. session.StdinPipe()將為遠程主機創建一個可寫管道。

  2. fmt.Fprintf(... "C0664 ...")0664將用權限、stat.Size()大小和遠程文件名來表示文件的開始filecopyname。

  3. io.Copy(hostIn, file)將 的內容file寫入hostIn.

  4. fmt.Fprint(hostIn, "\x00")將發出文件結束信號。

  5. session.Run("/usr/bin/scp -qt /remotedirectory/")將運行 scp 命令。

編輯:根據 OP 的請求添加等待組


查看完整回答
反對 回復 2023-05-08
  • 2 回答
  • 0 關注
  • 207 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號