我运行了很多java进程,但我只想将cap_net_raw linux功能分配给一个java进程。 目前,如果我执行此操作“setcap cap_net_raw = ep / usr / java / default / bin / java”,则此功能将分配给所有Java进程。
在做了一些研究之后,我认为我必须编写一个c包装程序并为该程序提供上述功能,java进程将在execv中继承。 另一项研究表明,可以通过systemd分配功能。
我不知道如何使用systemd功能选项以及它是否可行。
有人可以指导我走哪条路以及如何做到这一点?感谢
答案 0 :(得分:1)
我写了一个包装器(使用另一个stackoverflow文章)来实现这个目的。
#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。