如何在linux或unix上找到用户的主目录?

时间:2009-01-29 14:48:42

标签: java linux unix grails

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

13 个答案:

答案 0 :(得分:69)

通常使用语句

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

在任何平台上获取用户的主目录。请参阅getProperty的方法文档,了解您还可以获得哪些内容。

使用this解决方法(使用安全策略文件)可能存在您可能想要避免的访问问题

答案 1 :(得分:44)

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

答案 2 :(得分:6)

在Java上试试这个:

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:3)

您可以使用环境变量$HOME

答案 5 :(得分:3)

如果您想查找特定用户的主目录,我不相信您可以直接进行。

当我需要在Java之前执行此操作时,我必须编写一些包含UNIX getpwXXX()系列调用的JNI本机代码。

答案 6 :(得分:3)

如果您尝试为无法硬编码的用户名执行此操作,则可能具有挑战性。当然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~”基本相同。它仍然可以按预期工作。

如果您使用 should be using set -o nounset,则需要在此之前进行导出。

答案 7 :(得分:2)

我假设您要查找不同用户的主目录。显然,获取“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(或您使用的任何用户名)开头,以确保用户确实存在并正确评估。

希望有所帮助。投票给这个答案,如果我这样做,因为我是新来的,可以使用积分。

答案 8 :(得分:1)

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

答案 9 :(得分:1)

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

答案 10 :(得分:1)

eval echo~ $ SUDO_USER

可能有用。

答案 11 :(得分:0)

你能解析/ etc / passwd吗?

e.g:

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

答案 12 :(得分:0)

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

警告:这不会与操作系统进行智能交互,所以如果它是一个在不同驱动器上有用户用户的Windows系统,或者在带有/ home / f / foo等主目录布局的Unix上,你就会失败。 ,/ home / b / bar。