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