为了账号安全,请及时绑定邮箱和手机立即绑定

将 ssh 输出保存到 golang 中的结构的最佳方法是什么?

将 ssh 输出保存到 golang 中的结构的最佳方法是什么?

Go
函数式编程 2022-11-23 13:50:18

我正在尝试将使用 SSH 在其他机器上运行某些命令的输出保存到一个结构中。我使用CombinedOutput来保存输出。是这样的:


...

combo, err := session.CombinedOutput("hostname;pwd")

outputResult = string(combo)

...

它给了我一个 2 行输出。我想将这些行保存到以下结构中:


type Result struct {

    Hostname string `json:"hostname"`

    PWD      string `json:"pwd"`

}

最好(和简单)的方法是什么?谢谢。


查看完整描述

1 回答

?
蓝山帝景

TA贡献1562条经验 获得超7个赞

它给了我一个 2 行输出。我想将这些行保存到下面的结构中

您的问题确实与 SSH 无关。你有一个[]byte代表你的命令输出的。你想把它分成两个字符串。

strings.SplitN是这个的完美解决方案。您将原始字符串([]byte必须将其转换为)、分隔符(\n在您的情况下)和要返回的最大字符串数传递给它。对于我们来说,我们最多需要 2 个字符串。怎么可能不止一个\n? pwd返回一个目录,目录的名称中可以有换行符,尽管在实践中很少这样做。

 out := []byte("myhost\n/dir")

    fmt.Println(string(out))

    strs := strings.SplitN(string(out), "\n", 2)

    res := Result{Hostname: strs[0], PWD: strs[1]}

    out := []byte("myhost\n/dir")

    fmt.Println(string(out))

    strs := strings.SplitN(string(out), "\n", 2)

    res := Result{Hostname: strs[0], PWD: strs[1]}

https://go.dev/play/p/5ENSgAPg3ER

combo, err := session.CombinedOutput("hostname;pwd")

请记住,stderr除了stdout. 我想不出任何一个命令都会向 生成任何输出的情况stderr,但请记住,您没有区分这两者。希望您正在检查的结果,err如果不是nil,则不使用命令的结果。这应该可以保护您免受 stdout 和 stderr 组合的意外结果的影响。如果 stderr 与您无关,您可能想ssh.Session.Output改用


查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信