如何在 golang 中获取 gcloud 命令的结果?
How to get the result of a gcloud command in golang?
这是我的代码:
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 ...
但我想得到 url.
当我键入此命令时:
gcloud auth application-default login
在我的 shell 我有 :
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)
问候和感谢
该消息打印到 stderr,而不是 stdout。
找到您的代码段无法按预期工作的原因。
通常是 CombinedOutput()
和 Output()
returns 给定命令完成后的结果。
这里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()
这只是一种方法,实现你的。祝你好运!
这是我的代码:
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 ... 但我想得到 url.
当我键入此命令时:
gcloud auth application-default login
在我的 shell 我有 :
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)
问候和感谢
该消息打印到 stderr,而不是 stdout。
找到您的代码段无法按预期工作的原因。
通常是 CombinedOutput()
和 Output()
returns 给定命令完成后的结果。
这里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()
这只是一种方法,实现你的。祝你好运!