ssh - 在 golang 的 ssh 客户端中创建一个文件

标签 ssh go scp

我已经为此苦苦挣扎了大约一个星期。我尝试了 scp client for golang,但被告知代码已损坏,并且贡献的“固定”代码也无法正常工作。无论如何,我放弃了文件传输并决定只使用 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())
}

上面的代码可以在我之前的question about scp in golang中找到

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

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

最佳答案

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

  1. 关于 scp -qrt 的问题:这是“sink”或“to”模式下的“remote scp”。 scp 客户端依赖于远程主机上可用的另一个 scp 副本:scp -t 是“to”/sink 模式,scp -f 是“from”/源模式。本质上,scp -f 将发回一个简短的文件“ header ”,然后是文件本身的内容。 scp -t 只是希望收到相同的东西,用于本地存储。

  2. 作为一个好的起点(实际上这几乎提供了您需要的一切),read this Oracle post .它详细解释了 scp 是做什么的。

  3. 有关类似语言的很好示例,请参阅 this python implementation of scp

这应该让您踏上前进的道路。干杯

关于ssh - 在 golang 的 ssh 客户端中创建一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19043557/

相关文章:

git - github SSH 是如何工作的?

ssh - 我可以在 Visual Studio 代码中从 WSL ssh 吗?

linux - 如何将 scp 与 xargs 一起使用?

python - 如何让 Fabric 根据当前所在的网络使用不同的角色?

node.js - Vagrant ssh 提示 'no kex alg' 无法连接虚拟机

go - 如何在golang中发送电报的userleft消息

go - 如何使用 golang 中的 revel 框架从 Controller 模拟服务?

go - 理解 Go 中的变量作用域

linux - 在 Bash 脚本中嵌入密码

linux - 使用多文件括号扩展时 SCP 不传输文件