我面对这个奇怪的问题,即无法执行一个简单的" whoami" AIX服务器上的unix命令。我有一个部署在AIX服务器上的web应用程序。现在我想看看我的webapplication当前正在运行的WAS用户。所以我添加了以下代码:
public String whoami() throws Exception {
Process p = Runtime.getRuntime().exec("whoami");
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
String output = "";
while ((line = in.readLine()) != null) {
//System.out.println(line);
output += line;
}
in.close();
p.destroy();
return output;
}
}
上面的代码添加在一个由JSP引用的jar文件中。 JSP必须接收上面代码的输出,并显示WAS用户名。但是,当我在服务器上部署Web应用程序并尝试观察输出时,我得到一条错误消息,如
错误500:拒绝访问(java.io.FilePermission<>执行)
但是,当我删除上面的代码并运行我的webapplication时,一切运行正常。我在这做什么。我错过了做什么吗?请帮忙。这是我第一次在UNIX上工作
答案 0 :(得分:3)
您的Web服务器似乎已配置了禁止执行外部应用程序的Java安全策略。
有关Java安全策略的信息以及Web服务器的文档,请参阅http://java.sun.com/developer/onlineTraining/Programming/JDCBook/appA.html。
您需要提供(或编辑)策略文件以包含以下内容:
grant {
permission java.io.FilePermission
"/usr/bin/whoami", "execute";
};
答案 1 :(得分:2)
出于好奇 你考虑过使用:
user.name
Java中的系统属性?
答案 2 :(得分:0)
AFAIK whoami是一个shell命令,Runtime#exec()
只执行程序。
您可以尝试Runtime.getRuntime().exec(new String[]{"sh","-c","whoami"})
致电sh
并让其执行whoami
另一件事:你是否需要在阅读后销毁这个过程?
答案 3 :(得分:0)
您可以使用ProcessBuilder
课程代替getRuntime().exec("whoami")
。
以下是示例代码
import java.io.*;
import java.util.*;
public class DoProcessBuilder {
public static void main(String args[]) throws IOException {
if (args.length <= 0) {
System.err.println("Need command to run");
System.exit(-1);
}
Process process = new ProcessBuilder(args).start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
System.out.printf("Output of running %s is:", Arrays.toString(args));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}