2016-04-03 18 views
0

Harici bir komut yürüten ve kullanıcı girişini bekleyen iki alana konsol çıkışı veren aşağıdaki kod var. Kullanıcı adı ve parola için bir tane daha sonra el ile ekledim.Git - harici komutta stdin'e yaz

Bu girdileri programın içinden girmek için stdin'e nasıl yazılacağı konusunda bana bir ipucu verebilir misiniz?

Benim için hile parçası, giriş için beklemede iki farklı alan var ve birbiri ardına nasıl doldurulacağını bulmakta güçlük çekiyorum.

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

ÇÖZÜM:

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

stdin'i alt prosesin 'stdin'i bir döngü ile okuyup altprogramlara yazabilirsiniz. –

cevap

1

Ben bunun için bir bytes.Buffer kullanabilirsiniz düşünün. Böyle şey (değil test):

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

hüner stdin'nin sadece bir karakter tampon ve kimlik bilgilerini okurken, sadece bir \n karakter (ya da belki \n\r) karşılaşmak kadar karakter okuyacak olmasıdır. Önceden bir arabelleğe yazabilir ve arabelleği doğrudan komut satırına yazabilirsiniz…