3

我制作了一个脚本 (python+bash),它使用tcpdump来监视和过滤流经网络接口的 TCP 标头。它适用于所有接口,但对于以太网 en0接口,Mac 要求 tcpdump 以 root 用户 ( sudo) 执行。

是否有任何编程解决方案可以绕过使用 sudo 运行它的需要?

我发现像wireshark这样的工具能够在不要求用户输入sudo密码的情况下做到这一点。

任何不需要 sudo 的解决方案都会很棒。

4

2 回答 2

6

是否有任何编程解决方案可以绕过使用 sudo 运行它的需要?

“程序化”是什么意思?

Wireshark 这样做的方式是它的安装程序

  1. 创建一个access_bpf组并将用户放入其中;
  2. 安装一个 StartupItem ,将当前 BPF 设备的组所有者access_bpf更改为并将它们的权限更改为rw-rw----(根据ls -l /dev/bpf*jonschipp 的答案中的输出);

这样安装 Wireshark 的用户就可以运行使用 BPF 的程序(所有使用 libpcap 的程序在 OS X 上都使用 BPF;tcpdump 和 Wireshark 都使用 libpcap)而不必以 root 身份运行它们(至少只要程序不需要一个的BPF 设备;它们是根据需要自动创建的,但它们是使用权限创建的,rw-------并且归用户和组所有root)。

所以如果你已经安装了 Wireshark,你不仅可以以普通用户的身份运行 Wireshark(和 TShark,以及它们都用来抓包的 dumpcap 程序)并捕获流量,例如,你还可以将 tcpdump 运行为普通用户并捕获流量。

即,它不是 Wireshark代码中启用此功能的东西,因此在这个意义上它不是“程序化的”,它是由 Wireshark安装程序安装的启用此功能的东西,并且它为所有程序启用它。

于 2013-08-05T17:58:22.313 回答
3

如果您不需要处于混杂模式,则可以以普通用户身份使用 tcpdump。使用“-p”选项禁用混杂模式。

tcpdump -nni en0 -p

如果您需要将界面设置为混杂模式,则可以启用 root 帐户并通过 su 成为 root,然后继续运行您的脚本。

su root -
python myscript.py

或者

su -
python myscript.py

使用 sudo 默认值,它可以像这样完成(假设一个名为 Administrator 的管理员帐户)

su Administrator
sudo su
python myscript.py

如果您担心密码提示,sudo 可以通过将 /etc/sudoers 文件配置为使用 NOPASSWD 选项来避免它。然后,您可以在没有密码提示的情况下以普通用户身份运行脚本。

您也可以尝试为其他用户授予 bpf 设备文件的读取权限。注意:我没有测试过这个。

$ ls -l /dev/bpf*
crw-rw----  1 root  access_bpf   23,   0 Aug  4 22:17 /dev/bpf0
crw-rw----  1 root  access_bpf   23,   1 Aug  4 22:16 /dev/bpf1
crw-rw----  1 root  access_bpf   23,   2 Aug  4 22:16 /dev/bpf2
crw-rw----  1 root  access_bpf   23,   3 Aug  4 22:16 /dev/bpf3

例如

chmod o+r /dev/bpf*
于 2013-08-05T04:11:28.177 回答