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

맞아, 나는 가까운 투표를 철회했다. 아직도 일반적으로'Runtime.exec'보다는'ProcessBuilder'를 사용해야합니다. – Aaron

+0

알았어, 네 질문을 다시 닫으 려구, 미안 : p 이번에는 당신에게 강력한 솔루션을 제공해야합니다! 편집 : 글쎄, 나는 내 이전 투표를 철회 한 이후로 아직 수 없습니다. 여기에 간다 : http://stackoverflow.com/questions/21360619/is-there-a-java-interface-for-managing-unix-acl – Aaron

답변

0

이런 종류의 문제의 근원은 Runtime.exec()가 쉘을 제공하지 않는다는 것입니다. 쉘에서 명령을 실행하려면 실제로 쉘을 실행해야합니다.

가능한 해결 방법은 실행할 명령이 들어있는 bash 쉘 스크립트를 작성하는 것입니다. #!/usr/bin/env bash을 스크립트 상단에 두어 bash 쉘에서 실행되도록하십시오.

그런 다음 스크립트를 exec()하여 필요한 인수를 전달할 수 있습니다.

편집 - 과거에는 응용 프로그램 설치의 일부로 단일 셸 스크립트를 만들어 동적으로 만들지 않았습니다. 한 가지 작업 만하고 스크립트를 매개 변수화 할 수 있다면 잘 작동합니다.

+0

이 스크립트를 동적으로 생성하여 Java 프로그램에서 실행할 수 있습니까? 이것은 내가 불행하게도 익숙지 않은 것입니다. – user7636904

+0

@ user7636904 "당신은 실제로 쉘을 실행해야합니다"는 것은'Runtime '가능성을 의미합니다.'-c '을 인수로 (바람직하게는'Runtime.exec'보다는'ProcessBuilder'를 사용하여)'exec'' bash'를 호출합니다. 여전히 좋은 아이디어는 아닙니다. 내가 더 나은 대안을 제안 할 수 있는지 알게 될 것이다. – Aaron

+0

편집 해 주셔서 감사합니다. 나는이 아이디어를 사용하여 작업을 구축했습니다. 파일 (셸 스크립트)을 만들고 각 명령을 줄 바꿈으로 추가 한 다음 준비가되었을 때 스크립트를 실행합니다. 건배 :) – user7636904