可以在脚本中使用功能而无需设置解释器二进制文件的大小吗?


14

现在,我正在cap_net_bind_service MY_USERNAME/etc/security/capability.conf中使用。
现在,我只需要设置cap_net_bind_service+i我最喜欢的脚本语言的解释器就可以通过libcap [-ng] 添加CAP_NET_BIND_SERVICE有效集合中。

这很好用,但是我想知道是否有一种方法可以在不对解释器二进制代码设置任何上限的情况下实现相同的目的。虽然这不是一个大问题(其他用户帐户没有上限,所以即使在解释器二进制文件中设置了位,他们也无法使用该上限),但由于每次使用解释器时我都必须重新设置标志,这有点令人讨厌更新。

Answers:


4

通常,功能是继承给孩子的。正如指出手册页

通过fork(2)创建的子级继承其父级功能集的副本。

脚本的问题在于它们不是直接可执行文件。内核通过检查列表(内核代码位于fs / binfmt _ *。c)。其中一个是“ binfmt_script.c”,它检查第一行的shebang,然后使用脚本作为参数调用真正的解释器(shebang中的那个)。这样,将调用标准/公共解释器,并仅将脚本作为参数读取。

这意味着您必须在解释器而不是脚本上设置功能。同样的情况适用于suid位和其他特殊标志。

因此,您可以复制解释器,设置所需的功能(还要检查是否没有人可以通过chmod / chown访问它),然后在您的shebang中调用此复制的解释器。您也可以在脚本中执行setcap逻辑。


好的,两年前没有问过这个问题,但是从未关闭过……而且,似乎像是unix.stackexchange.com/questions/87348/…
Adrien M.

但只有i(继承)才能通过exec。而且i它本身不执行任何操作,仅在文件具有匹配项时起作用i,并且我认为e(有效)位(除非脚本/可执行程序设置了该位)。setuid甚至更复杂,这不是脚本效果。
ctrl-alt-delor 2015年

1
我以为shebang是由内核而不是shell读取的?(stackoverflow.com/questions/3009192/how-does-the-shebang-work/...
菲利普·库寿龄

求你说对了。我后来才明白这是一种误解。我已修复了有关脚本执行内核代码位于何处的提示。
Adrien M.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.