2011-02-25 10 views

答えて

2

nativeコマンドを実行しますか? like whoami

1

これを確認してください:get login username in java

+1

'-Duser.name = root'に気をつけて、あなたが望むものに設定することができます。 –

+0

あなたは 'user.name'をチェックするか、' whoami'の出力を解析するかに関わらず、ユーザ名を任意の数に変更することができます。あなたがアクセス制御のためにこれに頼っているのであれば、あなたはちょっとばかりです。 – cHao

2

あなたは

Process p = Runtime.getRuntime.exec("whoami") 

メソッドを呼び出すことができます。その後、のstdoutを処理して、コマンドの出力を読み取ることができます。

+0

あなたが好きなものを 'whoami'が返すように、パスを変更することができます。 '/ usr/bin/whoami'が良い選択かもしれません。 –

+0

'Runtime.getRuntime.exec'の引数はプログラム名かシェルコマンドですか?なぜなら、それがシェルコマンドであれば、コマンドラインからJavaアプリケーションを実行しているユーザーは、環境変数を微調整することによって/ usr/bin/whoamiが実際に意味するものを変更する可能性があるからです。 IE:$ IFSにスラッシュを含めるように設定し、カレントディレクトリを$ PATHに追加し、そこに 'usr'という名前のプログラムを置きます。 – cHao

+0

いずれにせよ、 'whoami'の出力に依存することは、セキュリティ上の目的のためには本当に適切なものではありません。これは、インストール担当者(たとえば、何かをインストールするのではなく、適切なエラーメッセージを表示できるようにする)や、ルート特権なしで破損する可能性のある他のプログラムの利便性チェックとしては良いでしょう。しかし、それはいくつかの方法で覆されて、何かへのアクセスを許可することを悪い考えにすることができます。 – cHao

0

最良の方法は、

Process p = Runtime.getRuntime.exec("groups `whoaim`"); 

を実行し、グループコールのルートを取得するために文字列を解析しようとすることです。あなたのJVMプロセスはrootを呼び出さない、つまり司会者によって実行される可能性がありますが、このユーザーはルートグループに属し、root権限を持っている可能性があります。

+0

私が見たほとんどすべてのLinuxシステムでは、実際のrootユーザーだけがroot権限を持っています。ルートグループは通常、実際のアクセスを考慮しませんが、*潜在的なアクセスを考慮します。すなわち、誰かが* root特権を得るためのコマンドを実行することはできますが、自動的に*持っているわけではありません。 – cHao

7
Process p = Runtime.getRuntime().exec("id -u") 

は(それはそれを変更することは稀だが)システムの「ルート」ユーザーがroot呼び出されないことに注意してください、そして、それは別のユーザー名にそれをエイリアスすることも可能です。現在のユーザーがrootの場合、出力は0になります。

+1

rootのユーザ名を変更することは可能ですが、 'root'という名前がハードコードされているものが壊れてしまいます。そのようなものの中で注目すべきは 'su'です。ユーザー名を指定せずに実行すると' su root'と同じで、ユーザー "root"が存在しないという苦情があります。私はこれを一度試し、すぐにユーザー名を元に戻しました。 :) – cHao

6

簡単。ただ、

System.getProperty("user.name") 
+0

これはセキュリティで保護されていない可能性があります[別のSOの回答](http:// stackoverflow。com/a/2290392/2032064) – Mifeet

+0

@Mifeet私は同意します。これはだまされる可能性があります。しかし、開発者が意図したユーザーと意図したソフトウェア環境を知っている場合、これは便利な解決策になります。 –

0
String userName = System.getProperty("user.name"); 
Process p = Runtime.getRuntime().exec("groups " + userName); 
String output = read(p.getInputStream()); 
String error = read(p.getErrorStream()); 

を使用し、ここで、読み取り機能である:

public static String read(InputStream input) throws IOException { 
    try (BufferedReader buffer = new BufferedReader(new InputStreamReader(input))) { 
     return buffer.lines().collect(Collectors.joining("\n")); 
    } 
} 

ただ、 "他" に変更ソリューション。

関連する問題