拥有一个可以执行任何具有特定功能的程序的包装程序很有用,而无需在目标程序上设置功能。这样的包装器对于从构建目录运行软件(setcap
这很麻烦)或运行 Python 之类的解释器(不合适)特别有用。
正如其他答案中所解释的,环境功能解决了这个问题,但它们仅在内核 4.3 之后才可用。可以通过让包装器直接加载目标程序而不是使用exec
. 我的意思是打开可执行文件,映射相关部分,设置堆栈等,然后跳转到它的代码。这是一项相当复杂的任务,但幸运的是 Wine 项目中的wine-preloader程序正是这样做的(以及与此目的无关的其他一些事情)。
以 root 身份运行类似的东西来设置包装器:
cp /usr/bin/wine-preloader /path/to/wrapper
setcap cap_net_raw+ep /path/to/wrapper # set whatever capabilities you need
现在我们有了一个wine-preloader
能够运行任何具有这些功能的程序的副本:
/path/to/wrapper /path/to/executable arguments...
这可行,但有一些陷阱:
- 目标程序必须是可执行文件的路径,它无法在
PATH
.
- 如果目标程序是带有解释器 ( ) 的脚本,则它不起作用
#!
。
wine-preloader
打印一条关于无法找到某些东西的消息(但它仍然可以正常运行程序)。