无法在服务器上使用java程序执行简单的“whoami”unix命令

时间:2012-08-21 06:48:18

标签: java unix process aix

我面对这个奇怪的问题,即无法执行一个简单的" 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上工作

4 个答案:

答案 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 &#37;s is:", Arrays.toString(args));
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    }
}