exec.Command with Input Redirection
To execute a bash command from Go, exec.Command() provides a straightforward solution. However, redirecting input to the command can be a challenge.
Consider the need to update IPTables using the command "/sbin/iptables-restore < /etc/iptables.conf." Attempts to invoke this command using exec.Command() have proven unsuccessful.
To address this, a strategy of providing the filename as input to cmd.StdinPipe() was employed:
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")
However, this approach remained ineffective. A viable solution involves reading the content of "/etc/iptables.conf" and writing it to cmd.StdinPipe():
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) } }
The above is the detailed content of How to Properly Redirect Input to `exec.Command` in Go for Commands Like `iptables-restore`?. For more information, please follow other related articles on the PHP Chinese website!