48

Grails 内から任意のユーザーのホーム ディレクトリを見つけるにはどうすればよいですか? Linux では多くの場合、/home/user です。ただし、OpenSolaris などの一部の OS では、パスは /export/home/user です。

4

13 に答える 13

69

通常、ステートメントを使用します

String userHome = System.getProperty( "user.home" );

任意のプラットフォームでユーザーのホーム ディレクトリを取得します。他に取得できるものについては、 getPropertyのメソッド ドキュメントを参照してください。

この回避策 (セキュリティ ポリシー ファイルの使用) を使用することで、回避したいアクセスの問題が発生する可能性があります。

于 2009-01-30T07:04:25.700 に答える
53

For UNIX-Like systems you might want to execute "echo ~username" using the shell (so use Runtime.exec() to run {"/bin/sh", "-c", "echo ~username"}).

于 2009-01-29T17:46:41.973 に答える
5

任意のユーザーの場合、Webサーバーとして:

private String getUserHome(String userName) throws IOException{
    return new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(new String[]{"sh", "-c", "echo ~" + userName}).getInputStream())).readLine();
}
于 2009-10-19T18:14:10.350 に答える
3

ハードコーディングできないユーザー名に対してこれを行おうとすると、困難な場合があります。確かecho ~rbronoskyに私のホーム dir へのパスが/home/rbronoskyわかりますが、rbronosky が変数に含まれている場合はどうでしょうか? もしあなたがname=rbronosky; echo ~$name得るなら~rbronosky

これが実際のケースと解決策です。

ユーザーがsudo経由で実行する必要があるスクリプトがあります。スクリプトは、ユーザーのホーム フォルダーにアクセスする必要があります。参照することはできません。~/.sshそうしないと、 に展開され/root/.sshます。代わりに、次のようにします。

# Up near the top of your script add
export HOME=$(bash <<< "echo ~${SUDO_USER:-}")
# Then you can use $HOME like you would expect
cat rsa_key.pub >> $HOME/.ssh/authorized_keys

スクリプトがsudoとして実行されない場合、$SUDO_USER は空であるため、基本的に「echo ~」を実行するのと同じことです。期待どおりに動作します。

を使用set -o nounsetする必要がある を使用すると、変数参照${SUDO_USER:-}はデフォルトで空白になり、を介して実行しない場合、$SUDO_USERまたはがエラーになります (設定されていないため) 。${SUDO_USER}sudo

于 2013-02-18T08:02:21.653 に答える
3

DIFFERENT ユーザーのホーム ディレクトリを見つけたいとします。明らかに、「user.home」プロパティを取得することが、現在のユーザー ホーム ディレクトリを取得する最も簡単な方法です。

任意のユーザー ホーム ディレクトリを取得するには、コマンド ラインで少し工夫が必要です。

String[] command = {"/bin/sh", "-c", "echo ~root"}; //substitute desired username
Process outsideProcess = rt.exec(command);
outsideProcess.waitFor();
String tempResult;
StringBuilder sb = new StringBuilder();
while((tempResult = br.readLine()) != null) sb.append(tempResult);
br.close();
return sb.toString().trim();

技術的には、stdout と stderr を待機するスレッドを用意して、バッファーがいっぱいになってプロセスをロックしないようにする必要がありますが、バッファーが少なくとも 1 つのユーザー名を保持できることを願っています。また、ユーザーが存在し、正しく評価されたことを確認するために、結果が ~root (または使用したユーザー名) で始まるかどうかを確認することもできます。

それが役立つことを願っています。SOに貢献するのが初めてで、ポイントを使用できる場合は、この回答に投票してください。

于 2011-05-25T16:28:10.377 に答える
3

そのために環境変数を使用できます$HOME

于 2009-01-29T14:50:32.483 に答える
2

eval echo ~$SUDO_USER

動作する可能性があります。

于 2013-10-29T10:48:33.313 に答える
1

関数の Java ラッパーを見つけますgetpwuid/getpwnam(3)。システムに uid またはログイン名でユーザー情報を要求すると、デフォルトのホーム ディレクトリを含むすべての情報が返されます。

于 2009-01-29T15:09:42.897 に答える
0

userdir プレフィックス (「/home」または「/export/home」など) は、構成項目である可能性があります。その後、アプリは任意のユーザー名をそのパスに追加できます。

警告: これは OS とインテリジェントに対話しないため、別のドライブに userdir がある Windows システムの場合、または /home/f/foo、/home のようなホーム ディレクトリ レイアウトの Unix の場合は運が悪いでしょう。 /b/バー。

于 2009-01-29T17:58:50.263 に答える