“setcap”会覆盖最后一个功能。如何设置多个能力?

“setcap”会覆盖最后一个功能。如何设置多个能力?

我想让 Node.js 能够侦听端口 80,并关闭计算机。最初我按顺序尝试了这两个命令:

setcap cap_net_bind_service=+ep /usr/bin/nodejs
setcap cap_sys_boot=+ep /usr/bin/nodejs

然后我的应用程序无法绑定到端口 80。我用 getcap 检查了:

# getcap /usr/bin/nodejs
/usr/bin/nodejs = cap_sys_boot+ep

如果我再次为 cap_net_bind_service 运行 setcap:

# getcap /usr/bin/nodejs
/usr/bin/nodejs = cap_net_bind_service+ep

我在手册页中没有看到任何内容http://linux.die.net/man/8/setcap关于设置多个功能,并在绝望中尝试一些事情:

# setcap cap_net_bind_service=+ep /usr/bin/nodejs cap_sys_boot=+ep /usr/bin/nodejs
# getcap /usr/bin/nodejs
/usr/bin/nodejs = cap_sys_boot+ep
# setcap cap_net_bind_service=+ep cap_sys_boot=+ep /usr/bin/nodejs
Failed to set capabilities on file `cap_sys_boot=+ep' (No such file or directory)

如何设置多个能力?

答案1

最后一个绝望的语法猜测得到了回报:

# setcap cap_net_bind_service,cap_sys_boot=+ep /usr/bin/nodejs
# getcap /usr/bin/nodejs
/usr/bin/nodejs = cap_net_bind_service,cap_sys_boot+ep

答案2

对于提出这个问题的任何人:如果您想为不同的功能指定不同的操作,这就是您需要的语法:

# this is for illustrative purposes only
# obviously it's not how you would formally define the syntax
setcap "<CAP_0,CAP_1,...><ACTIONS_A> <CAP_2,...><ACTION_B> ..."

因此,使用 OP 的示例,假设您想要设置=+eipforcap_net_bind_service而不是=+ep,这就是您要做的:

setcap "cap_net_bind_service=+eip cap_sys_boot=+ep" /usr/bin/nodejs

更正式地说,每个被接受的“能力描述”setcap都由多个空格分隔的“子句”组成,其中每个子句的形式为<CAP_NAME_LIST><OPS><FLAGS>(一<OPS><FLAGS>对也称为“动作”)。

因此,如果我们以前面提到的例子为例:

cap_net_bind_service=+eip cap_sys_boot=+ep

cap_net_bind_service=+eip是第一个子句,其中cap_net_bind_service是逗号分隔的功能名称列表(此列表中只有一项),=+是运算符(重置然后引发),eip是标志(有效、可继承和允许)。cap_sys_boot=+ep第二个子句等也是如此。


如果您想要完整语法的详细描述,您应该参考 的手册页cap_from_text。这是一个关联如果您更喜欢阅读 die.net。

相关内容