列出目录时/usr/bin
,我们会看到它 ping
显示为红底黄字:
该文件没有特殊功能:
$ file /usr/bin/ping
/usr/bin/ping: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for
GNU/Linux 2.6.32, BuildID[sha1]=2508ea2a85b70c68967b3e6345541430f5317d5f,
stripped
$ stat /usr/bin/ping
File: '/usr/bin/ping'
Size: 62096 Blocks: 136 IO Block: 4096 regular file
Device: 802h/2050d Inode: 4457229 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:ping_exec_t:s0
Access: 2016-11-01 10:02:57.332925719 +0100
Modify: 2016-06-22 14:01:14.000000000 +0200
Change: 2016-07-10 23:41:59.623796126 +0200
Birth: -
根据终端中不同的颜色代表什么含义?,我们可以在其中找到列出颜色解释的脚本,“yellow-on-red”表示“ca”:
“ca”是什么意思?也许这意味着该文件是从其他地方硬链接的(/usr/bin/ping
并且/usr/ping
是同一文件)
PS 看的时候出现这个问题解释脏牛,其中ping
Ubuntu 上的命令显示为 setuid root,这听起来很奇怪:
答案1
这表明它ping
具有额外的功能:
$ getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep
甚至(在 Fedora 上最多 30 个):
$ getcap /usr/bin/ping
/usr/bin/ping = cap_net_admin,cap_net_raw+ep
这允许ping
打开原始套接字(并发送和接收 ICMP 数据包),而无需运行为root
.setcap(8)
和capabilities(7)
提供更多详细信息。
历史上,ping
安装了 setuid,以便它可以作为原始套接字运行root
并能够使用原始套接字;一旦功能变得可用,许多发行版就会转而使用这些功能,因为它们对权限提供的更细粒度的控制似乎更可取。但在 Ubuntu 中,安装程序显然有问题,所以ping
仍然安装了setuid root
(功能代码在相关的维护者脚本,来自 Debian,其中ping
配置使用能力如果可能的话)。
联机ping
帮助页描述其要求因此:
ping
需要CAP_NET_RAW
执行能力 1) 如果程序用于非回显查询(请参阅-N
选项),或 2) 如果内核不支持非原始 ICMP 套接字,或 3) 如果不允许用户创建 ICMP 回显插座。该程序可用作 set-uid root。
内核 2.6.39 及更高版本提供另一种允许程序发送和接收 ICMP 回显消息的机制:net.ipv4.ping_group_range
。这在 Fedora 31 及更高版本中使用,允许在ping
没有额外功能的情况下工作(特别是在无根容器内);看如果没有 setuid 和功能,Ping 在 Fedora 上如何工作?了解详情。