48

如何从 Grails 中找到任意用户的主目录?在 Linux 上,它通常是 /home/user。但是,在某些操作系统上,例如 OpenSolaris,路径是 /export/home/user。

4

13 回答 13

69

通常你使用语句

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

在任何平台上获取用户的主目录。请参阅getProperty的方法文档以了解您还能获得什么。

使用此解决方法可能会出现访问问题(使用安全策略文件)

于 2009-01-30T07:04:25.700 回答
53

对于类 UNIX 系统,您可能希望echo ~username使用 shell 执行“”(因此使用Runtime.exec()to run {"/bin/sh", "-c", "echo ~username"})。

于 2009-01-29T17:46:41.973 回答
7

在 Java 上试试这个:

System.out.println("OS: " + System.getProperty("os.name") + ", USER DIRECTORY: " + System.getProperty("user.home"));
于 2014-02-20T13:37:49.160 回答
5

对于任意用户,作为网络服务器:

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

您可以为此使用环境变量$HOME

于 2009-01-29T14:50:32.483 回答
3

如果你想找到特定用户的主目录,我不相信你可以直接做到。

当我以前需要从 Java 中执行此操作时,我不得不编写一些 JNI 本机代码来包装 UNIXgetpwXXX()系列调用。

于 2009-01-29T14:58:49.550 回答
3

我假设您想找到不同用户的主目录。显然,获取“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 做出贡献的新手并且可以使用这些积分。

于 2011-05-25T16:28:10.377 回答
3

如果您尝试为无法硬编码的用户名执行此操作,则可能具有挑战性。当然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

于 2013-02-18T08:02:21.653 回答
2

评估回声 ~$SUDO_USER

可能会奏效。

于 2013-10-29T10:48:33.313 回答
1

要在 UNIX 系统上查找用户 FOO 的主目录,请使用~FOO. 对于当前用户,使用~.

于 2009-01-29T14:58:31.453 回答
1

你能解析 /etc/passwd 吗?

例如:

 cat /etc/passwd | awk -F: '{printf "User %s Home %s\n",  $1, $6}'
于 2009-01-29T15:02:32.740 回答
1

查找函数的 Java 包装器getpwuid/getpwnam(3),它们通过 uid 或登录名向系统询问用户信息,然后您将返回所有信息,包括默认主目录。

于 2009-01-29T15:09:42.897 回答
0

userdir 前缀(例如,'/home' 或'/export/home')可以是一个配置项。然后应用程序可以将任意用户名附加到该路径。

警告:这不会与操作系统进行智能交互,所以如果它是一个 Windows 系统,用户目录位于不同的驱动器上,或者是 Unix 上的主目录布局,如 /home/f/foo、/home /b/酒吧。

于 2009-01-29T17:58:50.263 回答