为什么可以通过“chown”命令将不存在的用户指定为文件所有者?
举个例子
sudo chown 03:03 ./test/f2
ls -l
-rw-r--r-- 1 3 sys 0 nov 7 17:45 f2
sudo chown 1555552:03 ./test/f5
ls -l
-rw-r--r-- 1 3 19508 0 nov 7 18:04 f5
答案1
Linux 的设计目的不是照顾你,而是服从你。好吧,作为普通用户,你的行为是有限的,这是有道理的;但要运行 Linux,chown
你无论如何都需要 root 权限,而 Linux 是当然设计遵循根。
秉承这一理念,我们无需任何理由即可chown
允许将“不存在”的用户指定为所有者。相反,我们需要一个好的理由才能chown
拒绝此操作。
为了进行比较,下面是 root 无法(或“不能”)执行某些操作的几个示例:
/dev/mem
不再像以前那么容易访问。有一个很好的理由:除了 BIOS 区域之外,没有其他有效的应用程序会占用
/dev/mem
实际内存。其他常见的用户/dev/mem
是 rootkit 等。为了避免这种情况,需要使用正确的选项编译内核。这不可能在一分钟内自动完成。这意味着访问
/dev/mem
是 root 无法按需执行的操作。不过,提前规划、提前编译和启动重新配置的内核可以让 root 执行此操作。Root“无法”访问其他用户的 FUSE,除非 FUSE 启动时
allow_root
sudo
。这是一个所谓的限制,因为 root 始终可以使用或成为正确的用户su
。Root“不能”使用 GNU
rm
来删除/
。同样,这并不是真正的限制:有--no-preserve-root
一个选项可以让它工作。重点是防止在之后rm -rf /
出现失误,或者在您不期望的时候出现空的情况。Enter/
rm -rf /'some dir'
rm -rf /"$var"
$var
即使是 root 用户“也不能”使用 的某些功能。如果所选功能很危险,
hdparm
该工具会要求用户提供--yes-i-know-what-i-am-doing
或标志。请注意,在几个选项旁边会显示或类似内容,但这些选项--please-destroy-my-drive
man 8 hdparm
DO NOT USE!
DON'T EVEN THINK ABOUT USING IT
是有支持和决心的根源才能使用它们。这是哲学的一个极好的应用。
如您所见,只有第一个例子才是真正的限制。现在,是否有理由限制 root 的使用chown
(真的或据称)?让我们看看……
文件系统将所有权存储为 ID,即数字,它们不关心这些数字是否与名称相对应。分配与任何名称无关的用户 ID 不会破坏文件系统本身。文件系统级别没有问题。
/etc/sudoers
如果重要文件(例如)被错误地分配给用户,则操作系统级别会出现问题chown
。错误的用户 ID 就是错误的,无论它是否是“现有”(命名)用户。这不是“现有用户”与“不存在用户”的问题,而是“正确用户”与“其他用户”的问题。
因此,如果我们想chown
施加一些限制以防止我们破坏某些东西,它应该知道要保护哪些文件以及如何保护。简单地不允许“不存在”的用户几乎没有意义,因为您可以通过将命名的(但错误的)用户分配给关键文件来同样轻松地破坏某些东西。
允许“不存在”的用户实际上很有用,其他答案给出了有效的例子,我不会重复它们。即使我们不知道它有用的场景,在我看来它仍然应该被允许和支持。几年前我从 Windows 转到 Linux,原因之一是 Windows 太频繁地“自以为更了解”(注意:我不知道新版本的 Windows 是否仍然这样做)。
答案2
您可以在文章中找到解释 如何在 Ubuntu 上将 chown 改为不存在的用户?
(粗体部分是我画的。)
总之,虽然 chown 需要有效的用户或组名来更改所有权,但您仍然可以使用其数字 UID 和 GID 为不存在的用户分配所有权。这在处理在另一个系统上创建的文件和目录时,或者为新用户准备系统时特别有用。
您发现的实际上是一个chown
旨在解决为另一个系统或未来用户准备文件的问题的功能。
答案3
从历史上看(**),在您登录到 UNIX 系统后,您只是一个数字(您的 UID)并且您拥有一组组(也只是数字 GID)。
** - 有带有 ACL 的较新的权限系统
在后台,大多数安全检查都是使用数字而不是您的用户名或组名进行的。从这个角度来看,不存在“不存在”的用户或组,在这两种情况下,它们都只是“未命名”的用户/组 - 即用户 5042 存在,只是没有名称。
然而,即使在一台机器上,名称到 ID 的映射也可能不同,例如:
- 在 Docker 容器内。
- 使用 chroot 命令后。
- 安装远程文件系统(NFS)。
- 使用特定的 squish 选项挂载文件系统。
因此,允许输入原始 ID 的命令是有意义的,以适应映射不存在的用例(在当前上下文中)。