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

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

我在一次采访中被问到,为什么指定 777 来获取文件的所有权限。为什么不是 555?他说,凡事都有原因。那么,777 的原因是什么?为什么不是其他数字?这个数字有什么意义吗?

答案1

我会尝试解决根本原因为什么它是 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。)

答案2

读取文件权限方法4、写入文件权限方法2和执行文件权限方法1

因此总计是7

那么 777 是什么:第一个7是文件所有者,这意味着文件所有者具有读取、权限和执行权限。

第二个7是文件所属的组,这意味着组也拥有所有的读,写和执行权限。

第三7是其他人的许可

如果你授予文件权限555,那么该文件owner, group and others只有权限read,因为读取权限意味着 4,执行意味着 1,所以总共得到executenot write5

答案3

不如最佳答案中说的那么多:

每个文件都有 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 表示所有三个组都具有读、写和执行权限。


另外(间接相关,所以您不一定非要读这部分),因为我认为它的相关性很重要: 为什么是read4号而不是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++直到列出所有先前的组合后才会列出,writeread是 3,因为现在有三个权限中的两个选择。无论有多少个基本选项,列表都会以这种方式继续。为了举例说明,有 4 个基本选项(请注意,我们还知道总共会有 16 种组合,因为有 4 个选项,2 4 = 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)

答案4

出于某种原因,UNIX 设计者决定使用八进制数用于文件权限。如您所知,一位八进制数的最大值为 7。事实证明,一位八进制数用于用户访问权限、一位八进制数用于组访问权限、一位八进制数用于世界访问权限几乎足以满足所有需求。三位八进制数的最大值为 777,它表示“所有人/所有事物的访问权限”才有意义。

相关内容