Responderé a sus preguntas en tres partes:tipos de archivos, permisos y casos de uso para las diversas formas de chmod
.
Tipos de archivo
El primer carácter en ls -l
la salida representa el tipo de archivo; d
significa que es un directorio. No se puede configurar o desactivar, depende de cómo se creó el archivo. Puede encontrar la lista completa de tipos de archivo en la documentación de ls; aquellos con los que es probable que te encuentres son
-
:archivo "regular", creado con cualquier programa que pueda escribir un archivob
:bloque de archivo especial, típicamente dispositivos de disco o partición, se puede crear conmknod
c
:archivo especial de caracteres, también se puede crear conmknod
(ver/dev
para ejemplos)d
:directorio, se puede crear conmkdir
l
:enlace simbólico, se puede crear conln -s
p
:tubería con nombre, se puede crear conmkfifo
s
:socket, se puede crear connc -U
D
:puerta, creada por algunos procesos de servidor en Solaris/openindiana.
Permisos
chmod 0777
se utiliza para establecer todos los permisos en un chmod
ejecució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
,sgid
y "pegajoso" (ver más 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:
suid
es 4; binarios con este conjunto de bits se ejecutan como su usuario propietario (comúnmenteroot
)sgid
es 2; los archivos binarios con este conjunto de bits se ejecutan como su grupo propietario (esto se usó para juegos, por lo que se podían compartir puntajes altos, 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)- “adhesivo” (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
(ver/tmp
para ver un ejemplo común de esto).
Ver el chmod
página de manual 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, archivos ACL...).
Los bits especiales se manejan de manera diferente según el tipo de archivo (archivo normal o directorio) y el sistema subyacente. (Esto se menciona en el chmod
manpage.) En el sistema que usé para probar esto (con coreutils
8.23 en un ext4
sistema 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 establezcan explícitamente, por lo que chmod 0777
es equivalente a chmod 777
, y ambos comandos borran los bits especiales y otorgan a todos permisos completos en el archivo. Para un directorio, los bits especiales nunca se borran por completo utilizando la forma numérica de cuatro dígitos, por lo que en efecto chmod 0777
también es equivalente a chmod 777
pero es engañoso ya que algunas de las partes especiales permanecerán como están. (Una versión anterior de esta respuesta se equivocó). Para borrar bits especiales en los directorios, debe usar u-s
, g-s
y/o o-t
explícitamente o especifica un valor numérico negativo, por lo que chmod -7000
borrará todos los bits especiales en un directorio.
En ls -l
salida, suid
, sgid
y "sticky" aparecen en lugar del x
entrada:suid
es s
o S
en lugar del x
del usuario , sgid
es s
o S
en lugar del x
del grupo y "pegajoso" es t
o T
en lugar del x
de otros . Una letra minúscula indica que tanto el bit especial como el bit ejecutable están establecidos; una letra mayúscula indica que solo está configurado el bit especial.
Las diversas formas de chmod
Debido al comportamiento descrito anteriormente, usar los cuatro dígitos completos en chmod
puede ser confuso (al menos resulta que yo estaba confundido). Es útil cuando desea establecer bits especiales además de bits de permiso; de lo contrario, los bits se borran si está manipulando un archivo, se conservan si está manipulando un directorio. Entonces chmod 2750
asegura que obtendrá al menos sgid
y exactamente u=rwx,g=rx,o=
; pero chmod 0750
no borrará necesariamente los bits especiales.
Usar modos numéricos en lugar de comandos de texto ([ugo][=+-][rwxXst]
) es probablemente más un caso de costumbre y el objetivo de la orden. 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+x
hará eso, independientemente de cuáles sean los otros permisos. Asimismo, +X
agrega el permiso de ejecución solo si uno de los permisos de ejecución ya está establecido o si el archivo es un directorio; esto puede ser útil para restaurar permisos globalmente sin tener que usar archivos de casos especiales o directorios. Por lo tanto, chmod -R ug=rX,u+w,o=
es equivalente a aplicar chmod -R 750
a todos los directorios y archivos ejecutables y chmod -R 640
a todos los demás archivos.
Entonces, los permisos en Linux son muy importantes. Intentaré 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. Runningls -l muestra los permisos. He aquí un ejemplo de una pantalla de este tipo:
-rw-r--r-- 1 user somegroup 7041 Mar 26 19:34 somefile
Adjunto imagen de piezas de un archivo modo:
El tipo puede ser algo diferente. Por ejemplo:
- d (directorio)
- c (dispositivo de caracteres)
- l (enlace simbólico)
- p (tubería con nombre)
- s (enchufe)
- b (dispositivo de bloque)
- D (puerta, no común en sistemas Linux, pero ha sido 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 frente a 0777
El chmod
El comando generalmente espera que la entrada sea un número octal, el cero inicial se refiere al valor del triplete de bits sticky/sgid/suid. En C, sin embargo, marcaría la diferencia, ya que 777
se traduciría a 01411
(octal), configurando así el sticky bit (ver el chmod(2)
página de manual), permisos de lectura para el propietario y 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 entender más fácilmente:
d
significa que es un directorio, si tiene un archivo, es -
y si es un enlace encontrarás un l
. No se puede activar/desactivar.
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 tiene usuarios/grupos que no pueden acceder a directorios/archivos.
Por ejemplo, si lista el contenido de un directorio y obtiene esto:
-rw-r--r-- 1 root root 42596 jun 7 2012 preloadable_libintl.so
precargable_libintl.so es un archivo propiedad del usuario raíz y del grupo raíz. 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