Java 如何找到用户';linux或unix上的主目录是什么?

Java 如何找到用户';linux或unix上的主目录是什么?,java,linux,unix,grails,Java,Linux,Unix,Grails,如何从Grails中找到任意用户的主目录?在Linux上,它通常是/home/user。但是,在某些操作系统上,例如OpenSolaris,路径是/export/home/user。您可以使用环境变量$home。要在UNIX ish系统上查找用户FOO的主目录,请使用~FOO。对于当前用户,请使用~如果您想查找特定用户的主目录,我认为您不能直接查找 以前我需要从Java编写一些JNI本机代码来包装UNIXgetpwXXX()调用系列。您能解析/etc/passwd吗 e、 g: 为getpwui

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

您可以使用环境变量
$home

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

如果您想查找特定用户的主目录,我认为您不能直接查找


以前我需要从Java编写一些JNI本机代码来包装UNIX
getpwXXX()
调用系列。

您能解析/etc/passwd吗

e、 g:


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

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

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


警告:这不会智能地与操作系统交互,因此如果它是一个Windows系统,在不同的驱动器上有userdir,或者在Unix上有/home/f/foo、/home/b/bar等home dir布局,那么你就不走运了。

通常你会使用这个语句

String userHome = System.getProperty( "user.home" );
在任何平台上获取用户的主目录。请参阅的方法文档,了解您还可以获得什么


对于任意用户,您可能希望通过使用变通方法(使用安全策略文件)来避免访问问题,如Web服务器:

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

我假设您想查找其他用户的主目录。显然,获取“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
会告诉您my 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
#在脚本顶部附近添加
export HOME=$(bash$HOME/.ssh/authorized_密钥
它的美妙之处在于,如果脚本不是以sudo的形式运行,那么$sudo_USER是空的,因此它基本上与执行“echo~”是一样的。它仍然可以按照您的预期工作

如果使用
set-o nounoset
,变量引用
${SUDO_USER:-}
将默认为空,其中
$SUDO_USER
${SUDO_USER}
如果不通过
SUDO
运行,将给出错误(因为它未设置)

可能有用。

在Java上试试这个:

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

当使用传统unix用户帐户以外的任何帐户(例如nis或winbindg)时,这都不起作用。这仅由shell解释,而不是内核/库。例如,应用程序服务器将作为生产用户运行,并位于/opt中。这可能有效,也可能无效,取决于生产帐户的设置方式。因此,询问生产用户的主目录可能不是答案。OP询问的是arb的主目录itrary user.But
user.home
是当前用户中的一个。如果您从当前用户的家转到父用户,然后使用指定的用户名转到目录,这种方法是否总是有效?使用“echo~username”似乎是最简洁的答案。我看到很多人键入“cd/home/username”inst“cd~username”的ead…当然,如果你不需要的话,你永远不应该退出。但是由于Java没有为此提供API,我能想到的唯一替代方法是JNI,它甚至比调用shell更糟糕。如果你是以你要查找的主目录的用户身份登录的话,运行
echo~
似乎可以解决这个问题这里的超精确--
/bin/sh
在POSIX下保证是符合Bourne标准的外壳,但需要扩展(
~
~user
)不是此类shell所需的功能之一。Linux发行版使用BASH作为
/bin/sh
,对其进行tilde扩展。如果在某些其他UNIX操作系统下使用
/bin/sh
运行
echo~
,则只需返回tilde即可(例如
“~”
)而不是主目录路径。这没有回答问题。他们没有问如何找到自己的主目录,而是问如何找到用户的主目录。~directory常量对您有什么帮助吗?您能说得更具体一点吗?您是查找运行grails的用户的主目录,还是查找运行grails的用户的主目录你有名字或UID的任意用户?系统上的任意用户。谢谢。我在找什么。这在shell脚本中很有用。三个@BBrown是什么意思,我很高兴
System.out.println("OS: " + System.getProperty("os.name") + ", USER DIRECTORY: " + System.getProperty("user.home"));