将linux功能分配给一个java进程
我运行许多java进程,但我只想将cap_net_原始linux功能分配给一个java进程。 目前,如果我这样做“setcap cap_net_raw=ep/usr/java/default/bin/java”,那么这个功能将分配给所有java进程 在做了一些研究之后,我想我必须编写一个c包装程序,并为该程序提供上述功能,java进程将在execv中继承。 另一项研究表明,能力可以通过systemd分配 我不确定如何使用systemd功能选项,以及它是否可行 有人能告诉我该走哪条路,具体怎么做吗?谢谢我写了一个包装器(使用另一篇stackoverflow文章)来实现这一点 capjava.c:将linux功能分配给一个java进程,java,c,linux,execv,linux-capabilities,Java,C,Linux,Execv,Linux Capabilities,我运行许多java进程,但我只想将cap_net_原始linux功能分配给一个java进程。 目前,如果我这样做“setcap cap_net_raw=ep/usr/java/default/bin/java”,那么这个功能将分配给所有java进程 在做了一些研究之后,我想我必须编写一个c包装程序,并为该程序提供上述功能,java进程将在execv中继承。 另一项研究表明,能力可以通过systemd分配 我不确定如何使用systemd功能选项,以及它是否可行 有人能告诉我该走哪条路,具体怎么做吗
#包括
#包括
#包括
int main(int argc,字符**argv[]{
char*cmd;
字符**argvp;
int-ret=0;
cap_t caps=cap_get_proc();
printf(“功能:%s\n”,大写至小写文本(大写,NULL));
cap_value_t newcaps[1]={cap_NET_RAW,};
cap\u set\u标志(caps,cap\u可继承,1,newcaps,cap\u set);
cap_设置_程序(caps);
printf(“\n新功能:%s\n”,大写至小写文本(大写,NULL));
无cap_(caps);
argvp=&argv[1];
cmd=argvp[0];
printf(“cmd是%s\n”,cmd);
ret=execv(cmd,argvp);
printf(“\n execv的返回值为%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
#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);
}