使用 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中文网其他相关文章!