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!
Désolé, j'ai oublié de revenir au code d'origine que je voulais corriger. – user7636904
Bon, j'ai rétracté mon vote serré. Cependant, vous devriez utiliser 'ProcessBuilder' plutôt que' Runtime.exec' en général. – Aaron
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