7

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 + "\n" + pwd + "\n"))

login.Stdout = os.Stdout
login.Stdin = &b
login.Stderr = os.Stderr
1
  • you can maybe bridge your stdin with the sub process' stdin with a loop reading from yours and writing to the sub proc's. Commented Apr 3, 2016 at 7:51

1 Answer 1

9

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\npassword\n"))
login.Stdin = &buffer

login.Stdout = os.Stdout
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 \n character (or maybe \n\r). So you can write them in a buffer in advance, and feed the buffer directly to the command.

Sign up to request clarification or add additional context in comments.

2 Comments

there is no way to stream/pipe stuff to stdin?
To stream/pipe stuff to stdin, use .StdinPipe() to retrieve an io.WriteCloser that you can stream/pipe/write your content to (see stackoverflow.com/a/60641517 ). Closing the pipe is only needed to forcibly close stdin earlier (see pkg.go.dev/os/exec#Cmd.StdinPipe ).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.