java获取linux目录_java-如何在Linux或UNIX上查找用户的主目录?

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值