【问题标题】:How to find a user's home directory on linux or unix?如何在 linux 或 unix 上找到用户的主目录?
【发布时间】:2010-10-04 06:16:21
【问题描述】:

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

【问题讨论】:

  • ~目录常量对你有什么帮助吗?
  • 你能再具体一点吗?您是查找运行 grails 的用户的主目录,还是查找您拥有其名称或 UID 的任意用户的主目录?
  • 系统上的任意用户。

标签: java linux unix grails


【解决方案1】:

通常你使用语句

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

在任何平台上获取用户的主目录。请参阅getProperty 的方法文档,了解您还能获得什么。

您可能希望通过使用this 解决方法(使用安全策略文件)来避免访问问题

【讨论】:

  • 应用服务器将以生产用户身份运行,并位于 /opt 中。这可能有效,也可能无效,具体取决于生产帐户的设置方式。因此,询问生产用户的主目录可能不是答案。
  • OP 要求任意用户的家。但是user.home 是当前用户之一。如果您要从当前用户的主目录转到父目录,然后再转到具有指定用户名的目录,此方法是否始终有效?
【解决方案2】:

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

【讨论】:

  • 推出一个“echo ~username”似乎是最简洁的答案。我看到很多人输入 'cd /home/username' 而不是 'cd ~username' ......当然,如果你不需要的话,你永远不应该掏钱。
  • 但是由于Java没有为此提供API,所以我能想到的唯一选择是JNI,这比调用shell还要糟糕。
  • 运行echo ~ 似乎可以解决问题,如果您以您要查找的主目录的用户身份登录。
  • 这里要超级精确——/bin/sh 在 POSIX 下保证是符合 Bourne 的 shell,但波浪号扩展(~~user)不是必需的功能之一这样的壳。 Linux 发行版使用 BASH 作为/bin/sh,波浪号扩展适用于此。如果您在其他 UNIX 操作系统下使用 /bin/sh 运行 echo ~,则可以只返回波浪号(例如 "~")而不是主目录路径。
  • 这没有回答问题。他们没有问如何找到自己的主目录,而是问如何找到用户的主目录。
【解决方案3】:

在 Java 上试试这个:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      您可以为此使用环境变量$HOME

      【讨论】:

      • $HOME 会根据登录的用户而变化。我不明白如何使用它来查找任意用户的家。
      【解决方案6】:

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

      当我之前需要从 Java 中执行此操作时,我不得不编写一些 JNI 本机代码来包装 UNIX getpwXXX() 系列调用。

      【讨论】:

        【解决方案7】:

        我假设您想查找不同用户的主目录。显然获取“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 做出贡献的新手并且可以使用积分。

        【讨论】:

          【解决方案8】:

          如果您尝试为无法硬编码的用户名执行此操作,则可能具有挑战性。当然echo ~rbronosky 会告诉你我的主目录/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 ~”是一样的。它仍然可以按您的预期工作。

          如果你使用set -o nounset,你should be using,变量引用${SUDO_USER:-}将默认为空白,其中$SUDO_USER${SUDO_USER}会给出一个错误(因为它是未设置)如果不是通过sudo运行。

          【讨论】:

          • 谢谢。我在找什么。这在 shell 脚本中很有用。
          • 三元组
          • tldp.org/LDP/abs/html/abs-guide.html 的 19.1 处描述为“此处的字符串”。
          • @BBrown,很高兴你找到它。这里的字符串是一种避免不必要的子shell的方法。我很惊讶他们没有在无用回声奖中提到。 partmaps.org/era/unix/award.html#echo 现在你知道了 herestrings(比如 heredocs),想象一下如果没有它,它会有多不可读……export HOME=$(echo "echo ~$SUDO_USER" | bash)“echo echo?什么?”
          【解决方案9】:

          评估回声 ~$SUDO_USER

          可能会起作用。

          【讨论】:

            【解决方案10】:

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

            【讨论】:

            • 这仅由 shell 解释,而不是内核/库。
            【解决方案11】:

            你能解析 /etc/passwd 吗?

            例如:

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

            【讨论】:

            • 当使用传统的 unix 用户帐户(例如 nis 或 winbindg)时,这不起作用。
            【解决方案12】:

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

            【讨论】:

              【解决方案13】:

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

              警告:这不会与操作系统进行智能交互,所以如果它是一个 Windows 系统,用户目录位于不同的驱动器上,或者是 Unix 上的主目录布局,如 /home/f/foo , /home/b/bar.

              【讨论】:

                猜你喜欢
                • 2016-04-27
                • 1970-01-01
                • 1970-01-01
                • 2010-12-01
                • 2010-12-26
                • 2012-05-03
                • 2016-06-27
                • 1970-01-01
                • 2011-02-09
                相关资源
                最近更新 更多