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

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

go-scp 庫不工作但 scp 工作正常

go-scp 庫不工作但 scp 工作正常

Go
慕標5832272 2022-11-23 19:58:20
我正在使用 go-scp 并嘗試復制到 solarwinds 服務器(windows 服務器)并等待超時錯誤,而我嘗試命令行 scp 它工作正常。我還發現在 go-scp 庫err := a.Session.Run(fmt.Sprintf("%s -qt %q", a.RemoteBinary, remotePat) 中的CopyPassThru函數中刪除 -q 選項后,沒有等待超時錯誤,但文件在遠程服務器上為空我無法通過命令行 SSH 到 solarwinds 服務器。代碼如下所示package mainimport (    "fmt"    scp "github.com/bramvdbogaerde/go-scp"    "golang.org/x/crypto/ssh"    "os"    "strings"    "time")func main() {    // Use SSH key authentication from the auth package    // we ignore the host key in this example, please change this if you use this library    // create ssh client config    var authParam ssh.AuthMethod    authParam = ssh.Password("1234")    clientConfig := &ssh.ClientConfig{        User: "admin",        Auth: []ssh.AuthMethod{            authParam,        },        HostKeyCallback: ssh.InsecureIgnoreHostKey(),        Timeout:time.Minute,    }    // For other authentication methods see ssh.ClientConfig and ssh.AuthMethod    // Create a new SCP client    client := scp.NewClient("10.154.92.32:22", clientConfig)    // Connect to the remote server    err := client.Connect()    if err != nil {        fmt.Println("Couldn't establish a connection to the remote server ", err)        return    }    // Close client connection after the file has been copied    defer client.Close()    // Finally, copy the file over    // Usage: CopyFile(fileReader, remotePath, permission)    fileString := "testing \n"     myReader := strings.NewReader(fileString)    err = client.CopyFile(myReader, "/test", "0777")    if err != nil {        fmt.Println("Error while copying file ", err)    }}
查看完整描述

1 回答

?
呼如林

TA貢獻1798條經驗 獲得超3個贊

對于對該scp包有問題的任何人(我也有問題),這是一種cat用于傳輸單個文件的解決方法。它只使用ssh包。


這個想法是使用不帶參數的 cat 從標準輸入讀取。在我們的會話對象中,我們提供本地文件作為標準輸入。然后我們將 cat 的輸出通過管道>傳輸到所需的文件。


反向方式類似,這次我們攔截會話對象的標準輸出。我們 cat 遠程文件并將會話的標準輸出復制到我們的本地文件。


這是代碼:


package main


import (

    "bytes"

    "errors"

    "os"


    "golang.org/x/crypto/ssh"

)


func main() {

    config := &ssh.ClientConfig{

        HostKeyCallback: ssh.InsecureIgnoreHostKey(),

        User:            "user",

        Auth:            []ssh.AuthMethod{ssh.Password("password")},

    }

    client, err := ssh.Dial("tcp", "10.0.0.1:22", config)

    if err != nil {

        panic(err)

    }

    defer client.Close()


    err = setFile(client, "local/file", "remote/file")

    if err != nil {

        panic(err)

    }


    err = getFile(client, "remote/file", "local/file")

    if err != nil {

        panic(err)

    }

}


func setFile(client *ssh.Client, from, to string) error {

    f, err := os.Open(from)

    if err != nil {

        return err

    }

    defer f.Close()


    session, err := client.NewSession()

    if err != nil {

        return err

    }

    defer session.Close()


    session.Stdin = f

    var stderr bytes.Buffer

    session.Stderr = &stderr

    err = session.Run("cat > '" + to + "'")

    if err != nil && stderr.Len() > 0 {

        err = errors.New(err.Error() + ": " + string(stderr.Bytes()))

    }

    return err

}


func getFile(client *ssh.Client, from, to string) error {

    f, err := os.Create(to)

    if err != nil {

        return err

    }

    defer f.Close()


    session, err := client.NewSession()

    if err != nil {

        return err

    }

    defer session.Close()


    session.Stdout = f

    var stderr bytes.Buffer

    session.Stderr = &stderr

    err = session.Run("cat '" + from + "'")

    if err != nil && stderr.Len() > 0 {

        err = errors.New(err.Error() + ": " + string(stderr.Bytes()))

    }

    return err

}


查看完整回答
反對 回復 2022-11-23
  • 1 回答
  • 0 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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