2016-04-03 6 views
0

Ich habe den folgenden Code, der einen externen Befehl ausführt und zwei Felder auf die Konsole, die auf die Benutzereingabe warten. Eine für den Benutzernamen und andere für das Passwort, und dann habe ich sie manuell hinzufügen.Go - schreiben auf stdin auf externen Befehl

Kann mir jemand einen Hinweis geben, wie man in stdin schreibt, um diese Eingaben von innerhalb des Programms einzugeben?

Der Trick Teil für mich ist, gibt es zwei verschiedene Felder warten auf Eingabe, und ich habe Probleme zu finden, wie man nacheinander zu füllen.

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

LÖSUNG:

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 
+0

Sie können vielleicht Ihre Standardeingabe mit dem Unterprozess 'stdin mit einer Schleife lesen, die von Ihrer liest und in den Unterprozess schreibt. –

Antwort

1

Ich stelle mir Sie eine bytes.Buffer dafür verwenden könnte. So etwas ähnliches (nicht getestet):

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

Der Trick besteht darin, dass die stdin ist nur ein char-Puffer, und wenn die Anmeldeinformationen zu lesen, wird es einfach Zeichen lesen Sie einen \n Charakter bis zu stoßen (oder vielleicht \n\r). So können Sie sie im Voraus in einen Puffer schreiben und den Puffer direkt dem Befehl zuführen ...

Verwandte Themen