0

我面临着无法在 AIX 服务器上执行简单的“whoami”unix 命令的奇怪问题。我有一个部署在 AIX 服务器上的 web 应用程序。现在我想查看我的 web 应用程序当前在哪个 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 <> 执行)

但是,当我删除上面的代码并运行我的 web 应用程序时,一切都运行良好。我在这里做错了什么。我错过了什么吗?请帮忙。这是我第一次在 UNIX 上工作

4

4 回答 4

3

看起来您的 Web 服务器已配置了禁止执行外部应用程序的 Java 安全策略。

有关 Java 安全策略和 Web 服务器文档的信息,请参见http://java.sun.com/developer/onlineTraining/Programming/JDCBook/appA.html 。

您将需要提供(或编辑)一个策略文件以包含以下内容:

grant {
  permission java.io.FilePermission 
    "/usr/bin/whoami", "execute";
};
于 2012-08-21T08:09:14.090 回答
2

只是出于好奇您是否考虑过使用:

user.name 

Java中的系统属性?

于 2012-08-21T06:56:23.537 回答
0

AFAIK whoami 是一个 shell 命令,Runtime#exec()只执行程序。

您可以尝试Runtime.getRuntime().exec(new String[]{"sh","-c","whoami"})调用sh并让它执行whoami

另一件事:阅读后是否需要销毁进程?

于 2012-08-21T06:57:28.527 回答
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 &#37;s is:", Arrays.toString(args));
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    }
}
于 2012-08-21T07:31:30.713 回答