web-dev-qa-db-ja.com

LinuxまたはUnixでユーザーのホームディレクトリを見つける方法は?

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

45
anon

UNIXライクシステムの場合、シェルを使用して "_echo ~username_"を実行できます(したがって、Runtime.exec()を使用して_{"/bin/sh", "-c", "echo ~username"}_を実行します)。

44
Joachim Sauer

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

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

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

this 回避策(セキュリティポリシーファイルの使用)を使用して、回避したいアクセスの問題があるかもしれません。

69
Daniel Hiller

Javaでこれを試してください:

System.out.println("OS: " + System.getProperty("os.name") + ", USER DIRECTORY: " + System.getProperty("user.home"));
7
Boubakr

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

private String getUserHome(String userName) throws IOException{
    return new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(new String[]{"sh", "-c", "echo ~" + userName}).getInputStream())).readLine();
}
5
paf0

ハードコーディングできないユーザー名に対してこれを行おうとしている場合、難しい場合があります。確かにecho ~rbronoskyは私のホームディレクトリ/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を使用する場合、使用する必要があります、それより前にエクスポートを実行します。

3
Bruno Bronosky

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

3
Torsten Marek

特定のユーザーのホームディレクトリを検索する場合、直接実行できるとは思わない。

以前にJavaからこれを行う必要があったとき、UNIX getpwXXX()ファミリーの呼び出しをラップするJNIネイティブコードを記述する必要がありました。

3
Alnitak

異なるユーザーのホームディレクトリを見つけたいと思います。明らかに、「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に貢献するのが初めてであり、ポイントを使用できる可能性があるため、この回答に投票してください。

2
Jared

UNIX風のシステムでユーザーFOOのホームディレクトリを検索するには、~FOO。現在のユーザーには、~

1
Yuliy

eval echo〜$ Sudo_USER

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

1
Ole Wolf

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

1
Keltia

/ etc/passwdを解析できますか?

例えば。:

 cat /etc/passwd | awk -F: '{printf "User %s Home %s\n",  $1, $6}'
0
Mark

Userdirプレフィックス(例: '/ home'または '/ export/home')は構成アイテムである可能性があります。その後、アプリはそのパスに任意のユーザー名を追加できます。

警告:これはOSとインテリジェントに相互作用しないため、異なるドライブにuserdirがあるWindowsシステムや、/ home/f/foo、/ homeのようなホームディレクトリレイアウトを持つUnixの場合は運が悪い/ b/bar。

0
Jeff