我想让 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 的示例,假设您想要设置=+eip
forcap_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。