2

我已经为此苦苦挣扎了大约一个星期。我已经为 golang 尝试了一个 scp 客户端,但被告知代码已损坏,并且贡献的“固定”代码也无法正常工作。无论如何,我放弃了文件传输并决定只使用 ssh 创建文件并保存在远程机器上。

在进入 scp 路由之前,我在golang中成功运行了 ssh 客户端,所以这可能是一个很好的解决方案。

在 ssh 客户端中,它只执行了“ls”命令,我知道有一个“touch”命令可以创建文件。

var b bytes.Buffer
session.Stdout = &b
if err := session.Run("ls"); err != nil {
    panic("Failed to run: " + err.Error())
}
fmt.Println(b.String())

最终我想要实现的是读取本地文件,可能通过os.Open(localfile)获取它的内容然后使用“touch”命令在远程机器上创建一个新文件,然后对其进行编辑并更早地粘贴本地文件中的内容。或者也许有一个命令可以创建一个新文件并准备好它的内容?

这看起来很有希望,虽然这段代码给了我一个错误,但根据我的观察,这将创建一个名为“testfile”的文件,内容为“123456789\n”,然后我认为使用上传它session.Run("/usr/bin/scp -qrt ./");

    go func() {
    w, _ := session.StdinPipe()
    defer w.Close()
    content := "123456789\n"
    fmt.Fprintln(w, "C0644", len(content), "testfile")
    fmt.Fprint(w, content)
    fmt.Fprint(w, "\x00") // 传输以\x00结束
}()
if err := session.Run("/usr/bin/scp -qrt ./"); err != nil {
    panic("Failed to run: " + err.Error())
}

上面的代码可以在我之前关于 scp in golang 的问题中找到

我不确定这是否是代码的作用,因为由于错误我无法运行它。我试图找出该/usr/bin/scp -qrt ./命令的作用,尽管不能完全理解它。

我已经在这个项目上待了一个星期,非常沮丧。任何帮助将不胜感激。提前致谢。

4

1 回答 1

1

我开始在 go 中编写一个 scp 客户端,在这个过程中我遇到了你的问题。我已经更接近于理解它了,所以现在我将给你一些指导,让你自己去做。如果我得到任何进一步的信息,我会更新我的答案。

  1. Your question about scp -qrt: this is 'remote scp' in 'sink' or 'to' mode. The scp client relies on another copy of scp being available on the remote host: scp -t being 'to'/sink mode, and scp -f being 'from'/source mode. Essentially scp -f will send back a short file 'header', followed by the contents of the file itself. scp -t simply expects to receive the same thing, for local storage.

  2. For a good starting point (actually this gives pretty-much everything you need), read this Oracle post. It explains in detail what scp is doing.

  3. For a good example in a similar language, see this python implementation of scp

That should set you on your way. Cheers

于 2013-10-28T07:59:18.597 回答