了解 UNIX 权限和文件类型

了解 UNIX 权限和文件类型

直到今天我才真正明白是怎么chmod工作的。我遵循了一个教程,它向我解释了一件大事。

例如,我读到您拥有三个不同的权限组:

  • 所有者 (u
  • 团体 (g
  • 每个人 (o

基于这三组,我现在知道:

  • 如果文件归用户所有,则用户权限决定访问权限。
  • 如果文件所属组与用户所属组相同,则以组权限决定访问权限。
  • 如果用户不是文件所有者,并且不在该组中,则使用其他权限。

我还了解到您拥有以下权限:

  • 读 (r
  • 写 (w
  • 执行 (x

我创建了一个目录来测试我新获得的知识:

mkdir test

然后我做了一些测试:

chmod u+rwx test/
# drwx------
chmod g+rx test/
# drwxr-x---
chmod u-x test/
# drw-r-x---

经过一段时间的闲逛后,我想我终于掌握了使用此命令设置权限的窍门chmod和方式。


但...

我还有几个问题:

  • d开头的 代表什么?
  • 包含槽的名称和用途是什么?它还可以容纳哪些其他值?
  • 我该如何设置和取消设置?
  • 这有什么价值d? (因为你只有 7=4+2+1 7=4+2+1 7=4+2+1)
  • 为什么人们有时会使用0777而不是777设置权限?

但由于我不应该问多个问题,所以我会尝试在一个问题中提出。

在基于 UNIX 的系统中,例如所有 Linux 发行版,关于权限,第一部分(d)代表什么?这部分权限有什么用?

答案1

我将分三个部分回答您的问题:文件类型、权限以及各种形式的chmod.

文件类型

输出中的第一个字符ls -l代表文件类型;d意味着它是一个目录。它无法设置或取消设置,这取决于文件的创建方式。您可以在以下位置找到完整的文件类型列表ls 文档;你可能会遇到的是

  • -:“常规”文件,使用任何可以写入文件的程序创建
  • b:块特殊文件,通常是磁盘或分区设备,可以使用以下命令创建mknod
  • c:字符特殊文件,也可以使用创建mknod(参见/dev示例)
  • d:目录,可以使用以下命令创建mkdir
  • l:符号链接,可以使用以下命令创建ln -s
  • p:命名管道,可以使用以下命令创建mkfifo
  • s:套接字,可以使用以下命令创建nc -U
  • D:,由 Solaris/openindiana 上的某些服务器进程创建。

权限

chmod 0777用于在一次chmod执行中设置所有权限,而不是组合更改u+等。四个数字中的每一个都是代表一组权限的八进制值:

  • suidsgid“粘性”(见下文)
  • 用户权限
  • 组权限
  • “其他”权限

八进制值计算为权限的总和:

  • “读”为 4
  • “写”是2
  • “执行”为 1

对于第一个数字:

  • suid是 4;设置了此位的二进制文件以其所有者用户身份运行(通常root
  • sgid是 2;具有此位设置的二进制文件作为其所有者组运行(这用于游戏,因此可以共享高分,但与游戏中的漏洞结合使用时通常会存在安全风险),并且在具有此位设置的目录中创建的文件属于默认情况下目录的所有者组(这对于创建共享文件夹很方便)
  • “粘性”(或“限制删除”)为 1;设置了此位的目录中的文件只能由其所有者、目录所有者或root(请参阅/tmp参考资料 中的常见示例)删除。

联机chmod帮助页了解详情。请注意,在这一切中,我忽略了其他可以更改用户对文件的权限的安全功能(SELinux、文件 ACL...)。

根据文件类型(常规文件或目录)和底层系统,特殊位的处理方式有所不同。 (手册页中提到了这一点chmod。)在我用来测试这一点的系统上(文件系统为coreutils8.23 ext4,运行 Linux 内核 3.16.7-ckt2),行为如下。对于文件,除非显式设置,否则特殊位始终会被清除,因此chmod 0777相当于chmod 777,并且这两个命令都会清除特殊位并授予每个人对该文件的完全权限。对于目录,特殊位永远不会使用四位数字形式完全清除,因此实际上chmod 0777也相当于chmod 777但它具有误导性,因为某些特殊位将保持原样。 (此答案的先前版本犯了这个错误。)要清除目录上的特殊位,您需要使用u-s,g-s和/或o-t显式指定或指定负数值,因此chmod -7000将清除目录上的所有特殊位。

ls -l输出中suidsgid和“sticky” 出现在条目的位置xsuidsS代替用户的xsgidsS代替组的x,“sticky” 是tT代替其他人的x。小写字母表示特殊位和可执行位都被置位;大写字母表示仅设置了特殊位。

chmod 的各种形式

由于上述行为,使用完整的四位数字chmod可能会令人困惑(至少事实证明我很困惑)。当您想要设置特殊位和权限位时,它很有用;否则,如果您正在操作文件,则这些位将被清除;如果您正在操作目录,则这些位将被保留。所以chmod 2750确保你至少能sgid准确地得到u=rwx,g=rx,o=;但chmod 0750不一定会清除特殊位。

使用数字模式而不是文本命令 ( [ugo][=+-][rwxXst]) 可能更多的是一种习惯和命令的目的。一旦您习惯使用数字模式,通常更容易以这种方式指定完整模式;能够使用数字模式来考虑权限是很有用的,因为许多其他命令可以使用它们(installmknod...)。

一些文本变体可以派上用场:如果您只是想确保任何人都可以执行文件,那么chmod a+x无论其他权限是什么,都会这样做。同样,+X仅当已设置执行权限之一或文件是目录时才添加执行权限;这可以方便地全局恢复权限,而无需特殊情况的文件和目录。因此,chmod -R ug=rX,u+w,o=相当于应用于chmod -R 750所有目录和可执行文件以及chmod -R 640所有其他文件。

答案2

所以,Linux中的权限非常重要。我将尝试做一个简短的解释。

对于文件模式的碎片

每个 Unix 文件都有一组权限,决定您是否可以读取、写入或运行该文件。运行 ls -l 显示权限。以下是此类显示的示例:

-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile

我附上文件模式片段的图像:

在此输入图像描述

类型可以是不同的东西。例如:

  • d(目录)
  • c(字符设备)
  • l(符号链接)
  • p(命名管道)
  • S(插座)
  • b(块设备)
  • D(门,在Linux系统上不常见,但已被移植)

如果你想为所有目录设置一些权限,你可以使用 R 属性,例如:

chmod -R 777 /some/directory/

对于 chmod 777 与 0777

chmod命令通常期望输入是八进制数,前导零指的是 Sticky/sgid/suid 位三元组的值。然而,在 C 中,它会有所不同,因为777会被转换为01411(八进制),从而设置粘性位(请参阅chmod(2)手册页),所有者的读取权限以及组和其他人的可执行位(这是一个相当奇怪的组合) 。

编辑1

我找到了其他关于 Linux 权限的图片,我将附上它以更容易理解: UNIX 文件权限

答案3

d意味着它是一个目录,如果你有一个文件,它是一个文件-,如果它是一个链接,你会发现一个l.无法设置/取消设置。

如果您使用 0777 作为权限,您将向系统的每个用户/组授予完全控制权(读+写+执行)。当您的用户/组无法访问目录/文件时,这是解决问题的一种懒惰方法。

例如,如果列出目录的内容并得到:

-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so

预加载_libintl.so是用户 root 和组 root 拥有的文件。这所有者具有读和写访问权限,团体仅有读取权限并且任何其他用户具有读取权限。这可以翻译为644。

如果我将其更改为 777,它将如下所示:

-rwxrwxrwx 1 root root 42596 jun 7 2012 preloadable_libintl.so

答案4

对于d题

这告诉您 Unix 文件类型。默认情况下,Unix 只有 3 种类型的文件。他们是:

  • -- 常规文件
  • d- 目录文件
  • 特殊文件(有5个子类型):
    • b- 块文件
    • c- 字符设备文件
    • p- 命名管道文件或只是管道文件
    • l- 符号链接文件
    • s- 套接字文件

在这里阅读更多内容:Linux/Unix 中的文件类型详细解释

0777777

是否指定粘滞位。设置目录的粘滞位后,文件系统会以特殊方式处理此类目录中的文件,因此只有文件所有者、目录所有者或 root 用户可以重命名或删除该文件。如果没有设置粘性位,则任何对该目录具有写入和执行权限的用户都可以重命名或删除所包含的文件,而不管文件的所有者是谁。

0777设置 777 文件权限,并将粘性位设置为 0 - 无特殊模式。

777正在设置 777 文件权限,而不更改粘滞位。

阅读更多:粘性位chmod

相关内容