【问题标题】:Overwritten HOME Variable覆盖的 HOME 变量
【发布时间】:2017-03-17 00:33:05
【问题描述】:

我最近了解到 ~ 指的是 HOME 变量。因此,如果我设置 HOME=/foo 然后尝试使用想要 cd ~/Documents 的 bash 脚本,它最终会说:

foo/Documents: 没有这样的文件或目录

在这种情况下,最佳做法是什么?崩溃并向用户抱怨他们覆盖了 HOME?或者有什么办法可以恢复HOME的默认值?

【问题讨论】:

  • 这取决于上下文。对于许多工具,环境变量构成界面的一部分(例如LC_* 和语言环境),您希望允许用户显式设置它们。在其他情况下,例如sudo,您希望清除环境以防止发生意外情况。你在用你的脚本做什么?
  • 如果他们更改HOME,这意味着他们希望应用程序将该目录视为他们的主目录。推翻他们的意愿不是你的责任。
  • 另一个恢复选项是使用$USER 在标准位置测试/home/$USER,如果您确实想恢复$HOME,可以使用它。现在明白了,这些都不能在脚本中完成并影响 shell。您可以更改脚本运行的进程的环境,但不能更改父进程的环境。因此,如果用户在脚本中更改了$HOME,请使用@Barmar 的评论。
  • @DavidC.Rankin:不能保证主目录实际上位于/home 下。虽然相对较少的系统仍将其置于/usr/ 之下,但它们仍在使用中。
  • @DavidC.Rankin 这是特定于操作系统的,在 OS X 上是 /Users/$USER

标签: bash unix tilde-expansion


【解决方案1】:

我认为您应该将其视为访问文件的任何其他问题。如果您尝试访问的文件不存在,或者您尝试在目录中创建文件但无法访问,则会打印一条错误消息。如果它对应用程序的运行很关键,则在报告错误后退出。

据我所知,大多数需要使用用户主目录的应用程序只使用HOME 环境变量,他们不会尝试第二次猜测。

这不应该有任何安全隐患。用户仍然需要适当的权限才能访问这些文件,因此重定向HOME 将不允许他们写入他们不应该写入的其他人的文件。如果您的应用程序是 set-uid,则在打开用户目录中的文件时,它应该始终恢复为用户 ID,而不是使用提升的权限。

【讨论】:

    【解决方案2】:

    用户主目录的真实来源是/etc/passwd,其中包含系统上每个用户的一行,列出了用户名、主目录和一些其他信息。如果您的问题是“某某的主目录是什么?”,那么您应该在 /etc/passwd.* 中查找它。*

    然而,虽然/etc/passwd 是正确的,但如果用户使用其他路径破坏了$HOME,他们可能希望您使用该值而不是“真正的”主目录。除非允许用户欺骗主目录存在安全问题,否则最好盲目地使用用户提供的值。

    就我个人而言,我会检查$HOME 是否是一个目录(例如if [[ -d "$HOME" ]]),如果是,就按原样使用它。如果不是,则使用grepcut 将其从/etc/passwd 中解析出来,可能会向stderr 打印警告以提醒用户他们的$HOME 是错误的。你可以grep获取id -u打印的UID,非root用户无法破解。

    如果您真的要担心$HOME 被破坏,那么您还应该担心$PATH$LC_* 变量和其他几个可能破坏各种事情的环境变量。最终,假设这些变量是正确的并按原样使用它们会更容易,除非存在安全问题。这意味着只是盲目地使用$HOME,不要太担心它会出错。

    * 在使用 LDAP 或类似网络系统来管理帐户的系统上,用户的帐户可能不会在此处列出。在某些情况下,有一个/etc/passwd.cache 或类似的东西,它可能包含用户,但这不能保证在每个系统上都有效。在whoami(1) 上运行strace(1) 可以帮助指出这些信息的来源。

    【讨论】:

    • /etc/passwd 中的哪一行?他们也可以覆盖$USER$LOGNAME
    • @Barmar:谢谢,已修复。
    • 可以有多个用户具有相同的 uid。用户名在登录时用于选择所需的/etc/passwd 行。我认为whoami/var/run/utmp 中查找与当前终端关联的用户名。
    • @Barmar:我是在看到你的评论之前写的,这就是为什么我在你回复之前删除了我的评论。
    • @Barmar:我strace'd whoami 并没有看到任何证据表明它打开了/var 下的任何文件。我很确定您实际上不能在不违反 POSIX 的情况下拥有多个具有相同 UID 的用户。
    猜你喜欢
    • 2012-10-19
    • 2018-09-27
    • 2017-02-25
    • 2021-08-24
    • 2020-09-30
    • 2015-12-04
    • 2013-06-06
    • 2018-02-27
    • 2018-04-23
    相关资源
    最近更新 更多