Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将linux功能分配给一个java进程_Java_C_Linux_Execv_Linux Capabilities - Fatal编程技术网

将linux功能分配给一个java进程

将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功能选项,以及它是否可行 有人能告诉我该走哪条路,具体怎么做吗

我运行许多java进程,但我只想将cap_net_原始linux功能分配给一个java进程。 目前,如果我这样做“setcap cap_net_raw=ep/usr/java/default/bin/java”,那么这个功能将分配给所有java进程

在做了一些研究之后,我想我必须编写一个c包装程序,并为该程序提供上述功能,java进程将在execv中继承。 另一项研究表明,能力可以通过systemd分配

我不确定如何使用systemd功能选项,以及它是否可行

有人能告诉我该走哪条路,具体怎么做吗?谢谢

我写了一个包装器(使用另一篇stackoverflow文章)来实现这一点

capjava.c:
#包括
#包括
#包括
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);
}