Comprender los permisos de UNIX y los tipos de archivo

68

Nunca he entendido cómo chmodfuncionó hasta hoy. Seguí un tutorial que me explicó mucho.

Por ejemplo, he leído que tienes tres grupos de permisos diferentes:

  • propietario ( u)
  • grupo ( g)
  • todos ( o)

Basado en estos tres grupos, ahora sé que:

  • Si el archivo es propiedad del usuario, los permisos del usuario determinan el acceso.
  • Si el grupo del archivo es el mismo que el grupo del usuario, el permiso del grupo determina el acceso.
  • Si el usuario no es el propietario del archivo y no está en el grupo, se utiliza el otro permiso.

También he aprendido que tienes los siguientes permisos:

  • leer ( r)
  • escribir ( w)
  • ejecutar ( x)

Creé un directorio para probar mi conocimiento recién adquirido:

mkdir test

Luego hice algunas pruebas:

chmod u+rwx test/
# drwx------
chmod g+rx test/
# drwxr-x---
chmod u-x test/
# drw-r-x---

Después de perder el tiempo durante un tiempo, creo que finalmente entendí chmody la forma en que estableces el permiso usando este comando.


Pero...

Todavía tengo algunas preguntas:

  • ¿Qué significa el dinicio?
  • ¿Cuál es el nombre y el uso de la ranura que contiene y qué otros valores puede contener?
  • ¿Cómo puedo configurarlo y desactivarlo?
  • ¿Cuál es el valor de esto d? (Como solo tienes 7 = 4 + 2 + 1 7 = 4 + 2 + 1 7 = 4 + 2 + 1)
  • ¿Por qué las personas a veces usan en 0777lugar de 777establecer sus permisos?

Pero como no debería estar haciendo múltiples preguntas, intentaré hacerlo en una sola pregunta.

En un sistema basado en UNIX, como todas las distribuciones de Linux, en relación con los permisos, ¿qué significa la primera parte ( d) y cuál es el uso de esta parte de los permisos?

Peter
fuente
3
Por favor, la próxima vez intente hacer una sola pregunta, las preguntas múltiples generalmente son malas para hacer referencia y casi nunca se abordan todas al mismo tiempo.
Kiwy
1
@ Kiwy Lo siento, pensé que lo haría así porque se trata del mismo tema. Si lo desea, puede sugerir un mejor título para mi pregunta para mejorar su referencia.
Peter
1
Por cierto, el valor de la "d" es 040000; se puede encontrar en los archivos de encabezado bajo el nombre S_IFDIR. No lo usa al configurar el modo de archivo, pero la stat()función en realidad devuelve el valor 040750 para drwxr-x---.
Random832
2
@jamesqf En realidad, ahora que entiendo cómo se mapean los códigos octales, es más simple para mí pensar de esa manera.
HalosGhost
44
@Peter: no hay preguntas estúpidas, solo estúpidos que no aprenden porque tienen miedo de preguntar.
mgarciaisaia

Respuestas:

117

Contestaré sus preguntas en tres partes: tipos de archivo, permisos y casos de uso para las diversas formas de chmod.

Tipos de archivo

El primer carácter en la ls -lsalida representa el tipo de archivo; dsignifica que es un directorio. No se puede establecer o desactivar, depende de cómo se creó el archivo. Puede encontrar la lista completa de tipos de archivos en la documentación de ls ; los que es probable que encuentres son

  • -: Archivo "normal", creado con cualquier programa que pueda escribir un archivo
  • b: se puede crear un archivo especial de bloque, generalmente dispositivos de disco o partición, con mknod
  • c: archivo especial de caracteres, también se puede crear con mknod(ver /devejemplos)
  • d: directorio, se puede crear con mkdir
  • l: enlace simbólico, se puede crear con ln -s
  • p: canalización con nombre, se puede crear con mkfifo
  • s: socket, se puede crear con nc -U
  • D: puerta , creada por algunos procesos del servidor en Solaris / openindiana.

Permisos

chmod 0777se usa para establecer todos los permisos en una chmodejecución, en lugar de combinar cambios con u+etc. Cada uno de los cuatro dígitos es un valor octal que representa un conjunto de permisos:

  • suid, sgidY “pegajosa” (ver abajo)
  • Permisos de usuario
  • permisos de grupo
  • "Otros" permisos

El valor octal se calcula como la suma de los permisos:

  • "Leer" es 4
  • "Escribir" es 2
  • "Ejecutar" es 1

Para el primer dígito:

  • suides 4; los binarios con este conjunto de bits se ejecutan como su usuario propietario (comúnmente root)
  • sgides 2; los archivos binarios con este conjunto de bits se ejecutan como su grupo propietario (esto se usaba para juegos, por lo que se podían compartir puntuaciones altas, pero a menudo es un riesgo de seguridad cuando se combina con vulnerabilidades en los juegos), y los archivos creados en directorios con este conjunto de bits pertenecen al grupo propietario del directorio por defecto (esto es útil para crear carpetas compartidas)
  • "Pegajoso" (o "eliminación restringida") es 1; los archivos en directorios con este conjunto de bits solo pueden ser eliminados por su propietario, el propietario del directorio o root(vea /tmpun ejemplo común de esto).

Vea la página de chmodmanual para más detalles. Tenga en cuenta que en todo esto estoy ignorando otras características de seguridad que pueden alterar los permisos de los usuarios en los archivos (SELinux, archivo ACL ...).

Los bits especiales se manejan de manera diferente según el tipo de archivo (archivo o directorio normal) y el sistema subyacente. (Esto se menciona en la página de chmodmanual). En el sistema que solía probar esto (con coreutils8.23 en un ext4sistema de archivos, ejecutando Linux kernel 3.16.7-ckt2), el comportamiento es el siguiente. Para un archivo, los bits especiales siempre se borran a menos que se establezca explícitamente, por lo que chmod 0777es equivalente a chmod 777, y ambos comandos borran los bits especiales y otorgan a todos los permisos completos sobre el archivo. Para un directorio, los bits especiales nunca se borran completamente utilizando la forma numérica de cuatro dígitos, por lo que en efecto chmod 0777también es equivalente achmod 777pero es engañoso ya que algunos de los bits especiales permanecerán tal cual. (Una versión anterior de esta respuesta se equivocó). Para borrar bits especiales en los directorios, debe usar u-s, g-sy / o o-texplícitamente o especificar un valor numérico negativo, por chmod -7000lo que borrará todos los bits especiales en un directorio.

En ls -lla salida, suid, sgidy “pegajosa” aparecerá en lugar de la xentrada: suides so Sen lugar del usuario de x, sgides s, o Sen lugar del grupo de x, y “pegajosa” es to Ten lugar de los otros x. Una letra minúscula indica que tanto el bit especial como el bit ejecutable están establecidos; una letra mayúscula indica que solo se establece el bit especial.

Las diversas formas de chmod

Debido al comportamiento descrito anteriormente, usar los cuatro dígitos completos chmodpuede ser confuso (al menos resulta que estaba confundido). Es útil cuando desea establecer bits especiales, así como bits de permiso; de lo contrario, los bits se borran si está manipulando un archivo, y se conservan si está manipulando un directorio. Así se chmod 2750asegura que obtendrá al menos sgidy exactamente u=rwx,g=rx,o=; pero chmod 0750no necesariamente borrará los bits especiales.

El uso de modos numéricos en lugar de comandos de texto ( [ugo][=+-][rwxXst]) es probablemente más un caso de hábito y el objetivo del comando. Una vez que está acostumbrado a usar modos numéricos, a menudo es más fácil especificar el modo completo de esa manera; y es útil poder pensar en permisos usando modos numéricos, ya que muchos otros comandos pueden usarlos ( install, mknod...).

Algunas variantes de texto pueden ser útiles: si simplemente quiere asegurarse de que cualquier persona pueda ejecutar un archivo, chmod a+xlo hará, independientemente de los otros permisos. Del mismo modo, +Xagrega el permiso de ejecución solo si uno de los permisos de ejecución ya está configurado o si el archivo es un directorio; Esto puede ser útil para restaurar los permisos a nivel mundial sin tener que usar archivos de casos especiales v. directorios. Por lo tanto, chmod -R ug=rX,u+w,o=es equivalente a aplicar chmod -R 750a todos los directorios y archivos ejecutables y chmod -R 640a todos los demás archivos.

Stephen Kitt
fuente
Sin embargo, las otras respuestas fueron bastante buenas, realmente pasaste algún tiempo respondiendo esta pregunta. Gracias.
Peter
En * los directorios BSD se comportan como si su sgidbit estuviera siempre establecido, independientemente de su valor real. En FreeBSD, el suidbit puede configurarse para actuar de manera análoga sgid(es decir, los archivos y subdirectorios creados dentro tendrán el mismo propietario que el directorio), siempre que el sistema de archivos subyacente lo admita y esté montado con la suiddiropción.
lcd047
" +Xagrega el permiso de ejecución solo si uno de los permisos de ejecución ya está configurado o el archivo es un directorio" gracias @ stephen-kitt que falta la documentación "ya está configurado" realmente me estaba volviendo loco.
Ryan Fisher
39

Entonces, los permisos en Linux son muy importantes. Trataré de hacer una breve explicación.

Para piezas de un modo de archivo

Cada archivo Unix tiene un conjunto de permisos que determinan si puede leer, escribir o ejecutar el archivo. La ejecución de ls -l muestra los permisos. Aquí hay un ejemplo de tal pantalla:

-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile

Adjunto una imagen de piezas de un modo de archivo:

ingrese la descripción de la imagen aquí

El tipo puede ser algo diferente. Por ejemplo:

  • d (directorio)
  • c (dispositivo de caracteres)
  • l (enlace simbólico)
  • p (tubería con nombre)
  • s (zócalo)
  • b (dispositivo de bloque)
  • D (puerta, no es común en sistemas Linux, pero se ha portado)

Si desea establecer algunos permisos para todos los directorios, puede usar el atributo R, por ejemplo:

chmod -R 777 /some/directory/

Para chmod 777 vs 0777

El chmodcomando generalmente espera que la entrada sea un número octal, el cero inicial se refiere al valor del triplete de bit fijo / sgid / suid. Sin embargo, en C marcaría la diferencia, ya 777que se traduciría a 01411(octal), configurando así el bit fijo (consulte la chmod(2)página de manual), los permisos de lectura para el propietario y el bit ejecutable para el grupo y otros (que es una combinación bastante extraña) .

EDITAR 1

Encontré otra imagen sobre los permisos de Linux y la adjuntaré para comprender más fácilmente: Permisos de archivos UNIX

ValeriRangelov
fuente
55
Estás equivocado sobre el 777 vs 0777. Ambos son octales (el decimal no tiene sentido de todos modos en este caso), pero en forma de cuatro caracteres, el primer dígito establece los bits especiales (adhesivo y setuid).
orion
3
@orion De vez en cuando es cierto, por ejemplo, en un código similar a C chmod(777)sería el equivalente a ejecutar chmod 1411(es decir, el chmodcomando con argumento 1411).
Peter
2
... que en el caso de syscall (o su contenedor) y el binario que lleva el mismo nombre puede ser un poco confuso.
Peter
3
Carrera Python Maestro resolvió este problema al revés, prohibiendo todos los "números" que comienzan con 0, obligando a que el usuario sea explícita si quieren que no sea nada decimal, por ejemplo hexagonal: 0x1FF, binario: 0b111111111o octal: 0o777. PYTHON POWER
Nick T
Fuente de la imagen?
rugk
10

dsignifica que es un directorio, si tiene un archivo es -y si es un enlace encontrará un l. No se puede configurar / desarmar.

Si usa 0777 como permisos, está dando control total (lectura + escritura + ejecución) a cada usuario / grupo del sistema. Es una forma perezosa de resolver problemas cuando tienes usuarios / grupos que no pueden acceder a directorios / archivos.

Por ejemplo, si enumera el contenido de un directorio y obtiene esto:

-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so

preloadable_libintl.so es un archivo propiedad de la raíz del usuario y la raíz del grupo. El propietario tiene acceso de lectura y escritura, el grupo solo tiene acceso de lectura y cualquier otro usuario tiene acceso de lectura. Esto se puede traducir como 644.

Si lo cambio a 777 se verá así:

-rwxrwxrwx 1 root root 42596 jun 7 2012 preloadable_libintl.so

jcbermu
fuente
7

Después de obtener mi pregunta respondida aquí e investigar un poco sobre el resultado, encontré un artículo que lo explica todo muy bien. Me gustaría compartir algunas partes de este artículo aquí para futuras referencias.

Ver permisos

Para chmodcambiar los permisos de un archivo o directorio, primero deberá saber cuál es el modo de acceso actual. Puede ver el contenido de un directorio en la terminal cden ese directorio y luego usar:

$ ls -l

El -lcambio es importante porque usarlo lssin él solo mostrará los nombres de archivos o carpetas en el directorio.

A continuación se muestra un ejemplo de uso ls -len mi directorio de inicio:

total 128
drwxr-xr-x 2 peter users  4096 Jul  5 21:03 Desktop
drwxr-xr-x 6 peter users  4096 Jul  5 17:37 Documents
drwxr-xr-x 2 peter users  4096 Jul  5 13:45 Downloads
drwxr-xr-x 2 peter users  4096 Jun 24 03:36 Movies
drwxr-xr-x 2 peter users  4096 Jun 24 03:38 Music
drwxr-xr-x 2 peter users  4096 Jun 26 00:09 Pictures
-rw-r--r-- 1 peter users   354 Jul  6 17:15 chmodtest

Que significan las columnas

La primera columna es el tipo de cada archivo:

  • - denota un archivo normal.
  • d denota un directorio, es decir, una carpeta que contiene otros archivos o carpetas.
  • p denota una tubería con nombre (también conocido como FIFO).
  • l denota un enlace simbólico.

Las letras después de eso son los permisos, esta primera columna es lo que más nos interesará. La segunda es cuántos enlaces hay en un archivo, podemos ignorarlo con seguridad. La tercera columna tiene dos valores / nombres: el primero (en mi ejemplo 'peter') es el nombre del usuario que posee el archivo. El segundo valor ('usuarios' en el ejemplo) es el grupo al que pertenece el propietario (Lea más sobre los grupos).

La siguiente columna es el tamaño del archivo o directorio en bytes y la información posterior son las fechas y horas en que el archivo o directorio se modificó por última vez y, por supuesto, el nombre del archivo o directorio.

Qué significan los permisos

Las primeras tres letras, después de la primera -o d, son los permisos que tiene el propietario. Las siguientes tres letras son permisos que se aplican al grupo. Las últimas tres letras son los permisos que se aplican a todos los demás.

Cada conjunto de tres letras está compuesto por r wy x. rsiempre está en la primera posición, wsiempre está en la segunda posición y xsiempre está en la tercera posición. res el permiso de lectura, wes el permiso de escritura y xes el permiso de ejecución. Si hay un guión ( -) en el lugar de una de estas letras, significa que el permiso no se otorga, y si la letra está presente, se otorga.

Carpetas

En el caso de las carpetas, los bits de modo se pueden interpretar de la siguiente manera:

  • r (leer) significa la capacidad de leer la tabla de contenido del directorio dado,
  • w(escribir) significa la capacidad de escribir la tabla de contenido del directorio dado (crear nuevos archivos, carpetas; renombrar, eliminar archivos existentes, carpetas) si y solo si se establece el bit de ejecución. De lo contrario, este permiso no tiene sentido.
  • x (ejecutar) representa la capacidad de ingresar al directorio dado con el comando cd y acceder a los archivos, carpetas en ese directorio.

Cambiar permisos usando el comando chmod

chmodes un comando en Linux y otros sistemas operativos tipo Unix. Le permite cambiar los permisos (o modo de acceso) de un archivo o directorio.

Puede modificar los permisos de dos maneras diferentes: - Basado en texto - Basado en chmod númerochmod

Método de texto

Para cambiar los permisos o el modo de acceso de un archivo, utilizamos el comando chmod en un terminal. A continuación se muestra la estructura general del comando:

chmod who=permissions filename

Dónde Quién es cualquiera de una gama de letras, y cada una significa a quién le va a dar permiso. Son los siguientes:

u - The user that owns the file.
g - The group the file belongs to.
o - The other users i.e. everyone else.
a - all of the above - use this instead of having to type ugo.

Los permisos son los mismos que ya se ha discutido ( r, wy x).

El comando chmod nos permite sumar y restar permisos de un conjunto existente usando + o - en lugar de =. Esto es diferente a los comandos anteriores, que esencialmente reescriben los permisos (es decir, para cambiar un permiso de r--a rw-, aún debe incluirlo rasí como wdespués =del chmodcomando. Si se lo perdiera r, le quitaría el rpermiso como se están reescribiendo con =. Usando + y - evite esto agregando o quitando el conjunto actual de permisos).

Método de número

chmod También puede establecer permisos usando números.

El uso de números es otro método que le permite editar los permisos para los tres propietarios, grupos y otros al mismo tiempo. Esta estructura básica del código es esta:

chmod xxx file/directory

Donde xxx es un número de 3 dígitos donde cada dígito puede ser del 1 al 7. El primer dígito se aplica a los permisos para el propietario, el segundo dígito se aplica a los permisos para el grupo y el tercer dígito se aplica a los permisos para todos los demás.

En esta notación numérica, los valores r, w y x tienen su propio valor numérico:

r=4
w=2
x=1

Para obtener un número de tres dígitos, debe considerar qué permisos desea que tenga un propietario, un grupo y un usuario, y luego sumar sus valores. Por ejemplo, supongamos que quería otorgarle al propietario de un directorio permisos de lectura-escritura y ejecución, y quería agrupar a todos los demás para que solo leyeran y ejecutaran permisos. Se me ocurrirían los valores numéricos de esta manera:

Owner: rwx = 4+2+1=7
Group: r-x = 4+0+1=5 (or just 4+1=5)
Other: r-x = 4+0+1=5 (or just 4+1=5)

Final number = 755

$ chmod 755 filename

Esto es equivalente a usar lo siguiente:

chmod u=rwx filename
chmod go=rx filename

La mayoría de las carpetas / directorios están configurados en 755 para permitir la lectura y escritura y la ejecución al propietario, pero niegan la escritura a todos los demás, y los archivos normalmente son 644 para permitir la lectura y escritura para el propietario, pero solo la lectura para todos los demás, consulte el último Nota sobre la falta de permisos x con archivos no ejecutables: es el mismo trato aquí.

Peter
fuente
Solo copiar texto de otro artículo es, al menos, grosero. Tal vez también una violación de derechos de autor. Si no solo se copió o si realmente usó piezas pequeñas (respetuosas con los derechos de autor gracias al uso justo), al menos agregue un enlace al artículo al que hace referencia / cita.
rugk
0

Para las preguntas d

Esto te dice el tipo de archivo Unix. Por defecto, Unix solo tiene 3 tipos de archivos. Son:

  • - - archivo regular
  • d - Archivo de directorio
  • Archivo especial (con 5 subtipos):
    • b - Bloquear archivo
    • c - Archivo de dispositivo de personaje
    • p - Archivo de tubería con nombre o solo archivo de tubería
    • l - Archivo de enlace simbólico
    • s - Archivo de socket

Lea más aquí: Tipos de archivos en Linux / Unix explicados en detalle

0777 vs 777

Pegamento específico especificado o no. Cuando se establece el bit fijo de un directorio, el sistema de archivos trata los archivos en dichos directorios de una manera especial para que solo el propietario del archivo, el propietario del directorio o el usuario raíz puedan cambiar el nombre o eliminar el archivo. Sin el conjunto de bits fijos, cualquier usuario con permisos de escritura y ejecución para el directorio puede cambiar el nombre o eliminar archivos contenidos, independientemente del propietario del archivo.

0777 establece los permisos del archivo 777 y el bit fijo a 0, sin modos especiales.

777 está configurando permisos de archivos 777, sin cambiar el bit fijo.

Leer más: sticky bit y chmod

csny
fuente
2
Mejor: pero aún no ofrece nada que las otras respuestas aún no hayan cubierto ...
jasonwryan
1
(1) Hay tres tipos básicos de archivos: archivos planos, directorios y todo lo demás. ¿Qué? ¿De dónde sacas esto? En el gran esquema de las cosas, los archivos y directorios simples son bastante similares. Las canalizaciones con nombre y los enlaces simbólicos se parecen más a archivos y directorios simples que a archivos o dispositivos. (2) ¿Crees chmod 777que no borra los bits setuid, setgid y sticky? Intentalo.
G-Man el
Unix tiene 7 tipos de archivos, no 3.
wjandrea