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

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

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

这工作得很好,但我想知道是否有一种方法可以实现同样的事情,而不需要为解释器二进制文件设置任何上限。虽然这不是一个大问题(其他用户帐户没有上限,因此即使在解释器二进制文件上设置了位,他们也无法使用它),但这有点烦人,因为每次解释器打开时我都必须重新设置标志更新。

答案1

通常,这些能力会遗传给孩子。如中所述联机帮助页:

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

脚本的问题是它们不能直接执行。内核会执行一系列检查(内核代码位于 fs/binfmt_*.c)。其中一个是“binfmt_script.c”,它检查第一行是否有 shebang,然后使用脚本作为参数调用真正的解释器(shebang 中的解释器)。因此,标准/通用解释器被调用,并且只是将您的脚本作为参数读取。

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

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

相关内容