一尘不染

Go-在外部命令上写入标准输入

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

阅读 235

收藏
2020-07-02

共1个答案

一尘不染

我想您可以bytes.Buffer为此使用a 。像这样:

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它只是一个char缓冲区,并且在读取凭据时,它只会读取chars直到遇到一个\n字符(或可能是\n\r)。因此,您可以预先将它们写入缓冲区,然后将缓冲区直接输入命令。

2020-07-02