"tcpdump -w 1.pcap" 可以正常工作,但是 "tcpdump -C 100 -w 1.pcap" 却提示权限被拒绝。

14

当我运行“tcpdump -w 1.pcap”时,我需要限制文件大小。我试图使用关键字“-C”来实现这一点,但是当我添加它时,我遇到了“权限被拒绝”的错误。所以:

> sudo tcpdump -w 1.pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C821 packets captured
847 packets received by filter
24 packets dropped by kernel

但是:

> sudo tcpdump -C 100 -w 1.pcap
tcpdump: 1.pcap: Permission denied

我在我的主目录下运行了该命令,并在运行命令之前尝试删除和创建文件,使用不同的权限来运行命令,最终得到:

-rwxrwxrwx 1 root root 0 Aug  5 10:30 1.pcap
或者
-rwxrwxrwx 1 fd8 users 0 Aug  5 10:30 1.pcap

你能解释一下为什么在第二种情况下我无法写入文件吗?


当您执行 sudo tcpdump -C 100 -w 1.pcap 命令时,1.pcap 文件是否已经以 root:root 的所有权存在? - Varun
1
@VarunLakkur 因为他正在使用sudo运行它,所以权限不应该成为问题。 - Barmar
“sudoers”配置可以指定在运行“sudo”时允许的特定命令和选项。这里可能是一个可能性吗? - Varun
@VarunLakkur 我根据sudoers拥有完全的权限,因此我认为文件权限没有问题。经常有人写道他们完全无法使用-w选项。他们通过tcpdump的编译标志(如chroot或suid)来解决这个问题,但我找不到如何在我的系统上检查这个问题... - fd8
即使我以root身份运行它(sudo su),问题仍然存在。 - fd8
3个回答

15

你需要执行-Z root。请阅读手册页面:

   -Z     Drops privileges (if root) and changes user ID to user and the group ID to the primary group of user.

          This behavior is enabled by default (-Z tcpdump), and can be disabled by -Z root.

是的,我已经阅读了手册,但我仍然不明白为什么“tcpdump -w 1.pcap”在没有-Z的情况下可以正常工作,而“sudo tcpdump -C 100 -w 1.pcap”却不能。 - fd8
默认情况下,RHEL 中的 tcpdump 在写文件时会“降低权限”到 tcpdump 用户,这意味着文件将以非 root 用户的身份保存。在 RHEL 中,用户应该是“tcpdump”。因此,您可以通过 chmod 777 /path/to/logdir/ 或甚至 chown tcpdump /path/to/logdir 来解决此问题。如果您的日志目录归某个特定用户所有,则可以使用 -Z 将文件保存为该用户,但 -Z root 可让您在任何地方编写文件。 - ghoti
2
哦,而且在StackOverflow的回答中放置“因为那就是它的工作原理”是一件可怕的事情。 :-) - ghoti

6

我在Ubuntu 12.04 LTS上遇到了类似的问题,我的问题通过以下步骤解决:

sudo apt-get install apparmor-utils

这个软件包中包含了用户user2704275所提到的aa-complain命令。

如果您使用的是RedHat/CentOS系统,可以通过yum命令安装相同的软件包。

sudo aa-complain /usr/sbin/tcpdump

这将把tcpdump的AppArmor模式从“强制执行”更改为“投诉”。

您可以在/sys/kernel/security/apparmor/profiles中检查AppArmor状态。

然后,我就可以使用sudo获取tcpdump了。

获取tcpdump后,出于安全原因,您可能需要将apparmor状态恢复到以前的模式,如下所示命令。

sudo aa-enforce /usr/sbin/tcpdump

致敬。


4

当我尝试从文件中读取时,我遇到了类似的问题,比如:

tcpdump -r example.cap 'icmp[icmptype] = icmp-echo'

对我而言,AppArmor导致了问题,我不得不将'tcpdump'的模式从“强制执行”切换到“申诉”模式。请以root身份运行以下命令:

aa-complain /usr/sbin/tcpdump

2
谢谢您的回答!但是AppArmor是用于Ubuntu的,而我在服务器上使用的是RHEL。答案是使用tcpdump的“-Z root”密钥。但我们仍然不知道为什么tcpdump会表现出这种方式,因为服务器上已关闭SELinux。 - fd8
可能只需要禁用AppArmor配置文件(因为complain模式可能存在安全问题),使用以下命令:sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.tcpdump - douglaslps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接