我正在使用systemd单元文件以非 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
是旧的/不推荐的/忽略的?仅由systemd还是由 Linux 提供?
可以正确地说,通常 systemd 不能使用管理的文件功能,
setcap
而是需要您将它们配置为服务单元的一部分。所以它并不像
setcap
完全弃用......(在 systemd 启动的服务之外可能有它的有效用途。)但它至少不适用于 systemd 服务。实际上,文件功能(由 设置
setcap
)从一开始就一直是可疑的和值得怀疑的……它们需要使用“可继承”的功能,这些功能设计得有些拙劣,并且有很多缺点……“环境”的内核特性引入了功能来解决这些问题中的许多问题,并且它是新系统所采用的(这里包括 systemd,如您所见,您正在设置AmbientCapabilities=
您的服务以管理能够绑定到低端口。)能力的主题相当复杂......对于这个问题的更温和的介绍,您可能需要查看LWN 的“继承能力”。有关完整的详细信息(包括功能集上的一些代数符号),请参阅功能 (7)手册页。