【问题标题】:Go - write to stdin on external commandGo - 在外部命令上写入标准输入
【发布时间】:2016-04-03 07:46:40
【问题描述】:

我有以下代码执行外部命令并将两个字段输出到控制台等待用户输入。 一个用于用户名,另一个用于密码,然后我手动添加了它们。

谁能给我一个关于如何写入标准输入以便从程序内部输入这些输入的提示?

对我来说棘手的部分是有两个不同的字段在等待输入,我很难弄清楚如何一个接一个地填写。

login := exec.Command(cmd, "login")

login.Stdout = os.Stdout
login.Stdin = os.Stdin
login.Stderr = os.Stderr

err := login.Run()
if err != nil {
    fmt.Fprintln(os.Stderr, err)
}

解决方案:

login := exec.Command(cmd, "login") 

var b bytes.Buffer
b.Write([]byte(username + "\n" + pwd + "\n"))

login.Stdout = os.Stdout
login.Stdin = &b
login.Stderr = os.Stderr

【问题讨论】:

  • 你也许可以将你的标准输入与子进程的标准输入桥接,循环读取你的标准输入并写入子进程。

标签: go


【解决方案1】:

我想您可以为此使用bytes.Buffer。 类似的东西:

login := exec.Command(cmd, "login")

buffer := bytes.Buffer{}
buffer.Write([]byte("username\npassword\n"))
login.Stdin = &buffer

login.Stdout = os.Stdout
login.Stderr = os.Stderr

err := login.Run()
if err != nil {
    fmt.Fprintln(os.Stderr, err)
}

诀窍在于stdin 只是一个字符缓冲区,在读取凭据时,它只会读取字符,直到遇到\n 字符(或者可能是\n\r)。所以你可以提前将它们写入一个缓冲区,然后将缓冲区直接提供给命令。

【讨论】:

  • 没有办法将内容流式传输/管道传输到标准输入?
猜你喜欢
  • 2022-08-14
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 2011-12-13
  • 2013-04-06
  • 2017-04-22
  • 2012-08-24
  • 2021-04-29
相关资源
最近更新 更多