如何在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 /巴。
- 如何使用groovyparsingjson
- 为什么我在Grails中使用HibernateCriteriaBuilder的时候得到一个“空值赋给原始typessetter的属性”错误信息
- hibernateGrails应用程序中的第二级caching
- 如何增加IntelliJ中打开的编辑器的最大数量?
- Grails BuildConfig.groovy,构build,编译和运行时间的区别?
- 在OS X上的Intellij IDEA设置
- 在Grails中findAll,getAll和list之间的区别
- 基于Linux OpenJDK Debian的发行版的JAVA_HOME环境variables的正确目标是什么?
- 将base64string转换为图像