【问题标题】:How to get the result of a gcloud command in golang?如何在 golang 中获取 gcloud 命令的结果?
【发布时间】:2017-11-12 16:49:45
【问题描述】:

这是我的代码:

package main

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

func main() {
    out, err := exec.Command("bash", "-c", "gcloud auth application-default login").Output()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("The output is %s\n", out)
}

当我执行这段代码时,它会打开我的浏览器,并带有良好的 url ... 但我想获取网址。

当我输入这个命令时:

gcloud auth application-default login

在我的外壳中我有:

Your browser has been opened to visit:

    https://accounts.google.com/o/oauth2/auth?redirect_uri=h***********************************

这就是我想在我的程序中使用 Out 的文本。

知道怎么获得吗?

这里编辑是我测试过但没有成功的 3 个问题

/*
out, err := exec.Command("bash", "-c", "gcloud auth application-default login").CombinedOutput()
if err != nil {
    log.Fatal(err)
}
fmt.Printf("The output is %s\n", out)

*/

cmd := exec.Command("bash", "-c", "gcloud auth application-default login")
cmdReader, err := cmd.StderrPipe()
if err != nil {
    fmt.Fprintln(os.Stderr, "Error creating StdoutPipe for Cmd", err)
    os.Exit(1)
}

scanner := bufio.NewScanner(cmdReader)
        go func() {
    for scanner.Scan() {
        fmt.Printf(" out | %s\n", scanner.Text())
    }

}()



out, err := exec.Command("bash", "-c", "gcloud auth application-default login").Output()
if err != nil {
    log.Fatal(err)
}
fmt.Printf("The date is %s\n", out)

问候和感谢

【问题讨论】:

  • 你的代码是正确的,可能是gcloud输出到stderr,你可以试试CombinedOutput()而不是Output()吗?
  • @jeevatkm 我编辑过的似乎不起作用:/

标签: shell go gcloud


【解决方案1】:

该消息被打印到标准错误,而不是标准输出。

【讨论】:

    【解决方案2】:

    找到了您的 sn-p 无法按预期工作的原因。

    通常CombinedOutput()Output() 在给定命令完成后返回结果。

    这里gcloud 命令没有完成执行,所以我们必须实时读取它。我已经测试了下面的代码sn-p,它可以工作。

    cmd := exec.Command("bash", "-c", "gcloud auth application-default login")
    stderr, err := cmd.StderrPipe()
    if err != nil {
        log.Fatal(err)
    }
    
    // Start command
    if err = cmd.Start(); err != nil {
        log.Fatal(err)
    }
    
    // prevent main() to exit before cmd completes
    defer cmd.Wait()
    
    // read cmd output and send it to stdout
    // repalce os.Stderr as per your need
    go io.Copy(os.Stdout, stderr)
    
    fmt.Println("Standby to read...")
    fmt.Println()
    

    这只是一种方法,实施你的方法。祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-13
      • 2019-12-20
      • 2010-09-11
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      相关资源
      最近更新 更多