我制作了一个脚本 (python+bash),它使用tcpdump来监视和过滤流经网络接口的 TCP 标头。它适用于所有接口,但对于以太网 en0接口,Mac 要求 tcpdump 以 root 用户 ( sudo
) 执行。
是否有任何编程解决方案可以绕过使用 sudo 运行它的需要?
我发现像wireshark这样的工具能够在不要求用户输入sudo密码的情况下做到这一点。
任何不需要 sudo 的解决方案都会很棒。
是否有任何编程解决方案可以绕过使用 sudo 运行它的需要?
“程序化”是什么意思?
Wireshark 这样做的方式是它的安装程序
access_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安装程序安装的启用此功能的东西,并且它为所有程序启用它。
如果您不需要处于混杂模式,则可以以普通用户身份使用 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*