gpt4 book ai didi

go - 去tcpdump的“exec.Command”什么都不做

转载 作者:行者123 更新时间:2023-12-01 22:27:12 47 4
gpt4 key购买 nike

我正在尝试在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

我也尝试过用 sh替换 /bin/bash
我也尝试了以下操作,并在不使用 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从外壳执行 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)
}

谢谢@ torek,-c选项可以与tcpdump一起使用,以在捕获n个数据包后退出
 cmd := exec.Command("sh", "-c", "sudo tcpdump -i ens33 -c 100 host localhost -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)

如果您在tcpdump cmd中使用不带-c选项的cmd.run,则tcpdump命令将继续无限运行。因此您看不到是否在cmd.Run()调用后放置了print语句,原因是exec.Command失败了,它与cli的工作方式相同,因此,如果需要在它前面添加sodo,则也应将其放在命令中或从root用户运行。

关于go - 去tcpdump的“exec.Command”什么都不做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59258201/

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