Linux 为什么CapEff在/proc/$PID/status中都是零
我从ping二进制文件中删除了setuid位,并添加了Linux 为什么CapEff在/proc/$PID/status中都是零,linux,ping,linux-capabilities,Linux,Ping,Linux Capabilities,我从ping二进制文件中删除了setuid位,并添加了cap\u net\u raw+p,如下所示: $ chmod 755 /bin/ping $ setcap cap_net_raw+p /bin/ping 然后,我在一个终端中运行ping,并从另一个终端检查正在运行的进程的/proc/$PID/状态: $ ps aux | grep ping user
cap\u net\u raw+p
,如下所示:
$ chmod 755 /bin/ping
$ setcap cap_net_raw+p /bin/ping
然后,我在一个终端中运行ping
,并从另一个终端检查正在运行的进程的/proc/$PID/状态:
$ ps aux | grep ping
user 5468 0.0 0.0 14948 1792 pts/20 S+ 11:14 0:00 ping www.google.com
user 5471 0.0 0.0 14224 896 pts/2 S+ 11:14 0:00 grep --color=auto ping
$ cat /proc/5468/status | grep Cap
CapInh: 0000000000000000
CapPrm: 0000000000002000
CapEff: 0000000000000000
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
如果ping
当前正在运行,为什么capef:0000000000000000
?cap\u net\u raw
不也应该在有效集合中吗?/proc/$PID/status是否不反映线程的当前状态?一位在OFTC(irc)上的#kernelnewbies中很有帮助的人向我提供了答案
ping
在有效集合中设置cap\u net\u raw
,创建套接字,然后删除cap\u net\u raw
,如strace所示:
$ strace -e socket,capset ping -c1 localhost
capset({_LINUX_CAPABILITY_VERSION_3, 0}, {CAP_NET_RAW, CAP_NET_ADMIN|CAP_NET_RAW, 0}) = 0
socket(PF_INET, SOCK_RAW, IPPROTO_ICMP) = 3
capset({_LINUX_CAPABILITY_VERSION_3, 0}, {0, CAP_NET_ADMIN|CAP_NET_RAW, 0}) = 0
一旦套接字打开,就不需要更多的权限对其进行写入。问得好,回答得好。做得好!