Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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
使用Java进程设置Linux ACL权限_Java_Linux_Acl_Processbuilder_Runtime.exec - Fatal编程技术网

使用Java进程设置Linux 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();

我正试图使用我构建的API的结果更改某些文件上活动的ACL权限

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脚本),将每个命令添加为新行,然后在脚本准备就绪时执行脚本。干杯:)