【问题标题】:golang exec command: stream output to stdout *and* capture output in variablegolang exec 命令:将输出流式传输到 stdout *和* 捕获变量中的输出
【发布时间】:2023-01-19 16:37:44
【问题描述】:

我正在构建一个 cli 并遇到以下情况。我从 go 调用一个 bash 命令,提示用户登录,然后在登录后打印一个令牌。例如:

cmd := exec.Command("vault", "login", "-method=okta", "-format=json", "username=abc")
cmd.Stdin = os.Stdinout
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
_ = cmd.Run()

这很好地流式传输输出,但我无法在用户登录后从命令的输出中解析令牌。我试图将 cmd.Run() 包装到管道函数中,例如 this thisthis 但是在这两种情况下,返回的输出都是空的。有任何想法吗?

谢谢!

【问题讨论】:

  • 没有os.Stdinout 所以代码似乎输入错误。

标签: go


【解决方案1】:

可能有很多包可以做到这一点,但要创建自己的包并不难:

package main

import (
    "fmt"
    "os"
    "os/exec"
)

type saveOutput struct {
    savedOutput []byte
}

func (so *saveOutput) Write(p []byte) (n int, err error) {
    so.savedOutput = append(so.savedOutput, p...)
    return os.Stdout.Write(p)
}

func main() {
    var so saveOutput
    cmd := exec.Command("factor", "999999")
    cmd.Stdin = os.Stdin
    cmd.Stdout = &so
    cmd.Stderr = os.Stderr
    _ = cmd.Run()
    fmt.Printf("I got this output: %s
", so.savedOutput)
}

游乐场:https://go.dev/play/p/T-o3QvGOm5q

【讨论】:

    【解决方案2】:

    不要白做你的结构。 使用 bytes.Buffer

    package main
    
    import (
        "bytes"
        "log"
    )
    
    func main() {
        var buffer bytes.Buffer
        cmd := exec.Command("vault", "login", "-method=okta", "-format=json", "username=abc")
        cmd.Stdout = &buffer
        _ = cmd.Run()
        log.Printf("Vault login output: %s", buffer.String())
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-26
      • 2020-08-20
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多