为了账号安全,请及时绑定邮箱和手机立即绑定

tcpdump 的“exec.Command”不执行任何操作

tcpdump 的“exec.Command”不执行任何操作

Go
一只名叫tom的猫 2023-08-14 14:29:08
我正在尝试在 Go 中运行以下代码。我尝试过以下两种方法:out, err := exec.Command("sh", "-c", "tcpdump -i ens0 host 192.168.1.100 -F ./testfile").Output()fmt.Println(string(out))           // Prints nothingfmt.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 nothingfmt.Println(err)                   // exit status 1这些都不起作用。有人能看到我做错了什么吗?我也尝试过这个 go 包"github.com/kami-zh/go-capturer"来读取 stderr,但它再次没有打印任何内容。通常我必须使用从 shellsudo执行tcpdump,因此我构建了 go 二进制文件并以 root 用户身份执行它。
查看完整描述

1 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

像这样的东西应该可以工作,我不确定 tcp 转储中是否有任何特定的命令,例如 -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 用户运行它。


查看完整回答
反对 回复 2023-08-14
  • 1 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信