如何在golang中获取gcloud命令的结果?

use*_*794 1 shell go gcloud

这是我的代码:

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)
}
Run Code Online (Sandbox Code Playgroud)

当我执行这段代码时,它会打开我的浏览器并显示正确的网址...但我想获取网址。

当我输入这个命令时:

gcloud auth application-default login
Run Code Online (Sandbox Code Playgroud)

在我的外壳中我有:

Your browser has been opened to visit:

    https://accounts.google.com/o/oauth2/auth?redirect_uri=h***********************************
Run Code Online (Sandbox Code Playgroud)

这就是我希望在程序中通过 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)
Run Code Online (Sandbox Code Playgroud)

问候和感谢

jee*_*tkm 5

找到了为什么您的代码片段无法按预期工作的原因。

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

这里gcloud命令没有执行完毕,所以我们必须实时读取它。我已经测试了下面的代码片段,它有效。

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()
Run Code Online (Sandbox Code Playgroud)

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