Go-通过外部命令写入标准输入

Go-通过外部命令写入标准输入,go,Go,我有以下代码,它执行一个外部命令并将两个字段输出到控制台,等待用户输入。 一个用于用户名,另一个用于密码,然后我手动添加了它们 有谁能给我一个提示,告诉我如何写入stdin,以便从程序内部输入这些输入 对我来说,棘手的是有两个不同的字段等待输入,我很难想出如何一个接一个地填充 login := exec.Command(cmd, "login") login.Stdout = os.Stdout login.Stdin = os.Stdin login.Stderr = os.Stderr

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

有谁能给我一个提示,告诉我如何写入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

我想你可以用一个
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
)。因此,您可以提前将它们写入缓冲区,并将缓冲区直接提供给命令。

您可以通过从您的stdin读取并写入子进程的循环将stdin与子进程的stdin连接起来。是否无法将数据流/管道传输到stdin?