2017-02-28 1 views
2

Je tente de modifier les autorisations ACL actives sur certains fichiers en utilisant un résultat d'une API que j'ai créée.Définition des autorisations ACL Linux à l'aide de Java Process

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);    

} 

La requête à l'API est fait toutes les 1 seconde actuellement, la vérification dès qu'une « valeur de risque » est modifié, il obtiendra de nouvelles autorisations.

Je l'exécute en tant que JAR dans le dossier avec les fichiers sur lesquels les autorisations doivent être appliquées.

Je cours le JAR en tant que root.

J'ai essayé de faire quelque chose d'aussi simple que d'ajouter une ligne à un fichier dans le même répertoire que le fichier JAR à chaque itération de la boucle, mais cela ne fait rien.

Chacune des commandes est une commande valide qui fonctionne lorsque je l'exécute manuellement dans le terminal. Le System.out.println a été utilisé pour s'assurer que la commande est interprétée correctement, mais vu que peu importait quelle commande j'ai essayé, je manque d'idées.

Il se ferme également avec le statut 0 à chaque fois, et je n'ai pas été en mesure de déboguer malgré le fait d'essayer également d'utiliser processbuilder et les variantes de cette approche, y compris les sorties d'erreur.

Est-ce simplement quelque chose que je ne peux pas faire en utilisant un programme Java?

Merci d'avance!

+0

Désolé, j'ai oublié de revenir au code d'origine que je voulais corriger. – user7636904

+0

Bon, j'ai rétracté mon vote serré. Cependant, vous devriez utiliser 'ProcessBuilder' plutôt que' Runtime.exec' en général. – Aaron

+0

Très bien, je vote pour fermer votre question à nouveau, désolé: p Cette fois, il devrait vous fournir une solution robuste si! Edit: bien, je ne peux pas encore depuis que je me suis rétracté mon vote précédent. Ici va: http://stackoverflow.com/questions/21360619/is-there-a-java-interface-for-managing-unix-acl – Aaron

Répondre

0

La source habituelle de ce type de problème est que Runtime.exec() ne fournit pas de shell. Si vous voulez exécuter des commandes dans un shell, vous devrez exécuter un shell.

Une solution consiste à créer un script shell bash contenant les commandes que vous souhaitez exécuter. Mettez #!/usr/bin/env bash en haut du script pour vous assurer qu'il est exécuté par le shell bash.

Ensuite, vous pouvez exec() le script, et lui passer tous les arguments dont vous avez besoin. Éditer - Je l'ai fait par le passé en créant un seul script de shell dans le cadre de l'installation de l'application, et non en le créant dynamiquement. Si vous avez seulement besoin de faire une chose, et que vous pouvez paramétrer le script, cela fonctionne bien.

+0

Puis-je créer dynamiquement ces scripts et les exécuter à partir du programme Java? C'est quelque chose que je ne connais pas malheureusement. – user7636904

+0

@ user7636904 "vous aurez besoin d'exécuter un shell", ce qui signifie que vous avez la possibilité d'exécuter Runtime.exec' 'bash', avec' -c 'comme arguments (de préférence avec' ProcessBuilder' plutôt qu'avec Runtime.exec'). Pourtant, ce n'est pas une très bonne idée. Je vais voir si je peux suggérer une meilleure alternative – Aaron

+0

Merci pour votre montage, j'ai utilisé cette idée pour construire un travail autour. Je crée un fichier (script shell), ajoute chaque commande en tant que nouvelle ligne, puis exécute le script quand il est prêt. À votre santé :) – user7636904