2012-02-05 22 views
1

Javaコードからログインしたユーザーを探す必要があるので、次のオプションを使用します: Runtime.getRuntime.exec( "who") Runtime.getRuntime.exec( "who am i")Runtime.getRuntime.exec( "who am i")希望の結果が得られません

どちらも同じ結果を返します(プロンプトでwhoコマンドを実行すると結果が得られます)。 スペースの後に何も認識していないと思います。私は他のコマンドでも同じ結果を試した。

コードに問題がありますか、いくつかの環境を設定する必要があります、plz help。

+0

http://stackoverflow.com/questions/525212/how-to-run-unix-shell-script-from-java-code – stacker

+0

コマンド「whoami」が便利かもしれません。それはあなただけのユーザーの名前を提供します。また、ほとんどのシェルはUSERという環境変数を定義しています。 'System.getProperty(" user.name ")'を通してアクセス可能です。 – jackrabbit

+0

さらに、このアプローチは、javaプロセスの所有者を返します。ユーザがログインしなければならないアプリケーションを作成していて、そのユーザIDを取得したい場合、これはあなたが望むものを与えるものではありません。 – DaveH

答えて

2

Runtime.exec()関数の最初のパラメータは、プログラム名のみをとります。

引数を渡すには、Runtime.exec(String [] cmdarray)などの別のバージョンを使用する必要があります。例:より簡単に

Runtime.getRuntime().exec(new String[] {"who", "am", "i"}); 

または、:

スペースに分割するのstring.Split()メソッドを使用しています
Runtime.getRuntime().exec("who am i".split()); 

+0

2度目の読書で、私は間違っていました。 [docs](http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Runtime.html#exec%28java.lang.String,%20java.lang.String []) 、%20java.io.File%29)、 "より正確に言えば、コマンド文字列は、新しいStringTokenizer(コマンド)の呼び出しによって作成されたStringTokenizerを使ってトークンに分解され、文字カテゴリはそれ以上変更されません。新しい文字列配列cmdarrayに同じ順序で配置されます。 "また、' getRuntime'はメソッドです。 –

2

あなただけの名前を知っておく必要がある場合は、現在ログインしているユーザー、および(PTY名、などなど)whoコマンドのその他の情報はいずれも、あなたは

System.getProperty("user.name"); 

これを使うべきではありませんあなたはプラットフォームに依存しない、ロケールに依存しない(who am iの出力形式は、Cロケールを使用していない場合とは異なる場合があります)、より堅牢で外部コマンドを呼び出すことができます。

関連する問題