为什么可以通过“chown”命令将不存在的用户指定为文件所有者?

为什么可以通过“chown”命令将不存在的用户指定为文件所有者?

为什么可以通过“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_rootsudo。这是一个所谓的限制,因为 root 始终可以使用或成为正确的用户su

  • Root“不能”使用 GNUrm来删除/。同样,这并不是真正的限制:有--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-driveman 8 hdparmDO 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 的命令是有意义的,以适应映射不存在的用例(在当前上下文中)。

相关内容