0

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

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

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

4

2 回答 2

1

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

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

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

于 2017-03-17T01:19:45.240 回答
1

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

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

就个人而言,我会检查是否$HOME是一个目录(例如 with if [[ -d "$HOME" ]]),如果是,就按原样使用它。如果不是,请/etc/passwd使用grepand解析它cut,可能会向 stderr 打印警告以提醒用户它们$HOME是坏的。您可以使用 grep 获取由 打印的 UID id -u,非 root 用户无法破坏该 UID。

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

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

于 2017-03-17T00:51:28.517 回答