如何在Linux或UNIX上find用户的主目录?

如何从Grails中find任意用户的主目录? 在Linux上通常是/ home / user。 但是,在一些操作系统上,比如OpenSolaris,path是/ export / home / user。

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

通常你使用这个语句

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

在任何平台上获取用户的主目录。 查看getProperty的方法文档,看看你还能得到什么。

您可能想要通过使用此解决方法避免访问问题(使用安全策略文件)

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

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

在Java上试试这个:

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

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

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

如果你正在试图做这个你不能硬编码的用户名,这可能会很有挑战性。 肯定echo ~rbronosky会告诉你我的家dir /home/rbronosky的path,但如果rbronosky是在一个variables呢? 如果你的name=rbronosky; echo ~$name ~rbronosky name=rbronosky; echo ~$name你得到的name=rbronosky; echo ~$name ~rbronosky

这是一个真实世界的案例和解决scheme:

你有一个脚本,用户必须通过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 ,您应该使用它 ,您希望在此之前执行导出。

你可以使用环境variables$HOME

我假设你想find一个不同的用户的主目录。 显然获得“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的线程,所以缓冲区不会填满并locking进程,但是我确定希望缓冲区至less可以拥有一个用户名。 此外,您可能需要检查结果以查看是否以〜root(或您使用的任何用户名)开头,以确保用户确实存在且正确评估。

希望有所帮助。 如果这个答案投票,我是新的贡献,并可以使用点。

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

findgetpwuid/getpwnam(3)函数的Java包装,通过uid或login名向系统询问用户信息,并返回包括默认主目录的所有信息。

eval echo〜$ SUDO_USER

可能会工作。

你可以parsing/ etc / passwd吗?

例如:

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

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

警告:这不会与操作系统进行智能交互,所以如果是在不同驱动器上使用userdirs的Windows系统,或者在Unix上使用home / f / foo,/ home / b /巴。