入力リダイレクトを使用した exec.Command
Go では、exec.Command 関数を使用して外部コマンドを実行できます。入力をパイプ経由でコマンドにリダイレクトするには、StdinPipe メソッドを使用する必要があります。
次のタスクを検討してください: コマンド「/sbin/iptables-restore < /etc/iptables.conf」を実行します。このコマンドは構成ファイルに基づいて IPTable を更新しますが、exec.Command を使用して入力リダイレクトを構成するのは難しい場合があります。
最初の試行では、exec.Command("/sbin/iptables-restore", "< ;"、"/etc/iptables.conf")、< を誤って解釈します。コマンドフラグとして。さらに、 exec.Command("/sbin/iptables-restore", "< /etc/iptables.conf") を使用すると、< が解釈されます。 IPTables への引数として使用すると、エラーが発生します。
これを解決するには、stdin パイプ経由で入力データを明示的に提供します。
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) } }
このコードでは、IPTables 構成ファイルが読み取られます。そして cmd.StdinPipe() に書き込まれ、目的の入力リダイレクトが実現されます。
以上がGo で入力を「exec.Command」に適切にリダイレクトする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。