2017-02-28 59 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