我使用一个典型cp /bin/ping p
命令将 /usr/bin/ping 文件复制到另一个位置(我的主目录),然后它停止工作,因为缺少权限。确切地说:
Ping:icmp 打开套接字:不允许操作。
我知道这sudo
更能解决我的问题,但是我不应以超级用户身份登录。
我也知道这(可能)是由于缺少某些权限或功能(事实上,getcap
我复制的文件显示它缺少原始 ping 的功能),但不幸的是,如果没有 root 权限,我无法使用它setcap
。。或者也许我可以?不知何故?
我该如何解决这个问题并能够使用我的 ping 文件副本./p
?
答案1
-rwsr-xr-x 1 root root 44168 May 7 2014 /bin/ping
s
in 的rws
意思是ping
setuid。当你运行它时,它会运行作为它的主人,root。
这就是它拥有 ping 权限的原因。你可以,sudo setcap cap_net_raw=ep ./ping
但最终 ICMP 属于“原始套接字”,因此这不是一个小的操作。它将允许另一个应用程序欺骗网络流量。
为了保证其“安全”并能 ping 通,该文件必须由 root 拥有,以阻止其他用户编辑该应用程序。
也许有setcap
一天也会让你为可执行文件指定一个哈希签名。
答案2
作为被 Oli 注意到了,ping
是 setuid --- 调用时以 root 身份运行。
然而,如果你复制它
cp -a /usr/bin/ping ./myping
目标将丢失 setuid 位 --- 您复制了文件,但您只能使用您自己的用户权限创建文件,而您的普通用户无法创建 setuid-root 二进制文件。否则,这将是一个巨大的安全漏洞(现在您可以修改您的副本ping
)!
如果要保留 setuid 位,则必须使用 进行复制sudo cp -a
。我希望没有其他办法可以解决这个问题。