1 回答

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超3個(gè)贊
對(duì)于對(duì)該scp包有問題的任何人(我也有問題),這是一種cat用于傳輸單個(gè)文件的解決方法。它只使用ssh包。
這個(gè)想法是使用不帶參數(shù)的 cat 從標(biāo)準(zhǔn)輸入讀取。在我們的會(huì)話對(duì)象中,我們提供本地文件作為標(biāo)準(zhǔn)輸入。然后我們將 cat 的輸出通過管道>傳輸?shù)剿璧奈募?/p>
反向方式類似,這次我們攔截會(huì)話對(duì)象的標(biāo)準(zhǔn)輸出。我們 cat 遠(yuǎn)程文件并將會(huì)話的標(biāo)準(zhǔn)輸出復(fù)制到我們的本地文件。
這是代碼:
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
}
- 1 回答
- 0 關(guān)注
- 175 瀏覽
添加回答
舉報(bào)