Home >Backend Development >Golang >How to Properly Redirect Input to `exec.Command` in Go?
exec.Command with Input Redirection
In Go, the exec.Command function enables the execution of external commands. To redirect input into the command via a pipe, the StdinPipe method must be used.
Consider the following task: running the command "/sbin/iptables-restore < /etc/iptables.conf". This command updates the IPTables based on a configuration file, but configuring the input redirection using exec.Command can be a challenge.
The first attempt, exec.Command("/sbin/iptables-restore", "<", "/etc/iptables.conf"), misinterprets the < as a command flag. Additionally, using exec.Command("/sbin/iptables-restore", "< /etc/iptables.conf") interprets < as an argument to IPTables and results in an error.
To resolve this, provide the input data explicitly through the stdin pipe:
package main import ( "io" "io/ioutil" "log" "os/exec" ) func main() { // Read the contents of the input file. bytes, err := ioutil.ReadFile("/etc/iptables.conf") if err != nil { log.Fatal(err) } // Create the command. cmd := exec.Command("/sbin/iptables-restore") // Get the stdin pipe. stdin, err := cmd.StdinPipe() if err != nil { log.Fatal(err) } // Start the command. err = cmd.Start() if err != nil { log.Fatal(err) } // Write the input data to the stdin pipe. _, err = io.WriteString(stdin, string(bytes)) if err != nil { log.Fatal(err) } // Ensure stdin is closed. err = stdin.Close() if err != nil { log.Fatal(err) } // Wait for the command to finish. err = cmd.Wait() if err != nil { log.Fatal(err) } }
With this code, the IPTables configuration file is read and written into cmd.StdinPipe(), achieving the desired input redirection.
The above is the detailed content of How to Properly Redirect Input to `exec.Command` in Go?. For more information, please follow other related articles on the PHP Chinese website!