Golang exec.command带有输入重定向

时间:2016-07-10 02:19:05

标签: bash go

我试图从我的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

2 个答案:

答案 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上工作正常