java-如何在Linux或UNIX上查找用户的主目录?
如何在Grails中找到任意用户的主目录? 在Linux上,通常是/ home / user。 但是,在某些操作系统上,例如OpenSolaris,路径为/ export / home / user。
13个解决方案
69 votes
通常您使用以下语句
String userHome = System.getProperty( "user.home" );
在任何平台上获取用户的主目录。 有关getProperty的信息,请参见方法文档,以了解还可以得到什么。
使用此替代方法,可能需要避免访问问题(使用安全策略文件)
Daniel Hiller answered 2020-07-07T18:47:40Z
44 votes
对于类似UNIX的系统,您可能希望使用外壳执行“ echo ~username”(因此,请使用Runtime.exec()运行{"/bin/sh", "-c", "echo ~username"})。
Joachim Sauer answered 2020-07-07T18:47:11Z
7 votes
在Java上尝试一下:
System.out.println("OS: " + System.getProperty("os.name") + ", USER DIRECTORY: " + System.getProperty("user.home"));
Boubakr answered 2020-07-07T18:47:59Z
5 votes
对于任意用户,作为网络服务器:
private String getUserHome(String userName) throws IOException{
return new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(new String[]{"sh", "-c", "echo ~" + userName}).getInputStream())).readLine();
}
paf0 answered 2020-07-07T18:48:19Z
3 votes
您可以为此使用环境变量$HOME。
Torsten Marek answered 2020-07-07T18:48:39Z
3 votes
如果要查找特定用户的主目录,我认为您不能直接执行。
当我需要从Java进行此操作之前,我不得不编写一些JNI本机代码,该代码包装了UNIX getpwXXX()系列调用。
Alnitak answered 2020-07-07T18:49:03Z
3 votes
如果您尝试使用无法硬编码的用户名来执行此操作,则可能会遇到挑战。 当然set -o nounset会告诉您我家目录的路径/root/.ssh,但是如果rbronosky在变量中怎么办? 如果您这样做name=rbronosky; echo ~$name您会得到~rbronosky
这是一个实际案例和解决方案:
您有一个用户必须通过sudo运行的脚本。 该脚本必须访问用户的主文件夹。 您不能引用set -o nounset,否则它将扩展为/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,则需要在此之前进行导出。
Bruno Bronosky answered 2020-07-07T18:49:42Z
2 votes
我假设您要查找其他用户的主目录。 显然,获取“ 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(或您使用的任何用户名)开头,以确保用户确实存在并且正确评估了该结果。
希望有帮助。 如果这样做对我来说是个新手,并且可以使用这些要点,请投票给它。
Jared answered 2020-07-07T18:50:16Z
1 votes
要在UNIX操作系统上为用户FOO查找主目录,请使用~FOO。对于当前用户,请使用~。
Yuliy answered 2020-07-07T18:50:35Z
1 votes
找到一个用于getpwuid/getpwnam(3)功能的Java包装器,他们通过uid或登录名向系统询问用户信息,然后您将获取所有信息,包括默认主目录。
Keltia answered 2020-07-07T18:50:56Z
1 votes
评估回声〜$ SUDO_USER
可能有用。
Ole Wolf answered 2020-07-07T18:51:20Z
0 votes
您可以解析/ etc / passwd吗?
例如:
cat /etc/passwd | awk -F: '{printf "User %s Home %s\n", $1, $6}'
Mark answered 2020-07-07T18:51:44Z
0 votes
userdir前缀(例如'/ home'或'/ export / home')可以是一个配置项。 然后,应用程序可以将任意用户名附加到该路径。
警告:这不会与操作系统进行智能交互,因此如果它是Windows系统,并且用户目录位于不同的驱动器上,或者是在Unix上具有主目录布局(例如/ home / f / foo,/ home),您将很不走运。 / b / bar。
Jeff answered 2020-07-07T18:52:08Z