Grails内から任意のユーザーのホームディレクトリを見つけるにはどうすればよいですか? Linuxでは、多くの場合/ home/userです。ただし、たとえばOpenSolarisなどの一部のOSでは、パスは/ export/home/userです。
UNIXライクシステムの場合、シェルを使用して "_echo ~username
_"を実行できます(したがって、Runtime.exec()
を使用して_{"/bin/sh", "-c", "echo ~username"}
_を実行します)。
通常、次のステートメントを使用します
String userHome = System.getProperty( "user.home" );
任意のプラットフォームでユーザーのホームディレクトリを取得します。 getProperty のメソッドドキュメントを参照して、他に取得できるものを確認してください。
this 回避策(セキュリティポリシーファイルの使用)を使用して、回避したいアクセスの問題があるかもしれません。
Javaでこれを試してください:
System.out.println("OS: " + System.getProperty("os.name") + ", USER DIRECTORY: " + System.getProperty("user.home"));
Webサーバーとしての任意のユーザーの場合:
private String getUserHome(String userName) throws IOException{
return new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(new String[]{"sh", "-c", "echo ~" + userName}).getInputStream())).readLine();
}
ハードコーディングできないユーザー名に対してこれを行おうとしている場合、難しい場合があります。確かに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
を使用する場合、使用する必要があります、それより前にエクスポートを実行します。
そのために環境変数$HOME
を使用できます。
特定のユーザーのホームディレクトリを検索する場合、直接実行できるとは思わない。
以前にJavaからこれを行う必要があったとき、UNIX getpwXXX()
ファミリーの呼び出しをラップするJNIネイティブコードを記述する必要がありました。
異なるユーザーのホームディレクトリを見つけたいと思います。明らかに、「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に貢献するのが初めてであり、ポイントを使用できる可能性があるため、この回答に投票してください。
UNIX風のシステムでユーザーFOOのホームディレクトリを検索するには、~FOO
。現在のユーザーには、~
。
eval echo〜$ Sudo_USER
動作する可能性があります。
Java getpwuid/getpwnam(3)
関数のラッパーを見つけると、システムはuidまたはログイン名でユーザー情報を要求し、デフォルトのホームディレクトリを含むすべての情報を取得します。
/ etc/passwdを解析できますか?
例えば。:
cat /etc/passwd | awk -F: '{printf "User %s Home %s\n", $1, $6}'
Userdirプレフィックス(例: '/ home'または '/ export/home')は構成アイテムである可能性があります。その後、アプリはそのパスに任意のユーザー名を追加できます。
警告:これはOSとインテリジェントに相互作用しないため、異なるドライブにuserdirがあるWindowsシステムや、/ home/f/foo、/ homeのようなホームディレクトリレイアウトを持つUnixの場合は運が悪い/ b/bar。