gpt4 book ai didi

bash - 带有输入重定向的 exec.Command

转载 作者:IT王子 更新时间:2023-10-29 00:42:01 28 4
gpt4 key购买 nike

我正在尝试从我的 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")

毫不奇怪,这些都不起作用。我还尝试通过将文件名管道输入到标准输入来将文件名输入到命令中:

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

最佳答案

首先读取这个/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)
}
}

关于bash - 带有输入重定向的 exec.Command,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38288012/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com