¿Por qué se asigna 777 a chmod para permitir todo en un archivo?


54

Me preguntaron en una entrevista por qué es que 777 está asignado a tomar todos los permisos para un archivo. ¿Por qué no 555? Dijo que hay razón para todo. Entonces, ¿cuál es el motivo de 777? ¿Por qué no cualquier otro número? ¿Hay algún significado en este número?



2
Consulte el comentario del enlace de @ AvinashRaj y aplíquelo a la instancia. La pregunta "¿Por qué?" depende de qué instancia es y para qué sirve ... :)
AzkerM

1
¿Está preguntando sobre el significado del número 7 vs 5 o por qué son números en lugar de, digamos, letras?
Braiam

44
Esta es una gran pregunta de entrevista; Puede que tenga que robarlo.
Chris digital

55
Estrictamente hablando, no es 777, sino 0777.
Ruslan

Respuestas:


129

Trataré de abordar la razón subyacente por la cual es 777, en lugar de aaa, o 999.

Recuerde que los permisos vienen en el siguiente formato:

 u   g   o
rwx rwx rwx

donde u = usuario, g = grupo, o = otro.

Ahora, imagina que estás representando a cada uno de estos grupos como binario. 1 es verdadero, 0 es falso.

Si desea dar acceso completo a todos, debe asignar los siguientes permisos en binario:

 u   g   o
rwx rwx rwx
111 111 111

Ahora, si sabes binario, te darás cuenta de que cuando conviertes 111de binario a decimal, obtienes 7.

Por lo tanto, puede representar el acceso completo como 777.

Nota: Realmente estamos convirtiendo de binario a octal. Vea la edición a continuación.

Esto también funciona para todos los demás modos de acceso.

Por ejemplo, podemos determinar fácilmente qué 555significa convirtiendo cada uno 5a binario y escribiéndolo en el formato anterior. 5en binario es 101, entonces tenemos los siguientes permisos:

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

Del mismo modo, si queremos otorgar todos los permisos al usuario, pero solo permitir que otras personas lean, podemos encontrar una representación numérica.

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

Ahora, sabemos que 111en binario está 7en decimal, y 100en binario está 4en decimal. Por lo tanto, los permisos serán 744.

Editar:

Técnicamente, como lo destacan @ LưuVĩnhPhúc y @Braiam, estamos convirtiendo de binario a octal, como se describe a continuación. Sin embargo, las representaciones decimales y octales de los números <8 son iguales, por lo que para los números binarios con 3 dígitos o menos, las representaciones decimales y octales son las mismas.

Cuando se representan como números octales, en lugar de dividirse en grupos de tres, y hacer una conversión de binario a decimal en cada grupo, en realidad puede tomar los tres grupos juntos como un solo número binario y convertirlos a octal.

Por ejemplo, aquí hay algunas conversiones binarias a octales:

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

Tenga en cuenta que estoy anteponiendo "0b" y "0o" para distinguir entre números binarios y octales.

Si quieres jugar con esto, abre una terminal, ejecuta pythony luego juega con los siguientes comandos:

oct(0b111111111)
bin(0o555)

Recuerde anteponer "0b" o "0o" a los números para que la computadora sepa en qué base está interesado. (Si no lo hace, asumirá la base 10.)


17
Solo por completar, el formato de los números se llama octals, que literalmente significa base de 8 (ya que comienzan desde 0 es 7 + 1 = 8).
Braiam

3
davie: octal es fácil porque en realidad agrupa tres bits, al igual que los grupos hexadecimales cuatro. Decimal no es una potencia de 2, por lo que no agrupa los bits tan bien.
Konerak

2
Bueno, obtienes el mismo número en cualquier caso. Creo que es más probable que alguien entienda una conversión de binario a decimal que una conversión de binario a octal. Además, he agregado una sección al final para aclarar que los números son realmente octales, no decimales.
daviewales

3
7es lo mismo en decimal y octal; sin embargo, 777no lo es. Cuando estás hablando de voltear bits, hace la diferencia.
Sam Dufel

2
Solo por el bien trivial 7 se conoce como el Número de Dios y el usuario raíz, cuyos permisos predeterminados se 777denominan a veces Dios.
eyoung100

16

Leer permiso de archivo significa 4, escribir permiso de archivo significa 2y ejecutar permiso de archivo significa 1.

Entonces el total de esto es 7.

Ahora, lo que es 777: primero 7es para el propietario del archivo, lo que significa que el propietario del archivo tiene permiso de lectura, derecho y ejecución.

El segundo 7es para el grupo al que pertenece el archivo, significa que el grupo también tiene todos los permisos de lectura, escritura y ejecución.

Y tercero 7es para permiso de otros

Si le da permiso al archivo, 555entonces el archivo owner, group and otherssolo tiene permiso ready permiso porque leer permiso significa 4 y ejecutar significa 1, por lo que el total obtieneexecutenot write5


¿Qué es el grupo y cuáles son esos otros permisos? Gracias por responder.
hellodear

Consulte este enlace para el grupo y los otros permisos, estos se aplicarán a cualquier otra persona en el servidor que no sea usted o no en su grupo
Prakash V Holkar

7

En no tantas palabras como la respuesta principal:

Cada archivo tiene 3 opciones de permisos: leer, escribir y ejecutar. No puede elegir ninguno de estos, uno de estos, dos de estos, o todos estos:

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

1 + 3 + 3 + 1 = 8

Entonces, en total, hay 8 combinaciones; 8 opciones de permisos. Contando desde 0, el último número es 7 (de 0 a 7). Entonces, representado por números, aquí están todas las opciones:

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)

Hay tres números porque el pedido va [permisos de usuario] [permisos de grupo] [otros permisos]

Entonces, 777 significa que los tres grupos tienen permisos de lectura, escritura y ejecución.


Además (relacionado indirectamente, por lo que no necesariamente tiene que leer esta parte), porque creo que su relevancia es importante: ¿por qué es el readnúmero 4 en lugar del 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)

La única forma de obtener combinaciones únicas para todas las posibilidades es ir por potencias de 2 para las opciones básicas. 2 0 = 1 (ejecutar), 2 1 = 2 (escribir), 2 2 = 4 (leer), y si hubiera una cuarta opción básica, se numeraría 2 3 = 8. Tenga en cuenta que writeno se enumerará hasta todas las combinaciones de Se han enumerado las opciones anteriores (que es solo una opción, ya que es justa execute). readno se enumera hasta que se hayan enumerado todas las combinaciones de opciones anteriores (de nuevo una, ya que solo hay una combinación con dos opciones: execute+ write). execute+ write+readno se enumera hasta que se hayan enumerado todas las combinaciones anteriores, que es 3, ya que ahora hay dos opciones de tres permisos. La lista continuaría de esta manera, sin importar cuántas opciones básicas hubiera. Por ejemplo, con 4 opciones básicas (tenga en cuenta que también sabemos que habrá un total de 16 combinaciones, ya que hay 4 opciones y 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)

66
Esta respuesta es completamente mala ya que no reconoce el sistema de números binarios y, lo que es más importante, octal como fuente de bits de permisos de archivos Unix. (Curiosamente, no son 3 o incluso 4 ... son 6, aunque los 18 bits completos no se usan actualmente.)
mirabilos

1
La base no es importante, ya que 111 es 7; si digo que los permisos son 111 o 7 no importa, porque es el mismo valor. Usé decimal por simplicidad de ejemplo para mostrar las matemáticas involucradas. Podría haber usado binario, pero las matemáticas no habrían parecido tan sencillas. ¿Qué importa cuando las bases se pueden traducir entre sí?
Daniel Ward,

4

Me sorprenden tantas respuestas similares que fallan por completo.

Después de determinar las 3 clases que se necesitaban leer, escribir y ejecutar. Fueron con octal (3 bits) para minimizar el espacio necesario para administrar el sistema de archivos .


3

Por alguna razón, los diseñadores de UNIX decidieron usar números OCTAL para permisos de archivos. Como saben, un valor máximo para un número octal de un dígito es 7. Resultó que un dígito octal para el acceso del usuario, uno para el acceso grupal y otro para el acceso mundial es suficiente para casi todo. El número octal máximo de 3digit es 777, y solo tiene sentido que denote "acceso a todos / todo".


No creo que esta sea una buena explicación. Los diseñadores de UNIX podrían tener números decimales y todavía habrían terminado con 7 que denota el acceso máximo, en lugar de 9 (como el dígito decimal máximo). El 7 no se elige "sustractivamente" en función de qué números son posibles comenzando en el dígito único más alto posible, sino "aditivamente" en función del acceso permitido por los dígitos binarios individuales que comienzan en cero sin ningún derecho en absoluto.
O Mapper

Observe que escribí al principio "por alguna razón" ... - No quería entrar en una explicación más profunda sobre POR QUÉ eligieron los números octales, ya que esa no era la pregunta OP. La pregunta era por qué 777 otorga todos los permisos.
DejanLekic

Aquí es irrelevante por qué escogieron los números octales. Mi punto es que la razón por la que el número 7 representa los derechos máximos no es que 7 sea el número octal máximo.
O Mapper

2

Hoy en día, todos sabemos que un byte es de 8 bits : esto ha sido universalmente acordado durante décadas. Pero ese no fue siempre el caso, y Unix (que inspiró a Linux en muchos aspectos) se escribió durante un momento en que esto todavía se estaba debatiendo. En particular, tenía que ser portátil para sistemas que usaban bytes de 6 bits o bytes de 8 bits. Algunas de las personas que lo escribieron estaban de un lado del debate, y otros estaban del otro lado.

En una nota relacionada, Base-2 (binario) no es una notación muy conveniente para escribir valores. Hoy en día, la mayoría de los programadores escriben una notación más compacta que usa Base-16 (hexadecimal) en su lugar. 16 es una base lo suficientemente grande como para que pueda empaquetar exactamente cuatro bits en un dígito hexadecimal: por ejemplo, "0000" en binario es 0x0 en hexadecimal (ese "0x" es una forma común de notar que está a punto de escriba un número hexadecimal), mientras que "1111" es 0xF (o 15 en decimal). En realidad, puede escribir cualquier combinación posible de cuatro bits con un solo dígito hexadecimal, simplemente contando en binario, y debido a la forma en que funciona la aritmética posicional, puede apilarla: dos dígitos hexadecimales pueden codificar cualquier combinación posible de ocho bits, solo contando, y así sucesivamente. A la gente de 8 bits le encantó esto.

La gente de 6 bits tenía su propia forma de hacer esto, pero en lugar de usar Base-16, usaban Base-8 (octal). Tiene ventajas similares a las hexadecimales: puede almacenar cualquier posición de tres bits en un dígito octal, y puede apilar los dígitos de manera similar. Entonces, al igual que la gente de 8 bits usó dos dígitos hexadecimales para un byte, la gente de 6 bits usó dos dígitos octales para un byte. Ya no se ve mucho octal, pero normalmente se observó con un cero a la izquierda: por ejemplo, "111" es 07 en octal.

Ahora, ¿qué tiene que ver todo esto con los permisos de Unix? En lo que respecta a Unix, hay tres cosas que puede hacer con un archivo: puede leerlo, escribir en él o ejecutarlo como un programa. Si va a restringir eso con permisos, entonces necesita un poco para cada uno de ellos: actívelo para las cosas que alguien puede hacer y déjelo para las cosas que alguien no tiene permitido hacer. Dado que hay tres cosas que se están rastreando, necesita tres bits, y dado que Unix lo rastrea a lo largo de tres líneas (propietario, grupo y todos), necesita nueve bits en total.

En algún momento de la línea, alguien, probablemente en el campamento de 6 bits, dijo "Oye, podemos usar dígitos octales para esto" . Y esto resultó ser una notación muy conveniente: tres dígitos octales son suficientes para codificar cada combinación posible de los campos de bits. Una vez que decidieron hacer esto, el destino de 777 (y 000) se sellaron, porque esos números serían los mismos sin importar cómo organizaron los bits, pero el orden importaba para todos los otros números, por lo que decidieron hacerlo.

Organizaron los permisos en campos de tres bits: leer al principio, escribir en el medio y ejecutar al final. Luego organizaron los campos ellos mismos: propietario al principio, grupo en el medio y otros al final. Una vez que habían hecho esto, todo lo que tenían que hacer para asignar el resto de los números era contar.

Debido a que son campos de 3 bits, puede decir que cada dígito octal controla uno de los campos : el primer dígito controla los permisos del propietario, el segundo dígito controla los permisos de grupo y el tercer dígito controla otros permisos. Por lo tanto, 777 (111 111 111) son todos los permisos para todos, mientras que 700 (111 000 000) son todos los permisos solo para el propietario. Otras combinaciones también son comunes: 666 (110110110) es lectura / escritura para todos pero no ejecución), mientras que 555 (101101101) es lectura / ejecución para todos pero no escritura, y 400 (100 000 000) es lectura- solo para el propietario y sin acceso para nadie más.

Y es por eso que 777 significa todos los permisos. En estos días, es probable que sea la razón más popular para que las personas usen octal, aunque Unix y sus descendientes todavía tienen algunos otros vestigios. Por ejemplo, odo Octal Dump, es una forma de obtener volcados binarios de un archivo en forma octal (tiene un primo hexadecimal, llamado xxd, pero eso no es tan conocido y no está disponible en todas partes). También es por eso que debe tener cuidado con los ceros a la izquierda en algunos lenguajes de programación, porque podrían pensar que tiene la intención de escribir números en octal cuando esa no es realmente su intención.


En primer lugar, cuando se creó Linux (alrededor de 1992), el debate de 8 bits y 6 bits había terminado. Segundo, esa NO es la razón por la que esto se hizo
Ahmed Masud

1
Proporcioné las cosas de 8 bits / 6 bits para el contexto histórico. Linux fue creado mucho después de que terminó el debate, es cierto, pero debido a que obtuvo gran parte de su inspiración de Unix, fue afectado por ese debate de manera similar. Por eso pensé que sería una buena idea presentar el contexto histórico.
El Spooniest
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.