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

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 に答える
0

AFAIK whoami はシェル コマンドであり、Runtime#exec()プログラムのみを実行します。

Runtime.getRuntime().exec(new String[]{"sh","-c","whoami"})呼び出しshて実行させることができますwhoami

別のこと: 読んだ後にプロセスを破棄する必要がありますか?

于 2012-08-21T06:57:28.527 に答える