了解 UNIX 权限和文件类型

Pet*_*ter 85 linux ls permissions chmod

chmod直到今天,我才真正了解如何工作。我遵循了一个向我解释了很多事情的教程。

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

  • 业主 ( u)
  • 组 ( g)
  • 大家(o

基于这三个群体,我现在知道:

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

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

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

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

mkdir test
Run Code Online (Sandbox Code Playgroud)

然后我做了一些测试:

chmod u+rwx test/
# drwx------
chmod g+rx test/
# drwxr-x---
chmod u-x test/
# drw-r-x---
Run Code Online (Sandbox Code Playgroud)

经过一段时间的鬼混后,我想我终于掌握chmod了使用此命令设置权限的方法。


但...

我还有几个问题:

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

但因为我不应该问多个问题,所以我会尝试用一个问题来问它。

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

Ste*_*itt 141

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

文件类型

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

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

权限

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

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

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

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

对于第一个数字:

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

请参阅chmod手册页了解详情。请注意,在所有这些中,我忽略了其他安全功能,这些功能可以改变用户对文件的权限(SELinux、文件 ACL...)。

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

ls -l输出中suidsgid和 “sticky” 出现在x条目的位置:suidsS代替用户的xsgidsS代替组的x,以及 “粘性” 是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所有其他文件。


小智 46

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

对于文件模式的碎片

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

-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile
Run Code Online (Sandbox Code Playgroud)

我附上一个文件模式的图片:

在此处输入图片说明

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

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

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

chmod -R 777 /some/directory/
Run Code Online (Sandbox Code Playgroud)

对于 chmod 777 与 0777

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

编辑 1

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

  • 你对 777 和 0777 的看法是错误的。两者都是八进制(在这种情况下,十进制无论如何都没有意义),但在四字符形式中,第一个数字设置特殊位(粘性和 setuid)。 (5认同)
  • Python Master Race 通过禁止所有以 0 开头的“数字”解决了这个倒退问题,如果用户想要十进制以外的任何内容,则强制用户明确表示,例如十六进制:`0x1FF`,二进制:`0b111111111` 或八进制:`0o777` . 蟒蛇动力 (4认同)
  • @orion 有时它实际上是真的,例如在类似 C 的代码中`chmod(777)` 实际上相当于运行 `chmod 1411`(即带有参数 `1411` 的 `chmod` 命令)。 (3认同)
  • ...在系统调用(或其包装器)和具有相同名称的二进制文件的情况下,这可能有点令人困惑。 (2认同)

jcb*_*rmu 10

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

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

例如,如果您列出目录的内容并得到以下信息:

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

preloadable_libintl.so是用户 root 和组 root 拥有的文件。该业主有读写访问,该集团拥有只读访问和任何其他用户具有读取权限。这可以翻译为 644。

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

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


Pet*_*ter 7

在这里回答了我的问题并对结果进行了一些研究后,我找到了一篇文章,它很好地解释了这一切。我想在这里分享本文的某些部分以供将来参考。

查看权限

为了使用chmod更改文件或目录的权限,您首先需要知道当前的访问模式是什么。您可以通过cd该目录查看终端中目录的内容,然后使用:

$ ls -l
Run Code Online (Sandbox Code Playgroud)

-l,因为使用开关是非常重要的ls,没有它只会显示在目录中的文件或文件夹的名称。

以下是ls -l在我的主目录上使用的示例:

total 128
drwxr-xr-x 2 peter users  4096 Jul  5 21:03 Desktop
drwxr-xr-x 6 peter users  4096 Jul  5 17:37 Documents
drwxr-xr-x 2 peter users  4096 Jul  5 13:45 Downloads
drwxr-xr-x 2 peter users  4096 Jun 24 03:36 Movies
drwxr-xr-x 2 peter users  4096 Jun 24 03:38 Music
drwxr-xr-x 2 peter users  4096 Jun 26 00:09 Pictures
-rw-r--r-- 1 peter users   354 Jul  6 17:15 chmodtest
Run Code Online (Sandbox Code Playgroud)

列的含义

第一列是每个文件的类型:

  • - 表示普通文件。
  • d 表示目录,即包含其他文件或文件夹的文件夹。
  • p 表示命名管道(又名 FIFO)。
  • l 表示符号链接。

后面的字母是权限,第一列是我们最感兴趣的。第二列是文件中有多少个链接,我们可以放心地忽略它。第三列有两个值/名称:第一个(在我的示例中为“peter”)是拥有该文件的用户的名称。第二个值(示例中的“用户”)是所有者所属的组(阅读有关组的更多信息)。

下一列是文件或目录的大小(以字节为单位),之后的信息是文件或目录上次修改的日期和时间,当然还有文件或目录的名称。

权限是什么意思

在第一个-or之后的前三个字母d是所有者拥有的权限。接下来的三个字母是适用于该组的权限。最后三个字母是适用于其他所有人的权限。

每组三个字母由r w和 组成xr总是在第一个位置,w总是在第二个位置,x总是在第三个位置。r是读权限,w是写权限,x是执行权限。如果-在这些字母之一的位置有一个连字符 ( ),则表示未授予许可,如果存在该字母,则表示授予许可。

文件夹

在文件夹的情况下,模式位可以解释如下:

  • r (read) 代表能够读取给定目录的目录,
  • w(write) 代表当且仅当设置了执行位时写入给定目录的目录的能力(创建新文件、文件夹;重命名、删除现有文件、文件夹)。否则,这个权限是没有意义的。
  • x (execute) 代表能够使用命令 cd 进入给定目录并访问该目录中的文件和文件夹。

使用 chmod 命令更改权限

chmod是 Linux 和其他类 Unix 操作系统中的命令。它允许您更改文件或目录的权限(或访问模式)。

您可以通过两种不同的方式更改权限: - 基于文本 - 基于chmod 数字chmod

文字法

要更改文件的权限或访问模式,我们在终端中使用 chmod 命令。下面是命令的一般结构:

chmod who=permissions filename
Run Code Online (Sandbox Code Playgroud)

哪里 Who 是一系列字母中的任意一个,每个字母都表示您将向谁授予权限。它们如下:

u - The user that owns the file.
g - The group the file belongs to.
o - The other users i.e. everyone else.
a - all of the above - use this instead of having to type ugo.
Run Code Online (Sandbox Code Playgroud)

权限是相同的如已经讨论的(rw,和x)。

chmod 命令允许我们使用 + 或 - 而不是 = 从现有集合中添加和减去权限。这是上面的命令,基本上重新写权限的不同(即从改变权限r--rw-,你仍然需要包括r以及w之后=chmod命令。如果你错过了r,它会带走r许可作为它们正在用 = 重写。使用 + 和 - 通过添加或删除当前的权限集来避免这种情况)。

数法

chmod 还可以使用数字设置权限。

使用数字是另一种方法,它允许您同时编辑所有三个所有者、组和其他人的权限。代码的基本结构是这样的:

chmod xxx file/directory
Run Code Online (Sandbox Code Playgroud)

其中 xxx 是一个 3 位数字,每个数字可以是 1 到 7 之间的任何数字。第一个数字适用于所有者的权限,第二个数字适用于组的权限,第三个数字适用于所有其他人的权限。

在这个数字符号中,值 r、w 和 x 有自己的数字值:

r=4
w=2
x=1
Run Code Online (Sandbox Code Playgroud)

要得出一个三位数的数字,您需要考虑您希望所有者、组和用户拥有哪些权限,然后将它们的值相加。例如,假设我想授予目录的所有者读写和执行权限,并且我想分组和其他所有人都具有只读和执行权限。我会想出这样的数值:

Owner: rwx = 4+2+1=7
Group: r-x = 4+0+1=5 (or just 4+1=5)
Other: r-x = 4+0+1=5 (or just 4+1=5)

Final number = 755

$ chmod 755 filename
Run Code Online (Sandbox Code Playgroud)

这相当于使用以下内容:

chmod u=rwx filename
chmod go=rx filename
Run Code Online (Sandbox Code Playgroud)

大多数文件夹/目录设置为 755 以允许所有者读取和写入和执行,但拒绝向其他所有人写入,文件通常设置为 644 以允许所有者读取和写入但仅允许其他人读取,请参阅最后请注意非可执行文件缺少 x 权限 - 此处的处理相同。