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

hel*_*ear 56 permissions user-management

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

dav*_*les 132

我将尝试解决为什么它是 777 而不是 aaa 或 999的根本原因。

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

 u   g   o
rwx rwx rwx
Run Code Online (Sandbox Code Playgroud)

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

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

如果你想给每个人完全访问权限,你可以以二进制形式分配以下权限:

 u   g   o
rwx rwx rwx
111 111 111
Run Code Online (Sandbox Code Playgroud)

现在,如果您了解二进制,就会意识到当您将111二进制转换为十进制时,您会得到7.

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

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

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

例如,我们可以555通过将每个转换5为二进制并以上述格式编写它来轻松计算出含义。5二进制是101,所以我们有以下权限:

 u   g   o
r-x r-x r-x
101 101 101
 5   5   5
Run Code Online (Sandbox Code Playgroud)

同样,如果我们想给用户所有的权限,但只允许其他人阅读,我们可以找到一个数字表示。

 u   g   o
rwx r-- r--
111 100 100
 7   4   4
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

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

例如,这里有一些二进制到八进制的转换:

0b111111111 == 0o777
0b101101101 == 0o555
0b111100100 == 0o744
Run Code Online (Sandbox Code Playgroud)

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

如果你想玩这个,打开一个终端,运行python然后玩以下命令:

oct(0b111111111)
bin(0o555)
Run Code Online (Sandbox Code Playgroud)

请记住在数字前加上“0b”或“0o”,让计算机知道您对什么基数感兴趣。(如果不这样做,它将假定基数为 10。)

  • 为了完整起见,数字的格式称为八进制,字面意思是 8 的基数(因为它们从 0 开始是 7+1=8)。 (17认同)
  • davie:八进制很容易,因为它实际上将三位分组,就像十六进制的四组一样。十进制不是 2 的幂,因此它不能很好地对位进行分组。 (3认同)
  • `7` 在十进制和八进制中是一样的——但是,`777` 不是。当你谈论翻转位时,它会有所不同。 (3认同)
  • 好吧,无论哪种情况,您都会得到相同的数字。我认为有人更可能理解二进制到十进制的转换而不是二进制到八进制的转换。另外,我在最后添加了一个部分来澄清这些数字实际上是八进制,而不是十进制。 (2认同)
  • 只是为了琐碎的缘故,7 被称为上帝的编号,而默认权限为“777”的 root 用户有时被称为上帝。 (2认同)

Pra*_*kar 17

读文件权限4,写文件权限2,执行文件权限1

所以总共是7.

现在什么是 777:首先7是文件所有者,这意味着文件所有者具有读取、正确和执行权限。

第二个7是文件所属的组,表示组也有所有的读、写和执行权限。

第三个7是其他人的许可

如果你给该文件的权限555,则文件owner, group and othersreadexecute许可not write权限,因为读取权限手段4和执行单元1这样得到的总5


Dan*_*ard 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)
Run Code Online (Sandbox Code Playgroud)

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

因此,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)
Run Code Online (Sandbox Code Playgroud)

获得所有可能性的独特组合的唯一方法是对基本选项进行 2 的幂运算。2 0 = 1 (执行), 2 1 = 2 (写入), 2 2 = 4 (读取), 如果有第 4 个基本选项,它将被编号为 2 3 = 8 write。以前的选项已列出(这只是一个选项,因为它只是execute)。read直到之前选项的所有组合都列出后才会列出(又是一个,因为只有一个组合有两个选项 - execute+ write)。execute+ write+read直到所有以前的组合都列出后才会列出,即 3,因为现在有 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)
Run Code Online (Sandbox Code Playgroud)

  • 这个答案**非常糟糕**,因为它无法识别二进制,更重要的是,无法将八进制数字系统识别为 Unix 文件权限位的来源。(有趣的是,它们不是 3 甚至 4……它们是 6,尽管目前没有使用完整的 18 位。) (6认同)