我试图从我的Go代码中运行一个相当简单的bash命令。我的程序写出了一个IPTables配置文件,我需要发出一个命令,让IPTables从这个配置中刷新。这在命令行上非常简单:
/sbin/iptables-restore < /etc/iptables.conf
但是,我不能为我的生活找出如何使用exec.Command()发出此命令。我尝试了一些方法来实现这个目标:
cmd := exec.Command("/sbin/iptables-restore", "<", "/etc/iptables.conf")
// And also
cmd := exec.Command("/sbin/iptables-restore", "< /etc/iptables.conf")
毫不奇怪,这些都没有奏效。我还尝试通过将文件名传递给stdin:
来将文件名输入命令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")
这也不起作用,毫不奇怪。我可以使用stdin来管道文件的内容,但是当我告诉iptables-restore要读取哪些数据时,这似乎很愚蠢。那么我怎样才能让Go运行命令/sbin/iptables-restore < /etc/iptables.conf
?
答案 0 :(得分:4)
首先阅读此/etc/iptables.conf
文件内容,然后将其写入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)
}
}
答案 1 :(得分:0)
cmd := exec.Command("/usr/sbin/iptables-restore", "--binary", iptablesFilePath)
_, err := cmd.CombinedOutput()
if err != nil {
return err
}
return nil
在我的Raspberry Pi3上工作正常