我正在使用非 root 身份启动网络服务器系统单元文件。
listen tcp :80: bind: permission denied
即使我已经跑了,我还是得到了
setcap cap_net_bind_service=+ep
在可执行文件上。
在互联网上的一个示例单元文件中我发现
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
在单元文件中使用。所以我尝试了一下,突然应用程序可以绑定端口 80。
这告诉我什么?setcap
是否已过时/已弃用/已被忽略?只有通过系统还是一般的Linux?
答案1
正确的说法是,一般来说,systemd 不会使用所管理的文件功能setcap
,而是需要您将它们配置为服务单元的一部分。
所以它并不是setcap
完全被弃用......(它可能在 systemd 启动的服务之外有有效的用途。)但它至少不适用于 systemd 服务。
事实上,文件功能(由 设定setcap
)从一开始就一直是可疑的……它们需要使用“可继承”的功能,而这种功能的构思有些糟糕,并且有很多缺点……“环境”的内核功能引入功能是为了解决其中许多问题,这也是较新的系统正在采用的功能(此处包括 systemd,如您所见,您正在将AmbientCapabilities=
服务设置为能够绑定到低端口。)
功能主题相当复杂......对于这个问题的更温和的介绍,您可能需要检查“继承能力”在LWN。有关完整的详细信息(包括功能集的一些代数符号),请参阅能力(7)手册页。