Golang中如何运行命令并将输出重定向到/dev/null

Golang中如何运行命令并将输出重定向到/dev/null 你好, 我想运行这个命令: iptables -A OUTPUT -j ACCEPT > /dev/null 2>&1 但是当我通过以下方式运行它:

_, _ = exec.Command("iptables", "-A", "OUTPUT", "-j", "ACCEPT").Output()

不知道我的 CentOS 7 服务器怎么就宕机了,我的意思是,我无法通过 SSH 连接到我的服务器,HTTP 服务也宕了。 那么,我需要加上 >/dev/null 2>&1 吗? 如果需要,我可以像这样运行吗:

_, _ = exec.Command("iptables", "-A", "OUTPUT", "-j", "ACCEPT", ">", "/dev/null", "2>&1").Output()

更多关于Golang中如何运行命令并将输出重定向到/dev/null的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

你所说的“正在关闭”具体是什么意思?

你检查过命令的返回值了吗?

更多关于Golang中如何运行命令并将输出重定向到/dev/null的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


服务器日志中有什么内容吗?你能在虚拟机中复现这个问题吗?请使用一个合适的控制台来连接服务器,而不是通过SSH?

在 PHP 中运行正常:

exec('iptables -A OUTPUT -j ACCEPT > /dev/null 2>&1');

但在 Go 中服务器会宕机,当我们运行 mount --bind 命令来挂载任何文件时,也会发生同样的情况。

当我说服务器宕机时,意思是服务器无法访问, 就像这样: 我编译了Go文件, 上传到我的服务器, 运行命令(文件)比如 ./mycompiledfile, 该命令没有完成也没有返回任何结果, 我尝试通过另一个窗口访问终端,它显示连接超时, 我尝试通过HTTP访问服务器,也就是我的网站,网站也显示连接超时, 几分钟后,我能够再次访问服务器和SSH,然后我再次运行相同的命令,同样的情况又发生了。

在Go中执行命令时,>/dev/null 2>&1是shell的重定向语法,不能直接作为命令参数传递。正确的做法是使用exec.CommandStdoutStderr字段来控制输出。

以下是几种实现方式:

方法1:将输出重定向到/dev/null

package main

import (
    "os"
    "os/exec"
)

func main() {
    cmd := exec.Command("iptables", "-A", "OUTPUT", "-j", "ACCEPT")
    
    // 打开/dev/null文件
    devNull, err := os.OpenFile("/dev/null", os.O_WRONLY, 0)
    if err != nil {
        panic(err)
    }
    defer devNull.Close()
    
    // 将标准输出和标准错误重定向到/dev/null
    cmd.Stdout = devNull
    cmd.Stderr = devNull
    
    // 执行命令
    err = cmd.Run()
    if err != nil {
        panic(err)
    }
}

方法2:使用io.Discard(Go 1.16+)

package main

import (
    "io"
    "os/exec"
)

func main() {
    cmd := exec.Command("iptables", "-A", "OUTPUT", "-j", "ACCEPT")
    
    // 将输出丢弃
    cmd.Stdout = io.Discard
    cmd.Stderr = io.Discard
    
    err := cmd.Run()
    if err != nil {
        panic(err)
    }
}

方法3:通过shell执行(不推荐,除非必要)

package main

import "os/exec"

func main() {
    // 通过shell执行,包含重定向
    cmd := exec.Command("sh", "-c", "iptables -A OUTPUT -j ACCEPT > /dev/null 2>&1")
    
    err := cmd.Run()
    if err != nil {
        panic(err)
    }
}

关于你的服务器宕机问题,iptables -A OUTPUT -j ACCEPT命令会添加一条允许所有出站流量的规则。如果这条规则位置不当,可能会影响现有的防火墙规则,导致网络连接问题。建议检查iptables规则配置:

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    // 查看当前iptables规则
    cmd := exec.Command("iptables", "-L", "-n", "-v")
    output, err := cmd.Output()
    if err != nil {
        panic(err)
    }
    fmt.Println(string(output))
}

执行命令前建议先备份现有规则:

package main

import (
    "os/exec"
)

func main() {
    // 备份iptables规则
    backupCmd := exec.Command("iptables-save")
    output, err := backupCmd.Output()
    if err != nil {
        panic(err)
    }
    
    // 将规则保存到文件
    err = os.WriteFile("/tmp/iptables-backup.rules", output, 0644)
    if err != nil {
        panic(err)
    }
}
回到顶部