如何从 Grails 中找到任意用户的主目录?在 Linux 上,它通常是 /home/user。但是,在某些操作系统上,例如 OpenSolaris,路径是 /export/home/user。
13 回答
通常你使用语句
String userHome = System.getProperty( "user.home" );
在任何平台上获取用户的主目录。请参阅getProperty的方法文档以了解您还能获得什么。
使用此解决方法可能会出现访问问题(使用安全策略文件)
对于类 UNIX 系统,您可能希望echo ~username
使用 shell 执行“”(因此使用Runtime.exec()
to run {"/bin/sh", "-c", "echo ~username"}
)。
在 Java 上试试这个:
System.out.println("OS: " + System.getProperty("os.name") + ", USER DIRECTORY: " + System.getProperty("user.home"));
对于任意用户,作为网络服务器:
private String getUserHome(String userName) throws IOException{
return new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(new String[]{"sh", "-c", "echo ~" + userName}).getInputStream())).readLine();
}
您可以为此使用环境变量$HOME
。
如果你想找到特定用户的主目录,我不相信你可以直接做到。
当我以前需要从 Java 中执行此操作时,我不得不编写一些 JNI 本机代码来包装 UNIXgetpwXXX()
系列调用。
我假设您想找到不同用户的主目录。显然,获取“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 上等待,这样缓冲区就不会填满并锁定进程,但我肯定希望缓冲区至少可以保存一个用户名。此外,您可能需要检查结果以查看它是否以 ~root (或您使用的任何用户名)开头,以确保用户确实存在并且它被正确评估。
希望有帮助。如果确实如此,请投票给这个答案,因为我是为 SO 做出贡献的新手并且可以使用这些积分。
如果您尝试为无法硬编码的用户名执行此操作,则可能具有挑战性。当然echo ~rbronosky
会告诉你我的 home 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
评估回声 ~$SUDO_USER
可能会奏效。
要在 UNIX 系统上查找用户 FOO 的主目录,请使用~FOO
. 对于当前用户,使用~
.
你能解析 /etc/passwd 吗?
例如:
cat /etc/passwd | awk -F: '{printf "User %s Home %s\n", $1, $6}'
查找函数的 Java 包装器getpwuid/getpwnam(3)
,它们通过 uid 或登录名向系统询问用户信息,然后您将返回所有信息,包括默认主目录。
userdir 前缀(例如,'/home' 或'/export/home')可以是一个配置项。然后应用程序可以将任意用户名附加到该路径。
警告:这不会与操作系统进行智能交互,所以如果它是一个 Windows 系统,用户目录位于不同的驱动器上,或者是 Unix 上的主目录布局,如 /home/f/foo、/home /b/酒吧。