exec.Command() による入力のリダイレクト
Go で入力リダイレクトを使用してコマンドを発行するのは難しい場合があります。一般的なコマンドライン操作を考えてみましょう。
/sbin/iptables-restore < /etc/iptables.conf
このコマンドは、iptables-restore に /etc/iptables.conf から設定を読み取るように指示します。 Go の exec.Command() を使用してこれを実現するにはどうすればよいですか?
失敗した試行
入力ファイルのパスを引数として渡すか、ファイル名を stdin にパイプする最初の試行
// Fails cmd := exec.Command("/sbin/iptables-restore", "<", "/etc/iptables.conf") // Also fails cmd := exec.Command("/sbin/iptables-restore", "< /etc/iptables.conf") // Attempt to pipe file name into stdin // Fails 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")
解決策: 読み取りと書き込みファイルの内容
コマンドを正常に実行するには、まず /etc/iptables.conf の内容を読み取り、次にそれらの内容を 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) } }
以上がGo で入力を exec.Command() にリダイレクトする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。