dshmkgq558192365
dshmkgq558192365
2016-04-03 07:46
浏览 56
已采纳

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

I have the following code which executes an external command and output to the console two fields waiting for the user input. One for the username and other for the password, and then I have added them manually.

Could anyone give me a hint about how to write to stdin in order to enter these inputs from inside the program?

The tricky part for me is that there are two different fields waiting for input, and I'm having trouble to figure out how to fill one after the other.

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)
}

SOLUTION:

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

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

login.Stdout = os.Stdout
login.Stdin = &b
login.Stderr = os.Stderr
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • doufu7464
    doufu7464 2016-04-03 09:58
    已采纳

    I imagine you could use a bytes.Buffer for that. Something like that:

    login := exec.Command(cmd, "login")
    
    buffer := bytes.Buffer{}
    buffer.Write([]byte("username
    password
    "))
    
    login.Stdout = os.Stdout
    login.Stdin = &buffer
    login.Stderr = os.Stderr
    
    err := login.Run()
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
    }
    

    The trick is that the stdin is merely a char buffer, and when reading the credentials, it will simply read chars until encountering a character (or maybe ). So you can write them in a buffer in advance, and feed the buffer directly to the command.

    点赞 评论

相关推荐