使用 Java 进程设置 Linux ACL 权限
Setting Linux ACL permissions using Java Process
我正在尝试使用我构建的 API 的结果更改对某些文件激活的 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秒进行一次,一旦"risk value"发生变化,它就会获得新的权限。
我运行将其作为 JAR 文件放在文件夹中,其中包含应对其授予权限的文件。
我运行以 root 身份安装 JAR。
我试图做一些简单的事情,例如在循环的每次迭代中将一行附加到与 JAR 位于同一目录中的文件,但是它没有做任何事情。
每个命令都是有效的命令,当我在终端中手动 运行 它时有效。 System.out.println 用于确保命令被正确解释,但鉴于我尝试的命令并不重要,我 运行 没主意了。
它每次也以状态 0 退出,尽管我也尝试使用 processbuilder 和该方法的变体,包括错误输出,但我无法调试。
这仅仅是我使用 Java 程序无法做到的事情吗?
提前致谢!
这类问题的通常来源是 Runtime.exec() 没有提供 shell。如果要在 shell 中执行命令,则需要实际执行 shell.
一种可能的解决方法是创建 bash shell 脚本,其中包含您想要 运行 的命令。将 #!/usr/bin/env bash
放在脚本的顶部,以确保它通过 bash shell 获得 运行。
然后你可以 exec() 脚本,并向它传递你需要的任何参数。
编辑 - 我过去通过创建一个 shell 脚本作为应用程序安装的一部分来完成此操作,而不是动态创建它。如果你只需要做一件事,并且可以参数化脚本,这个效果很好。
我正在尝试使用我构建的 API 的结果更改对某些文件激活的 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秒进行一次,一旦"risk value"发生变化,它就会获得新的权限。
我运行将其作为 JAR 文件放在文件夹中,其中包含应对其授予权限的文件。
我运行以 root 身份安装 JAR。
我试图做一些简单的事情,例如在循环的每次迭代中将一行附加到与 JAR 位于同一目录中的文件,但是它没有做任何事情。
每个命令都是有效的命令,当我在终端中手动 运行 它时有效。 System.out.println 用于确保命令被正确解释,但鉴于我尝试的命令并不重要,我 运行 没主意了。
它每次也以状态 0 退出,尽管我也尝试使用 processbuilder 和该方法的变体,包括错误输出,但我无法调试。
这仅仅是我使用 Java 程序无法做到的事情吗?
提前致谢!
这类问题的通常来源是 Runtime.exec() 没有提供 shell。如果要在 shell 中执行命令,则需要实际执行 shell.
一种可能的解决方法是创建 bash shell 脚本,其中包含您想要 运行 的命令。将 #!/usr/bin/env bash
放在脚本的顶部,以确保它通过 bash shell 获得 运行。
然后你可以 exec() 脚本,并向它传递你需要的任何参数。
编辑 - 我过去通过创建一个 shell 脚本作为应用程序安装的一部分来完成此操作,而不是动态创建它。如果你只需要做一件事,并且可以参数化脚本,这个效果很好。