使用 Java 进程设置 Linux ACL 权限

Setting Linux ACL permissions using Java Process

我正在尝试使用我构建的 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);              

}

对API的查询目前每1秒进行一次,一旦"risk value"发生变化,它就会获得新的权限。

我运行将其作为 JAR 文件放在文件夹中,其中包含应对其授予权限的文件。

我运行以 root 身份安装 JAR。

我试图做一些简单的事情,例如在循环的每次迭代中将一行附加到与 JAR 位于同一目录中的文件,但是它没有做任何事情。

每个命令都是有效的命令,当我在终端中手动 运行 它时有效。 System.out.println 用于确保命令被正确解释,但鉴于我尝试的命令并不重要,我 运行 没主意了。

它每次也以状态 0 退出,尽管我也尝试使用 processbuilder 和该方法的变体,包括错误输出,但我无法调试。

这仅仅是我使用 Java 程序无法做到的事情吗?

提前致谢!

这类问题的通常来源是 Runtime.exec() 没有提供 shell。如果要在 shell 中执行命令,则需要实际执行 shell.

一种可能的解决方法是创建 bash shell 脚本,其中包含您想要 运行 的命令。将 #!/usr/bin/env bash 放在脚本的顶部,以确保它通过 bash shell 获得 运行。

然后你可以 exec() 脚本,并向它传递你需要的任何参数。

编辑 - 我过去通过创建一个 shell 脚本作为应用程序安装的一部分来完成此操作,而不是动态创建它。如果你只需要做一件事,并且可以参数化脚本,这个效果很好。