TL;DR: 为什么只有在 /usr/bin(或 /usr/sbin)中,cap_net_raw 和 cap_net_admin 才能正常工作,而其他地方不行?这个问题能否在其他地方进行配置?
我在 Ubuntu 14.04 中使用 libpcap 编写 C 程序时遇到了分配权限的问题。即使使用 setcap(8) 分配了权限并使用 getcap(8) 进行了检查,我仍然会收到权限错误。似乎只有在 /usr/bin 和相关目录下的可执行文件才能正常工作。
我的程序 test.c 如下:
生成
我在 Ubuntu 14.04 中使用 libpcap 编写 C 程序时遇到了分配权限的问题。即使使用 setcap(8) 分配了权限并使用 getcap(8) 进行了检查,我仍然会收到权限错误。似乎只有在 /usr/bin 和相关目录下的可执行文件才能正常工作。
我的程序 test.c 如下:
#include <stdio.h>
#include <pcap.h>
int main(int argc, char **argv) {
if (argc != 2) {
printf("Specify interface \n");
return -1;
}
char errbuf[PCAP_ERRBUF_SIZE];
struct pcap* pcap = pcap_open_live(argv[1], BUFSIZ, 1, 0, errbuf);
if (pcap == NULL) {
printf("%s\n", errbuf);
return -1;
}
return 0;
}
并且编译时使用
gcc test.c -lpcap
生成
a.out
可执行文件。我设置了以下功能:sudo setcap cap_net_raw,cap_net_admin=eip ./a.out
请检查确保它看起来正确:
getcap a.out
这给了我
a.out = cap_net_admin,cap_net_raw+eip
运行 a.out
后出现以下结果:
./a.out eth0
eth0: You don't have permission to capture on that device (socket: Operation not permitted)
使用sudo
运行程序时,程序按预期工作(不输出任何内容并退出)。
有趣的部分是:如果我将a.out
移动到/usr/bin
(并重新应用权限),它就能正常工作。反之亦然:将启用权限的/usr/bin/dumpcap
从wireshark
(对于在wireshark
组中的用户来说可以正常工作)移出/usr/bin
,比如移到我的主目录下,重新应用相同的权限,它就不能正常工作。把它移回去,它就能正常工作。
因此:为什么这些权限只在/usr/bin
(和/usr/sbin
)中起作用,而在其他地方却不起作用?这个问题可以在哪里进行配置?