在列出目錄時/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 上如何運作?了解詳情。