直到今天我才真正明白是怎么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+
等。四个数字中的每一个都是代表一组权限的八进制值:
suid
和sgid
“粘性”(见下文)- 用户权限
- 组权限
- “其他”权限
八进制值计算为权限的总和:
- “读”为 4
- “写”是2
- “执行”为 1
对于第一个数字:
suid
是 4;设置了此位的二进制文件以其所有者用户身份运行(通常root
)sgid
是 2;具有此位设置的二进制文件作为其所有者组运行(这用于游戏,因此可以共享高分,但与游戏中的漏洞结合使用时通常会存在安全风险),并且在具有此位设置的目录中创建的文件属于默认情况下目录的所有者组(这对于创建共享文件夹很方便)- “粘性”(或“限制删除”)为 1;设置了此位的目录中的文件只能由其所有者、目录所有者或
root
(请参阅/tmp
参考资料 中的常见示例)删除。
看联机chmod
帮助页了解详情。请注意,在这一切中,我忽略了其他可以更改用户对文件的权限的安全功能(SELinux、文件 ACL...)。
根据文件类型(常规文件或目录)和底层系统,特殊位的处理方式有所不同。 (手册页中提到了这一点chmod
。)在我用来测试这一点的系统上(文件系统为coreutils
8.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
输出中suid
,sgid
和“sticky” 出现在条目的位置x
:suid
是s
或S
代替用户的x
,sgid
是s
或S
代替组的x
,“sticky” 是t
或T
代替其他人的x
。小写字母表示特殊位和可执行位都被置位;大写字母表示仅设置了特殊位。
chmod 的各种形式
由于上述行为,使用完整的四位数字chmod
可能会令人困惑(至少事实证明我很困惑)。当您想要设置特殊位和权限位时,它很有用;否则,如果您正在操作文件,则这些位将被清除;如果您正在操作目录,则这些位将被保留。所以chmod 2750
确保你至少能sgid
准确地得到u=rwx,g=rx,o=
;但chmod 0750
不一定会清除特殊位。
使用数字模式而不是文本命令 ( [ugo][=+-][rwxXst]
) 可能更多的是一种习惯和命令的目的。一旦您习惯使用数字模式,通常更容易以这种方式指定完整模式;能够使用数字模式来考虑权限是很有用的,因为许多其他命令可以使用它们(install
,mknod
...)。
一些文本变体可以派上用场:如果您只是想确保任何人都可以执行文件,那么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 权限的图片,我将附上它以更容易理解:
答案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 中的文件类型详细解释
0777
与777
是否指定粘滞位。设置目录的粘滞位后,文件系统会以特殊方式处理此类目录中的文件,因此只有文件所有者、目录所有者或 root 用户可以重命名或删除该文件。如果没有设置粘性位,则任何对该目录具有写入和执行权限的用户都可以重命名或删除所包含的文件,而不管文件的所有者是谁。
0777
设置 777 文件权限,并将粘性位设置为 0 - 无特殊模式。
777
正在设置 777 文件权限,而不更改粘滞位。