2016-07-10 17 views
2

Ich versuche, einen ziemlich einfachen Bash-Befehl aus meinem Go-Code auszuführen. Mein Programm schreibt eine IPTables-Konfigurationsdatei aus und ich muss einen Befehl ausgeben, um IPTables von dieser Konfiguration zu aktualisieren. Dies ist sehr einfach in der Kommandozeile:Golang exec.command mit Eingabeumleitung

/sbin/iptables-restore < /etc/iptables.conf

aber ich kann nicht für das Leben von mir herauszufinden, wie dieser Befehl zur Ausgabe von exec.Command(). Ich versuchte ein paar Dinge, um dies zu erreichen:

cmd := exec.Command("/sbin/iptables-restore", "<", "/etc/iptables.conf") 
// And also 
cmd := exec.Command("/sbin/iptables-restore", "< /etc/iptables.conf") 

Keine Überraschung, keiner von denen arbeitete. Ich habe auch versucht, in den Dateinamen stdin die Dateinamen in das Kommando durch eine Rohrleitung zu füttern:

cmd := exec.Command("/sbin/iptables-restore") 
stdin, err := cmd.StdinPipe() 
if err != nil { 
    log.Fatal(err) 
} 

err = cmd.Start() 
if err != nil { 
    log.Fatal(err) 
} 

io.WriteString(stdin, "/etc/iptables.conf") 

Das funktioniert auch nicht, keine Überraschung. Ich kann stdin verwenden, um den Inhalt der Datei zu pipen, aber das scheint albern, wenn ich nur sagen kann, iptables-Restore, welche Daten zu lesen gehen. Also, wie kann ich gehen, um den Befehl /sbin/iptables-restore < /etc/iptables.conf auszuführen?

Antwort

4

zuerst lesen diese /etc/iptables.conf Dateiinhalt es dann so zu cmd.StdinPipe() schreiben:

package main 

import (
    "io" 
    "io/ioutil" 
    "log" 
    "os/exec" 
) 

func main() { 
    bytes, err := ioutil.ReadFile("/etc/iptables.conf") 
    if err != nil { 
     log.Fatal(err) 
    } 
    cmd := exec.Command("/sbin/iptables-restore") 
    stdin, err := cmd.StdinPipe() 
    if err != nil { 
     log.Fatal(err) 
    } 
    err = cmd.Start() 
    if err != nil { 
     log.Fatal(err) 
    } 
    _, err = io.WriteString(stdin, string(bytes)) 
    if err != nil { 
     log.Fatal(err) 
    } 
} 
+0

ich daran gedacht hatte, und hatte es mit einer statischen Zeichenfolge als Test verspottet. Es klappt. Ich hatte jedoch gehofft, dass ich dies tun könnte, ohne den Inhalt der Daten in eine solche Pipe zu packen. Aber wenn es der einzige Weg ist, muss das tun. –

+0

Aufruf von 'exec.Command ("/sbin/iptables-restore "," <"," /etc/iptables.conf ")' wird nicht funktionieren: Die "<" und "/etc/iptables.conf" werden als verwendet Args an "/ sbin/iptables-restore". Ich denke, Sie brauchen 'exec.Command ("/sbin/iptables-restore