使用Java进程设置Linux ACL权限
我正试图使用我构建的API的结果更改某些文件上活动的ACL权限使用Java进程设置Linux ACL权限,java,linux,acl,processbuilder,runtime.exec,Java,Linux,Acl,Processbuilder,Runtime.exec,我正试图使用我构建的API的结果更改某些文件上活动的ACL权限 executorService.scheduleAtFixedRate(new Runnable() { public void run() { System.out.println("hello"); JSONArray data = ServerAPI.riskCheck();
executorService.scheduleAtFixedRate(new Runnable() {
public void run() {
System.out.println("hello");
JSONArray data = ServerAPI.riskCheck();
if(data != null){
JSONArray policycontent = data;
for(int i = 0; i < policycontent.length(); i++){
JSONObject privilege = policycontent.getJSONObject(i);
String user = privilege.getString("user");
String filepath = privilege.getString("filePath");
String accesses = "";
if(privilege.getBoolean("read") == true){
accesses = accesses + "r";
}
if(privilege.getBoolean("write") == true){
accesses = accesses + "w";
}
if(privilege.getBoolean("execute") == true){
accesses = accesses + "x";
}
if(privilege.getBoolean("execute") == false && privilege.getBoolean("write") == false && privilege.getBoolean("read") == false){
accesses = "-";
}
try {
System.out.println("TRYING TO RUN:");
Process p = Runtime.getRuntime().exec("setfacl -m \"u:" + user + ":" + accesses + "\" " + filepath);
//p.waitFor();
int exitVal = p.waitFor();
System.out.println("Exited with error code "+exitVal);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println("setfacl -m \"u:" + user + ":" + accesses + "\" " + filepath);
}
}
System.out.println(ServerAPI.getRiskValue());
}
},1, 1, TimeUnit.SECONDS);
}
executorService.scheduleAtFixedRate(新的Runnable(){
公开募捐{
System.out.println(“你好”);
JSONArray data=ServerAPI.riskCheck();
如果(数据!=null){
JSONArray policycontent=数据;
for(int i=0;i
当前,对API的查询每1秒进行一次,检查“风险值”一旦更改,它将获得新的权限
我把它作为一个JAR运行在文件夹中,其中包含应该对其授予权限的文件
我以root身份运行JAR
我试图做一些简单的事情,比如在循环的每次迭代中,在与JAR相同的目录中向文件追加一行,但是它没有做任何事情
每个命令都是一个有效的命令,当我在终端中手动运行它时,它会工作。System.out.println用于确保正确解释该命令,但鉴于我尝试的命令并不重要,我已经没有什么想法了
它每次都以0的状态退出,尽管我也尝试使用processbuilder和该方法的变体,包括错误输出,但仍然无法进行调试
这仅仅是我不能用Java程序做的事情吗
提前谢谢 这类问题的常见根源是Runtime.exec()不提供shell。如果要在shell中执行命令,则需要实际执行shell 一种可能的解决方法是创建包含要运行的命令的bashshell脚本。放
#/usr/bin/env bash
,以确保它由bash shell运行
然后可以执行()脚本,并将需要的任何参数传递给它
编辑-我以前是通过在应用程序安装过程中创建一个shell脚本来实现的,而不是动态创建脚本。如果您只需要做一件事,并且可以对脚本进行参数化,那么这将非常有效。抱歉,忘记更改回我想要修复的原始代码。好的,我收回了我的投票。不过,一般来说,您应该使用
ProcessBuilder
而不是Runtime.exec
。好吧,我再次投票结束您的问题,抱歉:p不过,这次它应该为您提供一个健壮的解决方案!编辑:嗯,我还不能,因为我撤回了以前的投票。下面是:感谢Aaron的输入,这是一个相对较短的程序,我已经尝试使用processbuilder修复它,因此我想包括演示该问题的更简单的代码。您可能错过了我链接的问题,您检查过了吗?它显示有一个本地ACL API,您可以使用它来代替setfacl
命令。我可以动态创建这些脚本并从Java程序执行它们吗?不幸的是,这是我不熟悉的。@user7636904“您需要实际执行一个shell”,这意味着您可以使用Runtime.exec
bash
,使用-c
作为参数(最好使用ProcessBuilder
而不是Runtime.exec
)。不过,这不是一个好主意。我看看能不能推荐一个更好的替代方案谢谢你的编辑,我用这个想法构建了一个工作环境。我创建一个文件(shell脚本),将每个命令添加为新行,然后在脚本准备就绪时执行脚本。干杯:)