Por que o 777 é designado para chmod para permitir tudo em um arquivo?

52

Foi-me perguntado em uma entrevista porque é que 777 é designado para receber todas as permissões para um arquivo. Por que não 555? Ele disse que há razão para tudo. Então, qual é a razão para 777? Por que não qualquer outro número? Existe algum significado nesse número?

    
por hellodear 27.05.2014 / 10:41

6 respostas

129

Tentarei abordar a razão subjacente porque é 777, em vez de aaa ou 999.

Lembre-se de que as permissões vêm no seguinte formato:

 u   g   o
rwx rwx rwx

em que u = usuário, g = grupo, o = outro.

Agora, imagine que você esteja representando cada um desses grupos como binário. 1 é verdadeiro, 0 é falso.

Se você quiser dar acesso total a todos, atribua as seguintes permissões em binário:

 u   g   o
rwx rwx rwx
111 111 111

Agora, se você souber binário, perceberá que, ao converter 111 de binário para decimal, obterá 7 .

Assim, você pode representar o acesso total como 777 .

Nota: estamos realmente convertendo de binário para octal. Veja a edição abaixo.

Isso funciona para todos os outros modos de acesso também.

Por exemplo, podemos facilmente descobrir o que 555 significa convertendo cada 5 em binário e gravando-o no formato acima. 5 no binário é 101 , por isso temos as seguintes permissões:

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

Da mesma forma, se quisermos dar todas as permissões ao usuário, mas permitir que apenas outras pessoas leiam, podemos encontrar uma representação numérica.

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

Agora, sabemos que 111 no binário é 7 no decimal e 100 no binário é 4 no decimal. Assim, as permissões serão 744 .

Editar:

Tecnicamente, como destacado por @ LưuVĩnhPhúc e @Braiam, estamos convertendo de binário para octal, conforme descrito abaixo. No entanto, as representações decimal e octal dos números & lt; 8 são iguais, portanto, para números binários com 3 dígitos ou menos, as representações decimal e octal são as mesmas.

Quando representado como números octal, em vez de dividir em grupos de três, e fazendo conversão de binário para decimal em cada grupo, você pode realmente juntar todos os três grupos como um único número binário e converter para octal.

Por exemplo, aqui estão algumas conversões binárias para octal:

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

Note que estou prefixando "0b" e "0o" para distinguir entre números binários e octal.

Se você quiser brincar com isso, abra um terminal, execute python e, em seguida, use os seguintes comandos:

oct(0b111111111)
bin(0o555)

Lembre-se de colocar "0b" ou "0o" nos números para informar ao computador em que base você está interessado. (Caso contrário, ele assumirá a base 10).

    
por daviewales 27.05.2014 / 16:17
16

Ler permissão de arquivo significa 4 , gravar permissão de arquivo significa 2 e executar permissão de arquivo significa 1 .

Portanto, o total disso é 7 .

Agora, o que é o 777: primeiro 7 é para o proprietário do arquivo, o que significa que o proprietário do arquivo leu, executou a permissão correta e de execução.

2nd 7 é para o grupo ao qual o arquivo pertence, isso significa que o grupo também tem toda a permissão de leitura, gravação e execução.

E 3 7 é para outras pessoas

Se você conceder a permissão de arquivo 555 , o arquivo owner, group and others terá apenas read e execute permission not write permission porque a permissão de leitura significa 4 e executar significa 1 para que o total receba 5

    
por Prakash V Holkar 27.05.2014 / 10:58
7

Em poucas palavras como a resposta principal:

Cada arquivo tem 3 opções de permissões: ler, escrever e executar. Você pode escolher uma dessas opções, uma delas, duas delas, ou todas elas:

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

1 + 3 + 3 + 1 = 8

Então, ao todo, existem 8 combinações; 8 opções para permissões. Contando de 0, o último número é 7 (de 0 a 7). Então, representado por números, aqui estão todas as opções:

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)

Existem três números porque a ordem é válida [permissões de usuário] [permissões de grupo] [outras permissões]

Portanto, 777 significa que todos os três grupos têm permissões de leitura, gravação e execução.

Também (indiretamente relacionado, para que você não precise necessariamente ler essa parte), porque acho que sua relevância é importante: Por que read é o número 4 em vez do número 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)

A única maneira de obter combinações únicas para todas as possibilidades é passar por potências de 2 para as opções básicas. 2 0 = 1 (executar), 2 1 = 2 (escrever), 2 2 = 4 (ler), e se houvesse um 4ª opção básica seria numerada 2 3 = 8. Observe que write não está listado até que todas as combinações de opções anteriores tenham sido listadas (o que é apenas uma opção, pois é apenas execute ). read não é listado até que todas as combinações de opções anteriores tenham sido listadas (novamente, uma vez que existe apenas uma combinação com duas opções - execute + write ). execute + write + read não está listado até que todas as combinações anteriores tenham sido listadas, que é 3, pois agora há duas opções de três permissões. A lista continuaria dessa maneira, independentemente de quantas opções básicas houvesse. Por exemplo, com 4 opções básicas (note que também sabemos que haverá 16 combinações, já que existem 4 opções e 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)
    
por Daniel Ward 27.05.2014 / 20:50
4

Estou surpreso com tantas respostas semelhantes que perdem completamente a marca.

Após determinar as 3 classes necessárias, leia, escreva e execute. Eles foram com octal (3 bits) para minimizar o espaço necessário para gerenciar o sistema de arquivos .

    
por Ununique 31.05.2014 / 00:12
3

Por algum motivo, os projetistas do UNIX decidiram usar números OCTAL para permissões de arquivos. Como você sabe, um valor máximo para o número octal de um dígito é 7. Descobriu-se que um dígito octal para acesso do usuário, um para o acesso de grupo e outro para o acesso mundial é suficiente para quase tudo. O número octal máximo de 3digit é 777, e só faz sentido denotar "acesso a todos / tudo".

    
por DejanLekic 30.05.2014 / 13:53
2

Hoje em dia, todos sabemos que um byte é de 8 bits : isso é universalmente aceito há décadas. Mas esse não foi sempre o caso, e o Unix (que inspirou o Linux de várias maneiras) foi escrito durante um tempo em que isso ainda estava sendo debatido. Em particular, ele precisava ser portátil para sistemas que usavam Bytes de 6 bits ou bytes de 8 bits. Algumas das pessoas que escreveram estavam de um lado do debate, e outras estavam do outro lado.

Em uma nota relacionada, Base-2 (binário) não é uma notação muito conveniente para escrever valores. Atualmente, a maioria dos programadores escreve uma notação mais compacta que usa Base-16 (hexadecimal) . 16 é apenas grande o suficiente de uma base que você poderia empacotar exatamente quatro bits em um hexadecimal: por exemplo, "0000" em binário é 0x0 em hexadecimal (que "0x" é uma maneira comum de observar que você está prestes a escreva um número hexadecimal), enquanto "1111" é 0xF (ou 15 em decimal). Você pode realmente escrever qualquer combinação possível de quatro bits usando um único dígito hexadecimal, apenas contando em binário, e por causa da aritmética posicional funciona, você pode empilhá-lo: dois dígitos hexadecimais podem codificar qualquer combinação possível de oito bits, apenas contando e assim por diante. Então o pessoal de 8 bits adorou isso.

O pessoal de 6 bits tinha sua própria maneira de fazer isso, mas em vez de usar Base-16, eles usaram Base-8 (octal). Ele tem vantagens semelhantes ao hexadecimal: você pode armazenar qualquer posição de três bits em um dígito octal e você pode empilhar dígitos de maneira semelhante. Então, assim como o pessoal de 8 bits usou dois dígitos hexadecimais para um byte, o pessoal de 6 bits usou dois dígitos octais para um byte. Você não vê muito mais o octal, mas ele foi tipicamente anotado com um zero inicial: por exemplo, "111" é 07 em octal.

Agora, o que tudo isso tem a ver com permissões do Unix? No que diz respeito ao Unix, há três coisas que você poderia fazer com um arquivo: você poderia lê-lo, escrever nele ou executá-lo como um programa. Se você vai restringir isso com permissões, então você precisa de um pouco para cada uma delas: ligue-o para coisas que alguém tem permissão para fazer, e deixe para coisas que alguém não tem permissão para fazer. Como há três coisas sendo rastreadas, você precisa de três bits e, como o Unix acompanha três linhas (proprietário, grupo e todos), você precisa de nove bits no total.

Em algum ponto ao longo da linha, alguém - provavelmente no acampamento de 6 bits - disse: "Ei, podemos usar dígitos octal para isso" . E isso se tornou uma notação muito conveniente: três dígitos octal são suficientes para codificar todas as combinações possíveis dos campos de bits. Uma vez que eles decidiram fazer isso, o destino de 777 (e 000) foi selado, porque esses números seriam os mesmos, não importa como eles organizassem os bits, mas a ordem importava para todos os outros números, então eles decidiram fazer isso. p>

Eles organizaram as permissões em campos de três bits: leia no início, escreva no meio e execute no final. Em seguida, eles organizaram os campos: proprietário no início, grupo no meio e outros no final. Depois de fazer isso, tudo o que eles precisavam fazer para atribuir o restante dos números era contar.

Como são campos de 3 bits, é possível dizer que cada dígito octal controla um dos campos : o primeiro dígito controla as permissões do proprietário, o segundo dígito controla as permissões do grupo e o terceiro dígito controla outras permissões. Assim, 777 (111 111 111) é todas as permissões para todos, enquanto 700 (111 000 000) são todas as permissões apenas para o proprietário. Outras combinações também são comuns: 666 (110 110 110) é lido / gravado para todos, mas não executado), enquanto 555 (101 101 101) é lido / executado para todos, mas não é escrito, e 400 (100 000 000) é lido. somente para o proprietário e sem acesso para mais ninguém.

E é por isso que 777 significa todas as permissões. Hoje em dia, é provavelmente a razão mais popular para as pessoas usarem o octal, embora o Unix e seus descendentes ainda tenham alguns outros vestígios dele. Por exemplo, od , ou Octal Dump, é uma maneira de obter dumps binários de um arquivo em forma octal (ele tem um primo hexadecimal, chamado xxd , mas isso não é tão conhecido e não está disponível em todos os lugares) . É também por isso que você precisa ter cuidado com zeros em algumas linguagens de programação, porque eles podem pensar que você pretende escrever números em octal quando não for realmente sua intenção.

    
por The Spooniest 30.05.2014 / 17:30