【问题标题】:Unable to execute a simple "whoami" unix command using java program on the server无法在服务器上使用 java 程序执行简单的“whoami”unix 命令
【发布时间】:2012-08-16 11:45:46
【问题描述】:

我面临着无法在 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 上工作

【问题讨论】:

    标签: java unix process aix


    【解决方案1】:

    您的网络服务器似乎配置了禁止执行外部应用程序的 Java 安全策略。

    请参阅http://java.sun.com/developer/onlineTraining/Programming/JDCBook/appA.html 了解有关 Java 安全策略的信息以及您的 Web 服务器的文档。

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

    grant {
      permission java.io.FilePermission 
        "/usr/bin/whoami", "execute";
    };
    

    【讨论】:

    • 我想这可能是实际问题。将检查这一点,看看。感谢您的回答
    • @SuryaChandra 您发布的错误消息与受限安全策略完全一致。
    • 我在 was.policy 文件 grant codeBase "file:${application}" { }; 中看到以下条目授予代码库“文件:${jars}”{};授予 codeBase "file:${connectorComponent}" { };授予 codeBase "file:${webComponent}" { };授予 codeBase "file:${ejbComponent}" { };以上是否暗示目前没有任何访问权限?
    • @SuryaChandra 这似乎是 WebSphere 的默认设置。请参阅pic.dhe.ibm.com/infocenter/wasinfo/v6r0/…,了解这五个中的哪一个可能最适合添加所需的权限。对我来说看起来像 file:${application}file:${webComponent}
    • 我认为你是对的。我会做出改变,看看。不幸的是,我正在运行的服务器已关闭,我会尽快更新我的观察结果
    【解决方案2】:

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

    user.name 
    

    Java 中的系统属性?

    【讨论】:

      【解决方案3】:

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

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

      另外一件事:读完需要销毁进程吗?

      【讨论】:

      • 嗯,它是一个实际的程序,它位于/usr/bin。 Martijn-Pro:~ martijncourteaux$ which whoami 返回/usr/bin/whoami
      【解决方案4】:

      您可以使用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);
              }
          }
      }
      

      【讨论】:

      • a ProcessBuilder 应限制为与 Runtime.exec 相同的安全策略
      猜你喜欢
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多