Comprender los permisos de directorio en UNIX

He estado tratando de aprender Unix y Terminal un poco mejor, y me he encontrado con un comportamiento que no entiendo. Esperando que alguien pueda explicarme lo que me estoy perdiendo.

Últimamente he estado experimentando con permisos en directorios. Por lo que (pensé) entendí, el permiso de lectura significa que puede ver el contenido de un directorio (es decir, ls directorydebe enumerar el contenido del directorio); permiso de escritura significa que puede crear, modificar o eliminar archivos en el directorio (es decir, touch directory/newfile, o vi directory/fileimade, o rm directory/fileihate, todo debería funcionar); y el permiso de ejecución significa que puede hacer que el directorio sea su directorio de trabajo (es decir, cd directorydebería funcionar)

Pero eso no es lo que estoy encontrando.

Si tengo r--en un directorio, recibo errores al intentar cd directoryo touch directory/newfile, como se esperaba. Pero si ejecuto ls directory, bueno, no obtengo un error, pero no hay archivos en la lista, incluso si sé que hay archivos de los que soy propietario y/o tengo derechos dentro del directorio. Por lo tanto, lsse ha ejecutado con éxito pero sin datos en la salida estándar. ¿Por qué no?

Si tengo -w-en un directorio, recibo errores en cdy ls, como se esperaba. Pero si trato de crear un archivo nuevo, touch directory/newfiletambién recibo un error. ¿Por qué?

Todas las categorías x funcionan exactamente como se esperaba; Puedo cdentrar en directorios con --x, pero nada más. Puedo cdentrar en directorios con -wx, crear y eliminar archivos, pero lsdevuelve un error. Y puedo acceder cda r-xdirectorios, enumerar su contenido y trabajar en archivos para los que tengo permisos existentes, pero no puedo crear ni eliminar archivos. Todo esto tiene sentido para mí.

Entonces, ¿qué es lo que no estoy entendiendo correctamente acerca de r--y -w-?

Respuestas (2)

Si tengo r-- en un directorio, recibo errores al intentar cd directorio o tocar directorio/nuevo archivo, como se esperaba. Pero si ejecuto el directorio ls, bueno, no obtengo un error, pero no hay archivos en la lista, incluso si sé que hay archivos de los que soy propietario y/o tengo derechos dentro del directorio. Entonces, ls se ejecutó con éxito pero sin datos en la salida estándar. ¿Por qué no?

Si solo ls directoryentonces, los "archivos" dentro directorydeberían aparecer, pero si usa ls -lqué llamadas, stat(2)la operación fallará silenciosamente, ya que statrequiere una ruta de búsqueda completa al objeto del sistema de archivos.

Si tengo -w- en un directorio, recibo errores en cd y ls, como se esperaba. Pero si intento crear un archivo nuevo (toque directorio/archivo nuevo), también aparece un error. ¿Por qué?

Una vez más touchllama open(2)a la llamada del sistema que requiere una ruta de búsqueda completa (todos los directorios en la ruta son ejecutables/buscables) o la operación fallará.

Parece que esto explica lo que he estado experimentando, ¡gracias! Estaba usando ls -la través de un alias: cuando lo eliminé, los directorios de solo lectura funcionaron como se esperaba. Sin embargo, un seguimiento: un directorio de solo escritura todavía parece fallar cuando intento eliminar o editar un archivo que sé que existe y para el cual tengo derechos. ¿Por qué sería eso? ¿Son los directorios de solo escritura simplemente funcionalmente inútiles sin permiso de ejecución/búsqueda en tándem?
Para editar un archivo, los permisos del directorio contenedor son completamente irrelevantes. Solo necesita permisos de lectura y escritura para el archivo. Sin embargo, la edición de un archivo no ocurre de forma aislada. Primero debe encontrar el archivo y, para eso, necesita permiso de lectura en el directorio que lo contiene. ¿Tiene sentido?
Bueno, el concepto tiene perfecto sentido, pero no es completamente consistente con lo que estoy viendo. En este momento tengo un directorio llamado readwritecon rw-permiso y dos archivos dentro de named rwtoedity rwtodelete, ambos con rw-permiso (los permisos son míos como propietario). El comando rm -f readwrite/rwtodeletefalla con error Permission denied. El comando vi readwrite/rwtoeditcarga el editor pero no el archivo, nuevamente con Permission deniederror. Los archivos están allí, el shell me permite verlos y puedo identificarlos específicamente como argumentos para el shell. Entonces, ¿por qué los errores?
@CASmnl42 r-- le permite leer los nombres de archivo en el directorio, no acceder a los archivos. Necesita al menos --x para poder acceder a un archivo dentro.

Tiene una buena idea sobre los permisos de archivos y directorios de UNIX, lo cual es bueno para empezar.

Hay tres tipos de permisos.

  • r: permiso de lectura

  • w: permiso de escritura

  • x: permiso de ejecución

para tres categorías de propiedad

  • u: usuario o el propietario

  • g: propietario del grupo

  • o: otros o todos los demás

En términos generales, hay dos tipos de entidades en el sistema de archivos UNIX:

  • archivos

  • directorios

En un nivel técnico, un directorio no es más que un tipo especial de archivo, que simplemente contiene una lista de archivos y directorios contenidos en él.

Ahora, expongamos claramente qué significan los tres tipos de permisos (leer, escribir, ejecutar) para un directorio. Suponga que el usuario registrado en cuestión es el propietario del directorio (para simplificar las cosas)

  • read : El directorio (técnicamente el archivo de directorio), se puede leer , es decir, el contenido del directorio se puede listar, por ejemplo, usando el lscomando.

  • escribir : el directorio (técnicamente el archivo de directorio), se puede escribir . Esto significa que se puede crear y eliminar un nuevo archivo/subdirectorio usando comandos como touch, vim, cpetc.

  • ejecutar : El directorio (técnicamente el archivo de directorio), se puede ejecutar . Esto simplemente significa que el propietario puede cambiar a este directorio, es decir, cdal directorio.

Ahora piense detenidamente en cada uno de los permisos discutidos anteriormente de forma independiente . Aquí están las diversas posibilidades de permisos y lo que el propietario puede hacer en cada caso:

  • - - -: No permisos. El directorio es prácticamente inútil.

  • - - x: El propietario puede cambiar al directorio, pero no puede crear/eliminar archivos/directorios en él, ni puede enumerar el contenido del directorio.

  • - w -: El propietario puede crear/borrar un archivo/directorio dentro de este directorio, pero no puede enumerar su contenido ni cambiarlo.

  • - w x: El propietario puede crear/eliminar un archivo/directorio dentro de este directorio, cambiarlo, pero no puede enumerar su contenido.

  • r - -: El propietario solo puede enumerar el contenido del directorio.

  • r - x: El propietario no puede crear/eliminar archivos/directorios dentro de este directorio.

  • r w -: El propietario no puede cambiar a este directorio.

  • r w x: El propietario puede realizar las tres acciones en el directorio.

Ahora, esto debería ayudar a obtener una comprensión clara de qué acciones son posibles con qué permisos de directorio.

Una vez que los conceptos anteriores tengan sentido para usted, repasemos nuevamente las declaraciones de su problema:

Por lo que (pensé) entendí, el permiso de lectura significa que puede ver el contenido de un directorio (es decir, ls directorydebe enumerar el contenido del directorio);

Esto es absolutamente correcto y debería ser obvio a partir de la discusión anterior.

permiso de escritura significa que puede crear, modificar o eliminar archivos en el directorio (es decir, touch directory/newfile, o vi directory/fileimade, o rm directory/fileihate, todo debería funcionar);

Parcialmente correcto. Con el permiso de escritura disponible en el directorio, puede escribir el archivo del directorio , lo que significa agregar y eliminar contenido del archivo del directorio. (Esto debería estar claro ahora, pero lo reiteraré, un directorio es simplemente un archivo, aunque especial, que simplemente almacena una lista de todos los archivos y subdirectorios contenidos). Esto significa que puede crear y eliminar archivos ( o directorios) en el directorio pero no puede modificar archivos a menos que tenga permiso de escritura disponible en el archivo. Puede eliminar un archivo en el que no tiene permiso de lectura o escritura, ya que tiene permiso de escritura disponible para el directorio que lo contiene. touch directory/newfile, o vi directory/fileimade, o rm directory/fileihate, todo debería funcionar bien.

y el permiso de ejecución significa que puede hacer que el directorio sea su directorio de trabajo (es decir, cd directorydebería funcionar)

Absolutamente correcto.

Si tengo r--en un directorio, recibo errores al intentar cd directoryo touch directory/newfile, como se esperaba. Pero si ejecuto ls directory, bueno, no obtengo un error, pero no hay archivos en la lista, incluso si sé que hay archivos de los que soy propietario y/o tengo derechos dentro del directorio. Por lo tanto, lsse ha ejecutado con éxito pero sin datos en la salida estándar. ¿Por qué no?

Tienes razón. El caso en el que no se muestra ningún resultado se produce cuando el directorio está completamente vacío. Si tiene permiso de lectura en un directorio, el contenido debe aparecer en la lista independientemente del permiso en archivos/subdirectorios. Otra posibilidad es que los archivos y directorios estén ocultos. Intenta correr ls -a directory. Puede volver a verificar para asegurarse de que tiene permiso de lectura en el directorio ejecutando ls -ld directory. También verifique la salida de alias ls.

Si tengo -w-en un directorio, recibo errores en cdy ls, como se esperaba. Pero si trato de crear un archivo nuevo, touch directory/newfiletambién recibo un error. ¿Por qué?

Debería poder crear un archivo, a menos que ya no exista ningún otro archivo/directorio con el mismo nombre. ¿Cuál es el error que te da?

Todas las categorías x funcionan exactamente como se esperaba; Puedo cdentrar en directorios con --x, pero nada más. Puedo cdentrar en directorios con -wx, crear y eliminar archivos, pero lsdevuelve un error. Y puedo acceder cda r-xdirectorios, enumerar su contenido y trabajar en archivos para los que tengo permisos existentes, pero no puedo crear ni eliminar archivos. Todo esto tiene sentido para mí.

Entonces, ¿qué es lo que no estoy entendiendo correctamente acerca de r--y -w-?

Por favor, revise la discusión anterior una vez más y vea si eso ayuda.