了解UNIX权限和文件类型


68

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)代表什么,以及这部分权限的用途是什么?


3
请下次尝试仅问一个问题,多个问题通常不利于引用,并且几乎永远不会同时解决所有问题。
Kiwy

1
@Kiwy对不起,我想我会这样做,因为它涉及同一主题。如果需要,可以为我的问题建议一个更好的标题,以提高参考价值。
彼得

1
顺便说一句,“ d”的值是040000-可以在头文件的名称下找到S_IFDIR。设置文件模式时不使用它,但是该stat()函数实际上为返回值040750 drwxr-x---
Random832

2
@jamesqf实际上,现在我了解了八进制代码是如何映射的,对我而言,考虑这种方式更简单。
HalosGhost 2015年

4
@Peter:没有愚蠢的问题-只是因为害怕问而不会学习的愚蠢问题。
mgarciaisaia 2015年

Answers:


117

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

文件类型

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

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

权限

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

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

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

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

对于第一个数字:

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

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

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

ls -l输出中suidsgid和“ sticky”出现在x条目的位置:suidis sS代替用户的xsgidis sS代替组的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所有其他文件。


虽然,其他答案都还不错,但是您确实花了一些时间来回答这个问题。谢谢。
彼得

在* BSD上sgid,无论其实际值如何,目录的行为就像总是设置其位。在FreeBSD上,该suid位可以配置为类似于sgid(例如,在内部创建的文件和子目录与目录具有相同的所有者),前提是基础文件系统支持该位,并且该suiddir选件已安装。
lcd047

+X仅在已设置执行权限之一或文件为目录的情况下,才添加执行权限”,谢谢@ stephen-kitt丢失了“已设置”文档,确实使我陷入了循环!
Ryan Fisher

39

因此,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文件权限


5
您对777和0777的理解是错误的。两者都是八进制的(在这种情况下,十进制无论如何都没有意义),但是以四字符形式,第一个数字设置特殊位(sticky和setuid)。
Orion

3
@orion有时它确实是正确的,例如,在类似C的代码中chmod(777),实际上等同于运行chmod 1411(即chmod带有参数的命令1411)。
彼得

2
...对于syscall(或它的包装器)和带有相同名称的二进制文件可能会有些混乱。
彼得

3
Python Master Race通过禁止所有以0开头的“数字”来解决此向后问题,如果用户想要除十进制以外的其他任何值(例如hex:0x1FF,binary:0b111111111或octal:),则强制用户明确0o777。PYTHON POWER
Nick T

图片来源?
rug

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


7

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

查看权限

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

$ ls -l

-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

列的含义

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

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

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

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

权限是什么意思

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

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

资料夹

对于文件夹,模式位可以解释如下:

  • r (read)表示能够读取给定目录的目录,
  • w(write)表示只有在设置了执行位的情况下,才能写入给定目录的目录(创建新文件,文件夹;重命名,删除现有文件,文件夹)。否则,此许可是没有意义的。
  • x (执行)表示使用命令cd进入给定目录并访问该目录中的文件,文件夹的能力。

使用chmod命令更改权限

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

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

文字方式

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

chmod who=permissions filename

一系列字母中的谁是谁,每个字母都表示您将授予许可。它们如下:

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.

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

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

编号方法

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

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

chmod xxx file/directory

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

在此数字符号中,值r,w和x具有其自己的数字值:

r=4
w=2
x=1

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

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

这等效于使用以下内容:

chmod u=rwx filename
chmod go=rx filename

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


仅仅从另一篇文章中复制文本至少是不礼貌的。也许还会侵犯版权。如果它不仅是复制的,或者您确实使用过小零件(由于合理使用,便于版权使用),那么请至少添加指向您所引用/引用的文章的链接。
rug

0

对于d问题

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

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

在此处阅读更多内容:Linux / Unix中的文件类型详细说明

0777777

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

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

777 在不更改粘性位的情况下设置777文件权限。

阅读更多:sticky bitchmod


2
更好:但是它仍然没有提供其他答案尚未涵盖的内容……
jasonwryan 2015年

1
(1)共有三种基本文件类型:普通文件,目录和其他所有文件。什么?你从哪里得到的?在很好的方案中,纯文件和目录非常相似。命名管道和符号链接更像普通文件和目录,而不是设备文件或套接字。(2)您认为chmod 777不清除setuid,setgid和粘性位吗?试试吧。
G-Man

Unix有7种文件类型,而不是3
wjandrea
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.