为什么将777分配给chmod以允许文件中的所有内容?


54

在一次采访中有人问我,为什么分配777来获取文件的所有权限。为什么不555?他说,一切都有理由。那么,777是什么原因呢?为什么没有其他数字?这个数字有什么意义吗?



2
请参阅@AvinashRaj的链接注释,并将其应用于实例。问题“为什么?” 取决于它是什么实例
及其

1
他是在问数字7与5的重要性,还是为什么它们是数字而不是字母?
Braiam 2014年

4
这是一个很好的面试问题。我可能不得不偷了。
数字克里斯

5
严格地说,这不是777,而是0777
鲁斯兰

Answers:


129

我会尽力解决的根本原因,为什么它是777,而不是AAA,或999。

请记住,权限采用以下格式:

 u   g   o
rwx rwx rwx

其中u =用户,g =组,o =其他。

现在,假设您将每个组表示为二进制。1为真,0为假。

如果要向所有人授予完全访问权限,则应以二进制形式分配以下权限:

 u   g   o
rwx rwx rwx
111 111 111

现在,如果您知道二进制,则将认识到,当您111从二进制转换为十进制时,您会得到7

因此,您可以将完全访问权限表示为777

注意:我们实际上是从二进制转换为八进制。请参见下面的编辑。

这也适用于所有其他访问模式。

例如,555通过将它们分别转换5为二进制并将其以上述格式编写,我们可以轻松地找出含义。5二进制文件为101,因此我们具有以下权限:

 u   g   o
r-x r-x r-x
101 101 101
 5   5   5

同样,如果我们要授予用户所有权限,但只允许其他人阅读,则可以找到数字表示形式。

 u   g   o
rwx r-- r--
111 100 100
 7   4   4

现在,我们知道111二进制7以十进制表示,而100二进制4以十进制表示。因此,权限将为744

编辑:

从技术上讲,正如@LưuVĩnhPhúc和@Braiam所强调的那样,我们正在从二进制转换为八进制,如下所述。但是,数字<8的十进制和八进制表示形式是相同的,因此对于3位以下的二进制数,十进制和八进制表示形式是相同的。

当用八进制数表示时,而不是分成三组,而是对每组进行二进制到十进制的转换,实际上,您可以将所有三个组作为一个二进制数一起使用,然后转换为八进制。

例如,以下是一些二进制到八进制的转换:

0b111111111 == 0o777
0b101101101 == 0o555
0b111100100 == 0o744

请注意,我在前面加上“ 0b”和“ 0o”以区分二进制数和八进制数。

如果要使用此方法,请打开一个终端,运行python,然后使用以下命令进行操作:

oct(0b111111111)
bin(0o555)

请记住在数字前面加上“ 0b”或“ 0o”,以使计算机知道您感兴趣的基数。(如果不知道,则假定基数为10。)


17
仅出于完整性考虑,数字的格式称为八进制,其字面意思是8的底数(因为它们从0开始为7 + 1 = 8)。
Braiam

3
戴维:八进制很容易,因为它实际上将三个位分组,就像十六进制将四个分组一样。小数不是2的幂,因此它不能很好地对位进行分组。
Konerak 2014年

2
好吧,无论哪种情况,您都会得到相同的数字。我认为某人更可能会理解二进制到十进制的转换,而不是二进制到八进制的转换。另外,我在末尾添加了一个部分,以澄清数字确实是八进制的,而不是十进制的。
daviewales 2014年

3
7在十进制和八进制中是相同的-但是,777不是。当您谈论翻转位时,会有所不同。
山姆·杜菲尔

2
仅出于琐碎的缘故,7被称为上帝的号码,而默认用户的根用户777有时也被称为上帝。
eyoung100

16

读取文件许可方式4,写入文件许可方式2和执行文件许可方式1

因此,总计为7

现在是777:首先7是针对文件所有者的,这意味着文件所有者具有读取,纠正和执行权限。

第二个7是文件所属的组,这意味着该组还具有所有的读取,写入和执行权限。

第三7是给别人的许可

如果您授予文件许可权,555那么该文件owner, group and others仅具有readexecute许可not write权许可权,因为读取许可权意味着4而执行手段1使得总计5


什么是组,其他权限是什么?感谢您的回应。
hellodear

请参考此链接获取组和其他权限,这些权限将在不是您或不在您组中的服务器上的其他任何人身上执行
Prakash V Holkar,2014年

7

最好的答案是:

每个文件都有3个权限选项:读取,写入和执行。您可以选择以下任何一项,其中一项,以下两项或全部:

C(3,0)+ C(3,1)+ C(3,2)+ C(3,3)= 8

1 + 3 + 3 +1 = 8

因此,一共有8种组合;权限的8个选项。从0开始计数,最后一个数字为7(从0到7)。因此,以数字表示,以下是所有选项:

0 - nothing
1 - execute
2 - write
4 - read
3 - execute + write (1 + 2)
5 - execute + read (1 + 4)
6 - write + read (2 + 4)
7 - execute + write + read (1 + 2 + 4)

有3个数字,因为顺序为[用户权限] [组权限] [其他权限]

因此,777表示这三个组均具有读取,写入和执行权限。


同样(间接相关,因此您不必一定要阅读本部分),因为我认为它的相关性很重要: 为什么用read数字4而不是数字3?

0 - nothing
1 - execute
2 - write
3 - read
4 - execute + read (1 + 3)
5 - write + read (2 + 3)
6 - execute + write + read (3 + 2 + 1)
7 - ????? no way to get this with the 3 basic options (and we are missing execute + write)

获得所有可能性的唯一组合的唯一方法是对基本选项采用2的幂。2 0 = 1(执行),2 1 = 2(写),2 2 = 4(读),如果有第4个基本选项,则将其编号为2 3 =8。请注意,write直到先前的选项已列出(这只是一个选项,因为它只是execute)。read在列出了先前选项的所有组合之前,不会列出(再次,因为只有一个组合带有两个选项- execute+ write)。execute+ write+read在列出了所有先前的组合(为3)之前,不会列出,因为现在从三个权限中有两个选择。无论有多少基本选项,列表都将以这种方式继续。为了举例说明,有4个基本选项(请注意,由于有4个选项,并且2 4 = 16 ,所以我们也知道总共有16个组合):

0 - nothing
1 - execute
2 - write
4 - read
3 - execute + write (1 + 2)
5 - execute + read (1 + 4)
6 - write + read (2 + 4)
7 - execute + write + read (1 + 2 + 4)
8 - love
9 - execute + love (1 + 8)
10 - write + love (2 + 8)
11 - execute + write + love (1 + 2 + 8)
12 - read + love (4 + 8)
13 - execute + read + love (1 + 4 + 8)
14 - write + read + love (2 + 4 + 8)
15 - execute + write + read + love (1 + 2 + 4 + 8)

6
这个答案非常糟糕,因为它无法识别二进制文件,更重要的是,八进制系统无法识别Unix文件权限位。(有趣的是,它们不是3甚至是4…而是6,尽管目前尚未使用完整的18位。)
mirabilos 2014年

1
底数不重要,因为111是7;我说的权限是111还是7都没有关系,因为它是相同的值。为了简化示例,我使用了十进制来显示所涉及的数学。我本可以使用二进制的,但是数学看起来并不那么简单。碱基之间可以相互转换又有什么关系?
丹尼尔·沃德

4

令我惊讶的是,许多类似的答案完全没有达到目标。

在确定需要读取,写入和执行的3个类之后。他们使用八进制(3位)以最小化管理文件系统所需的空间


3

由于某种原因,UNIX设计者决定使用OCTAL号来获得文件许可权。众所周知,一个八进制数字的最大值是7。事实证明,一个八进制数字用于用户访问,一个八进制数字用于组访问,而一个八进制数字几乎可以满足所有要求。最多3个数字的八进制数字为777,仅表示“访问所有人/所有内容”才有意义。


我认为这不是一个很好的解释。UNIX设计人员可以使用十进制数字,但最终仍将以7表示最大访问权限,而不是9(作为最大十进制数字)。该7没有选择“减法”基于什么数字都可以开始在尽可能高的个位数,但“加法”基于从零开始在所有没有权利由单一的二进制数字所允许的访问。
OR Mapper 2014年

请注意,我是在“出于某种原因”开始的时候写的...-我不想深入解释他们为什么选择八进制数的原因,因为这不是OP的问题。问题是为什么777赋予所有权限。
DejanLekic 2014年

他们为什么选择八进制数与此处无关。我的观点是,用数字7表示最大权限的原因不是因为7恰好是最大的八进制数。
OR Mapper 2014年

2

如今,我们都知道一个字节是8位:几十年来,这已经被普遍接受。但这并非总是如此,Unix(在很多方面启发了Linux)是在尚有争议的时期编写的。特别是,它必须可移植到使用6位字节或8位字节的系统。撰写此文的人中有些在辩论的一侧,而其他人则在另一侧。

值得一提的是,Base-2(二进制)不是写出值的非常方便的表示法。如今,大多数程序员都写出了一种更紧凑的表示法,它使用Base-16(十六进制)代替。16足以容纳一个基数,您可以将四位准确地打包成一个十六进制数字:例如,二进制中的“ 0000”是十六进制的0x0(“ 0x”是一种常见的表示您将要写一个十六进制数),而“ 1111”为0xF(或十进制为15)。实际上,您可以只用一个十六进制数就可以用一个十六进制数字写任何可能的四位组合,并且由于位置算术的工作方式,您可以将其叠加起来:两个十六进制数字可以编码八位的任何可能组合,仅通过计数等等。因此8位用户对此非常喜欢。

6位用户有他们自己的方式,但是他们没有使用Base-16,而是使用Base-8(八进制)。它具有与十六进制类似的优点:您可以将八位的任何位置存储为八进制数字,并且可以以类似的方式将数字堆叠起来。因此,就像8位用户使用一个字节的两个十六进制数字一样,6位用户使用一个字节的两个八进制数字。您不会再看到八进制了,但是通常用前导零表示它:例如,“ 111”是八进制的07。

现在,所有这些与Unix权限有什么关系?就Unix而言,使用文件可以做三件事:可以读取文件,可以写入文件或将其作为程序执行。如果要使用权限限制该权限,则每个权限都需要一些限制:在允许某人执行的操作中将其打开,而在不允许某人执行的操作中将其关闭。由于要跟踪三件事,因此您需要三位,并且由于Unix沿三行(所有者,组和所有人)跟踪它,因此总共需要九位。

在此过程中的某个时刻,可能是在6位阵营中的某人说:“嘿,我们可以为此使用八进制数字”。事实证明,这是一个非常方便的表示法:三个八进制数字足以对位字段的每种可能组合进行编码。一旦他们决定这样做,就密封了777的命运(和000的命运),因为无论这些位如何排列,这些数字都是相同的,但其他所有数字的顺序都很重要,因此他们着手这样做。

他们将权限划分为三位字段:开始读取,中间写入和最后执行。然后他们自己安排字段:开始时是所有者,中间是组,最后是其他人。一旦完成此操作,分配剩余数字所需要做的就是计数。

因为它们是3位字段,所以可以说每个八位数字控制一个字段:第一个数字控制所有者权限,第二个数字控制组权限,第三个数字控制其他权限。因此,777(111 111 111)是所有人的所有权限,而700(111 000 000)仅是所有者的所有权限。其他组合也很常见:每个人都可以读/写666(110 110 110),但不执行),而每个人都可以读/执行555(101 101 101),但不写,而400(100 000 000)则被读-仅适用于所有者,其他任何人都不能访问。

这就是为什么777表示所有权限的原因。如今,这可能是人们使用八进制的最流行的原因,尽管Unix及其后代仍然有其他一些痕迹。例如,od或八进制转储是一种以八进制形式获取文件的二进制转储的方法(它有一个名为的十六进制表亲xxd,但它并不广为人知,并且并非在所有地方都可用)。这也是为什么在某些编程语言中要小心以零开头的原因,因为当他们不是真正的意图时,他们可能会认为您打算以八进制形式写数字。


首先,当Linux被创造时(大约在1992年),8位6位的争论就结束了。第二个原因不是这样做的原因
Ahmed Masud 2014年

1
我提供了8位/ 6位的内容供历史参考。确实,Linux是在辩论结束后很长一段时间才创建的,但是由于它从Unix中汲取了很多灵感,因此它以类似的方式受到了这场辩论的影响。这就是为什么我认为介绍历史背景将是一个好主意的原因。
2014年
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.