问题描述
我在接受采访时被问到为什么分配777来获取文件的所有权限。为什么不555?他说一切都有理由。那么,777的原因是什么?为什么不是其他任何数字?这个号码有什么意义吗?
最佳解决思路
我将尝试解决为什么它是777而不是aaa或999的根本原因。
请记住,权限采用以下格式:
u g o
rwx rwx rwx
其中u = user,g = group,o = other。
现在,假设您将每个组表示为二进制。 1为真,0为假。
如果要为所有人提供完全访问权限,可以在二进制文件中分配以下权限:
u g o
rwx rwx rwx
111 111 111
现在,如果您知道二进制文件,您将意识到当您将111
从二进制转换为十进制时,您将获得7
。
因此,您可以将完全访问权限表示为777
。
注意:我们实际上是从二进制转换为八进制。请参阅下面的编辑。
这适用于所有其他访问模式。
例如,我们可以通过将每个5
转换为二进制文件并以上述格式编写来轻松计算出555
的含义。二进制文件中的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.)
次佳解决思路
读取文件权限表示4
,写入文件权限表示2
,执行文件权限表示1
。
所以总数是7
。
现在什么是777:第一个7
用于文件所有者,这意味着文件所有者具有读取,权限和执行权限。
第二个7
用于文件所属的组,它表示组还具有所有读,写和执行权限。
第3个7
是供其他人使用的
如果你给文件权限555
那么文件owner, group and others
只有read
和execute
权限not write
权限,因为读权限意味着4并执行方法1所以总得到5
第三种解决思路
与最佳答案不同的是:
每个文件都有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)
有三个数字,因为订单变为[用户权限] [组权限] [其他权限]
因此,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的幂为基本选项。 20 = 1(执行),21 = 2(写入),22 = 4(读取),如果有第4个基本选项,则编号为23 = 8.请注意,只有先前选项的所有组合都具有write
才会列出已经列出(这只是一个选项,因为它只是execute
)。在列出之前选项的所有组合之前,不会列出read
(再次列出一个,因为只有一个组合有两个选项 – execute
+ write
)。 execute
+ write
+ read
直到列出所有先前的组合(3)才列出,因为现在有三种权限的两种选择。无论有多少基本选项,列表都将以这种方式继续。例如,有4个基本选项(请注意,我们也知道总共有16个组合,因为有4个选项,24 = 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)
第四种思路
我很惊讶这么多类似的答案完全错过了标记。
在确定需要读取,写入和执行的3个类之后。它们使用八进制(3位)来最小化管理文件系统所需的空间。
第五种思路
出于某种原因,UNIX设计者决定使用OCTAL numbers来获取文件权限。如您所知,one-digit八进制数的最大值为7.事实证明,用户访问的一个八进制数字,一个用于组访问,一个用于全局访问,几乎适用于所有内容。最大3digit八进制数是777,它只表示“访问每个人/所有东西”才有意义。
第六种思路
如今,我们都知道一个字节是8位:这已经普遍认同了几十年。但情况并非总是如此,Unix(在许多方面激发了Linux)是在这个仍然存在争议的时期编写的。特别是,它需要可移植到使用6位字节或8位字节的系统。一些写这篇文章的人是辩论的一方,另一方则是另一方。
在相关的说明中,Base-2(二进制)对于写出值不是一个非常方便的表示法。如今,大多数程序员都使用Base-16(十六进制)来编写更紧凑的符号。 16只是一个足够大的基础,你可以准确地将四个位打包成一个hex-digit:例如,二进制的”0000″是十六进制的0x0(“0x”是一种常见的方式来指出你要写一个十六进制数),而”1111″是0xF(或十进制的15)。您实际上可以使用单个十六进制数字来编写任意四个位的组合,只需通过二进制计数,并且由于位置算法的工作方式,您可以将其堆叠起来:两个十六进制数字可以编码任何可能的八位组合,只需通过计数,等等。所以8位的人喜欢这个。
6位人员有他们自己的方式,但他们使用Base-8(八进制)而不是使用Base-16。它具有与十六进制类似的优点:您可以在octal-digit中存储三位的任何位置,并且您可以以类似的方式堆叠数字。就像8位人员使用两个hex-digits作为一个字节一样,6位人员使用两个octal-digits作为一个字节。你不再看到八进制了,但通常注意到前导零:例如,”111″是八进制的07。
现在,所有这些与Unix权限有什么关系?就Unix而言,你可以用文件做三件事:你可以读它,你可以写它,或者你可以把它作为一个程序来执行。如果你打算用权限来限制它,那么你需要为它们中的每一个做一点:为某些人允许做的事情打开它,并为不允许某人做的事情留下它。由于跟踪了三件事,你需要三位,因为Unix沿着三行(所有者,组和所有人)跟踪它,你需要总共9位。
在沿线的某个地方,有人 – 可能是在6位阵营 – 说“嘿,我们可以使用octal-digits”。这被证明是一个非常方便的表示法:三个octal-digits足以编码每个可能的位域组合。一旦他们决定这样做,777的命运(和000的)被封存,因为无论他们如何排列这些数字都是相同的,但是对于所有其他数字的顺序是重要的,所以他们开始着手这样做。
他们将权限安排到three-bit字段中:在开始时读取,在中间写入,在结束时执行。然后他们自己安排了田地:开始时的所有者,中间的团体,以及最后的其他人。一旦他们完成了这项工作,所有他们必须做的就是分配剩下的数字了。
因为它们是3位字段,您可以说每个octal-digit控制其中一个字段:第一个数字控制所有者权限,第二个数字控制组权限,第三个数字控制其他权限。因此,777(111 111 111)是所有人的所有权限,而700(111 000 000)仅是所有者的所有权限。其他组合也很常见:666(110 110 110)为每个人读/写但不执行),而555(101 101 101)为每个人读取/执行但不写,400(100 000 000)是read-only所有者,任何人都无权访问。
这就是为什么777意味着所有权限。这些天,它可能是人们使用八进制的最流行的原因,尽管Unix及其后代仍然有一些其他的遗迹。例如,od
或Octal Dump是一种以八进制形式获取文件的二进制转储的方法(它有一个十六进制表兄,名为xxd
,但不是well-known,并且不是随处可用)。这也是为什么你需要小心一些编程语言中的前导零,因为他们可能会认为你打算用八进制写数字,而这并不是你的意图。