没有suid的ping

以前的事情了,觉得有必要记上。

有段时间使用ping命令报错

1
ping: socket: Operation not permitted

但是使用sudo却可以运作,很好奇。使用ls -l发觉ping的命令没有suid标识,以为是没有suid的原因。但是随之发现自已一台vps的ping程序也是没有suid标识的,却能以普通用户正常运行不报错。

后来发现执行如下语句之后就能以普通用户正常运行ping了

1
sudo setcap cap_net_raw+ep /bin/ping

Capabilities

来自ArchWiki的中文描述

能力(capability) (POSIX 1003.1e, capabilities(7))用更小的粒度控制超级管理员权限,可以避免使用 root 权限。软件开发者应该为二进制文件赋予最小权限,而不是使用强大的setuid

查询特定程序的capabilities使用getcap,比如

1
getcap /bin/ping

设定则是setcap,如

1
setcap cap_net_raw+ep /bin/ping

至于具体有哪些,以及怎么用,参照man capabilitiesman cap_from_text

先记录,以备以后之需。

参考资料

Capabilities - ArchWiki

为什么桌面版 Linux 运行 ping 程序,不需要 root 权限? - 知乎

capabilities(7) - Linux manual page

cap_from_text(3) - Linux man page