覆盖 HOME 变量

Overwritten HOME Variable

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

foo/Documents: 没有那个文件或目录

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

用户主目录的真实来源是 /etc/passwd,其中包含系统上每个用户的一行,列出了用户名、主目录和一些其他信息。如果您的问题是 "what is so-and-so's home directory?",那么您应该在 /etc/passwd.*

中查找

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

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

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

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

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

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

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