我写了一个包装器(使用另一篇stackoverflow文章)来实现这一点。
capjava.c:
#include <sys/capability.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv[]) {
char *cmd;
char **argvp;
int ret = 0;
cap_t caps = cap_get_proc();
printf("Capabilities: %s\n", cap_to_text(caps, NULL));
cap_value_t newcaps[1] = { CAP_NET_RAW, };
cap_set_flag(caps, CAP_INHERITABLE, 1, newcaps, CAP_SET);
cap_set_proc(caps);
printf("\nNew Capabilities: %s\n", cap_to_text(caps, NULL));
cap_free(caps);
argvp = &argv[1];
cmd = argvp[0];
printf("cmd is %s\n", cmd);
ret = execv(cmd, argvp);
printf("\n return value of execv is %d\n", ret);
}
现在添加权限:
[root@localhost ~]# setcap cap_net_raw=p /sbin/capjava [root@localhost ~]# setcap cap_net_raw=ei /usr/java/latest/bin/java
在我的一个应用程序的 systemctl 配置文件中添加了 capjava。