我一直在努力解决这个问题一周左右。我已经尝试了scp client for golang,但被告知代码已被破坏,并且提供的“修复”代码也不起作用。无论如何,我放弃了文件传输,并决定只使用ssh创建文件并保存在远程机器上。
我在进入scp路由之前成功运行了golang中的ssh客户端,所以这可能是一个很好的解决方案。
在ssh客户端中,它只执行了“ls”命令,我知道有一个“触摸”命令来创建文件。
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())
}
上述代码可在我之前的question about scp in golang
中找到我不确定这是否是代码所做的,因为我因错误而无法运行它。我试图找出/usr/bin/scp -qrt ./
命令的作用,虽然不能完全理解它。
我已经在这个项目上工作了一个星期,非常令人沮丧。任何帮助将不胜感激。提前谢谢。
答案 0 :(得分:1)
我开始在go中编写一个scp客户端,我在这个过程中遇到了你的问题。我已经有了更多的理解它,所以现在我只是给你一些方向来自己做。如果我得到更多,我会更新我的答案。
您关于scp -qrt
的问题:这是'sink'或'to'模式中的'remote scp'。 scp客户端依赖于远程主机上可用的另一个scp副本:scp -t
为'to'/ sink模式,scp -f
为'from'/ source模式。基本上scp -f
将发回一个短文件'header',然后是文件本身的内容。 scp -t
只希望收到同样的东西,用于本地存储。
这是一个很好的起点(实际上这可以提供你需要的所有东西),read this Oracle post。它详细解释了scp正在做什么。
有关类似语言的示例,请参阅this python implementation of scp
这应该让你顺利。干杯