Grails 内から任意のユーザーのホーム ディレクトリを見つけるにはどうすればよいですか? Linux では多くの場合、/home/user です。ただし、OpenSolaris などの一部の OS では、パスは /export/home/user です。
13 に答える
通常、ステートメントを使用します
String userHome = System.getProperty( "user.home" );
任意のプラットフォームでユーザーのホーム ディレクトリを取得します。他に取得できるものについては、 getPropertyのメソッド ドキュメントを参照してください。
この回避策 (セキュリティ ポリシー ファイルの使用) を使用することで、回避したいアクセスの問題が発生する可能性があります。
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"}
).
任意のユーザーの場合、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
に私のホーム 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
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に貢献するのが初めてで、ポイントを使用できる場合は、この回答に投票してください。
そのために環境変数を使用できます$HOME
。
eval echo ~$SUDO_USER
動作する可能性があります。
関数の Java ラッパーを見つけますgetpwuid/getpwnam(3)
。システムに uid またはログイン名でユーザー情報を要求すると、デフォルトのホーム ディレクトリを含むすべての情報が返されます。
userdir プレフィックス (「/home」または「/export/home」など) は、構成項目である可能性があります。その後、アプリは任意のユーザー名をそのパスに追加できます。
警告: これは OS とインテリジェントに対話しないため、別のドライブに userdir がある Windows システムの場合、または /home/f/foo、/home のようなホーム ディレクトリ レイアウトの Unix の場合は運が悪いでしょう。 /b/バー。