Go - 在外部命令上写入stdin

时间:2016-04-03 07:46:40

标签: go

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

有人可以给我一个关于如何写入stdin的提示,以便从程序中输入这些输入吗?

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

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

1 个答案:

答案 0 :(得分:2)

我想你可以使用bytes.Buffer。 这样的事情(未经测试):

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

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

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

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

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