Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 围棋;“执行命令”;tcpdump什么都不做_Go - Fatal编程技术网

Go 围棋;“执行命令”;tcpdump什么都不做

Go 围棋;“执行命令”;tcpdump什么都不做,go,Go,我正在尝试在Go中运行以下代码。我尝试了以下两种方法: out, err := exec.Command("sh", "-c", "tcpdump -i ens0 host 192.168.1.100 -F ./testfile").Output() fmt.Println(string(out)) // Prints nothing fmt.Println(err) // exit status 1 我还尝试用/bin/bash替换sh

我正在尝试在Go中运行以下代码。我尝试了以下两种方法:

out, err := exec.Command("sh", "-c", "tcpdump -i ens0 host 192.168.1.100 -F ./testfile").Output()
fmt.Println(string(out))           // Prints nothing
fmt.Println(err)                   // exit status 1
我还尝试用
/bin/bash
替换
sh
。 我还尝试了以下方法,第一个参数是
sh
,第二个参数是
sh

out, err := exec.Command("tcpdump", "-i", "ens0", "host", "192.168.1.100", "-F", "./testfile").Output()
fmt.Println(string(out))           // Prints nothing
fmt.Println(err)                   // exit status 1
所有这些都不起作用。有人能看出我做错了什么吗?我还尝试了这个go包
“github.com/kami zh/go capturer”
来读取stderr,但它仍然不打印任何内容


通常我必须使用
sudo
从shell执行
tcpdump
,因此我构建go二进制文件并以root用户身份执行它。

类似的方法应该可以工作,我不确定tcp dump中是否有-F这样的特定命令, 如果要捕获tcp转储的普通输出,可以使用
>file
将输出定向到文件。-w选项用于wireshark/tcpdump格式,用于读取和显示

cmd := exec.Command("sh", "-c", "sudo tcpdump -i <eth> host <ip> -w ./testfile")
err := cmd.Run()
if err != nil {
    fmt.Println(err)
}
另一种方法是使用
cmd.Start

cmd := exec.Command("sh", "-c", "sudo tcpdump -i ens33 -c 100 host localhost -w ./testfile")
err := cmd.Start()
if err != nil {
    log.Fatal(err)
}
log.Printf("Waiting for command to finish...")
err = cmd.Wait()
log.Printf("Command finished with error: %v", err)

如果将cmd.run而不使用-c选项与tcpdump cmd一起使用,则tcpdump命令将继续无限运行。因此,您无法看到是否在cmd.run()调用后放置了print语句,原因是exec.command失败,它只是在cli中以相同的方式工作,因此如果您需要将sodo放在前面,你也应该把它放在命令中,或者从root用户那里运行它。

退出状态是1,stderr怎么说?我试图像这样阅读stderr,但什么也没有得到<代码>输出:=capturer.CaptureStderr(func(){exec.Command(“tcpdump”、“-i”、“enp0s31f6”、“host”、“192.168.1.180”、“-F”、folderPath+pcapName”).Output()})fmt.Println(out)不要尝试在注释中添加代码。我不知道该如何捕获stderr,因为它不会以任何方式接触命令stderr。默认情况下,
tcpdump
只是继续运行,永远收集数据。
Output()
函数收集所有输出,等待程序终止。所以它永远在等待,积累越来越多的输出(如果还有),等待,再等待,再等待。它什么时候会停止等待?从未。要使
Output()
完成并返回收集的输出,必须使
tcpdump
停止运行,完成其输出打印,然后退出。当然,如果您的筛选器表达式不好,它将永远不会开始运行,因此没有输出。在这种情况下,我怀疑您文件中的筛选器不好,或者找不到文件本身(
/testfile
)。您可能需要
-c
和这里的数据包计数,这样整个过程将终止。或者,可以使用
cmd.Start
,而无需将输出重定向到文件,并在输出时收集输出,尽管这会变得有点复杂。@torek yes,-c work too和
cmd.Start
将运行该命令,不必等待它完成。让我用这个输入来更新答案,这将改善答案,无论是谁看这个。
cmd := exec.Command("sh", "-c", "sudo tcpdump -i ens33 -c 100 host localhost -w ./testfile")
err := cmd.Start()
if err != nil {
    log.Fatal(err)
}
log.Printf("Waiting for command to finish...")
err = cmd.Wait()
log.Printf("Command finished with error: %v", err)