2017-02-28 66 views
2

我正在尝试使用我构建的API的结果更改某些文件上的活动ACL权限。使用Java进程设置Linux 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秒,一旦确认为“风险值”改变时,它会得到新的权限。

我正在运行它作为JAR文件夹中的权限应该制定的文件。

我以根用户身份运行JAR。

我试图做一些简单的事情,就像在循环的每次迭代中将一行附加到与JAR相同的目录中的文件一样简单,但它不会执行任何操作。

每个命令都是一个有效的命令,当我手动在终端中运行它时会起作用。 System.out.println被用来确保命令被正确解释,但是看到因为我尝试了什么命令并不重要,所以我没有想法。

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

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

提前致谢!

+0

对不起,忘了改回原来的代码,我想修复。 – user7636904

+0

对,我收回了我的近距离投票。不过,一般情况下,您应该使用'ProcessBuilder'而不是'Runtime.exec'。 – Aaron

+0

好吧,我正在投票再次关闭你的问题,对不起:p这次它应该为你提供一个强大的解决方案!编辑:好吧,我还没有收回我以前的投票。这里去:http://stackoverflow.com/questions/21360619/is-there-a-java-interface-for-managing-unix-acl – Aaron

回答

0

这类问题的常见来源是Runtime.exec()不提供shell。如果你想在shell中执行命令,你需要真正执行一个shell。

可能的解决方法是创建包含要运行的命令的bash shell脚本。将#!/usr/bin/env bash放在脚本的顶部以确保它由bash shell运行。

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

编辑 - 我在过去通过创建一个单独的shell脚本作为应用程序安装的一部分,而不是动态创建它。如果你只需要做一件事,并且可以对脚本进行参数化,就可以很好地工作。

+0

我可以动态创建这些脚本并从Java程序执行它们吗?不幸的是,这是我不熟悉的事情。 – user7636904

+0

@ user7636904“你需要真正执行一个shell”,这意味着你有可能运行。exec''bash',用'-c '作为参数(最好用'ProcessBuilder'而不是'Runtime.exec')。不过,这不是一个好主意。我会看看我是否可以提出更好的替代方案 – Aaron

+0

感谢您的编辑,我用这个想法来构建解决方案。我创建一个文件(shell脚本),将每个命令添加为一个新行,然后在脚本准备就绪时执行脚本。干杯:) – user7636904