6 votos

Comprender los permisos de directorio en UNIX

He estado intentando aprender un poco mejor Unix y Terminal, y me he encontrado con algunos comportamientos que no entiendo. Esperando que alguien pueda explicarme lo que se me escapa.

Últimamente he estado experimentando con los permisos en los directorios. Por lo que (creí) entender, el permiso de lectura significa que puedes ver el contenido de un directorio (es decir, ls directory debería enumerar el contenido del directorio); el 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 puedes hacer que el directorio sea tu directorio de trabajo (es decir, cd directory debería funcionar)

Pero eso no es lo que estoy encontrando.

Si tengo r-- en un directorio, recibo errores al intentar cd directory o touch directory/newfile como era de esperar. Pero si ejecuto ls directory -- bueno, no me da un error, pero no aparecen archivos, aunque sé que hay archivos que me pertenecen y/o sobre los que tengo derechos dentro del directorio. Así que, ls se ha ejecutado con éxito pero sin datos en la salida estándar. ¿Por qué no?

Si tengo -w- en un directorio, recibo errores en cd y ls como era de esperar. Pero si intento crear un nuevo archivo - touch directory/newfile - También me sale un error. ¿Por qué?

Todos los x categorías funcionan exactamente como se esperaba; puedo cd en directorios con --x pero nada más. Puedo cd en directorios con -wx crear y eliminar archivos, pero ls devuelve un error. Y puedo cd en r-x directorios, listar su contenido y trabajar en los archivos para los que tengo permisos, pero no puedo crear o eliminar archivos. Todo esto tiene sentido para mí.

Entonces, ¿qué es lo que no he entendido bien sobre r-- y -w- ?

6voto

Michael Zhou Puntos 167

Si tengo r-- en un directorio, recibo errores al intentar cd directorio o touch directorio/archivo nuevo, como es de esperar. Pero si ejecuto ls directorio -- bueno, no recibo un error, pero no se listan archivos, incluso si sé que hay archivos que me pertenecen y/o a los que tengo derechos dentro del directorio. Entonces, ls se ha ejecutado con éxito pero sin datos en la salida estándar. ¿Por qué no?

Si sólo ls directory entonces los "archivos" dentro de directory debería listarse, pero si se utiliza ls -l que llama stat(2) la operación fallará silenciosamente como stat requiere una ruta completa de búsqueda del objeto del sistema de archivos.

Si tengo -w- en un directorio, recibo errores en cd y ls, como es de esperar. Pero si intento crear un nuevo archivo -tocar directorio/archivo nuevo- también obtengo un error. ¿Por qué?

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

4voto

Nimesh Neema Puntos 69

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

Hay tres tipos de permisos

  • r : leer el permiso

  • w : permiso de escritura

  • x : permiso de ejecución

para tres categorías de propietarios

  • u : el 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

A 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, vamos a exponer claramente lo que significan los tres tipos de permisos (lectura, escritura, ejecución) para un directorio. Supongamos que el usuario conectado en cuestión es el propietario del directorio (para simplificar las cosas)

  • leer : El directorio (técnicamente el archivo del directorio), puede ser leer es decir, el contenido del directorio se puede listar, por ejemplo, con la función ls comando.

  • escribir : El directorio (técnicamente el archivo del directorio), puede ser escrito . Esto significa que se puede crear y eliminar un nuevo archivo/subdirectorio mediante comandos como touch , vim , cp etc.

  • ejecutar : El directorio (técnicamente el archivo del directorio), puede ser ejecutado . Esto significa simplemente que el propietario puede cambiar a este directorio, es decir cd en el directorio.

Ahora cuidadosamente piense en cada uno de los permisos mencionados anteriormente independientemente . He aquí las distintas posibilidades de permisos y lo que el propietario puede hacer en cada caso:

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

  • - - x : La propietaria puede cambiar en el directorio, pero no puede crear/borrar archivos/directorios en él, ni puede listar el contenido del directorio.

  • - w - : El propietario puede crear/borrar archivos/directorios dentro de este directorio, pero no puede listar su contenido, ni puede cambiar en él.

  • - w x : El propietario puede crear/borrar archivos/directorios dentro de este directorio, cambiar en él, pero no puede listar su contenido.

  • r - - : El propietario sólo puede listar el contenido del directorio.

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

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

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

Esto debería ayudar a entender claramente qué acciones son posibles con qué permisos de directorio.

Una vez que los conceptos anteriores tengan sentido para usted, repasemos de nuevo los enunciados de su problema:

Por lo que (creí) entender, el permiso de lectura significa que se puede ver el contenido de un directorio (es decir, ls directory debería listar el contenido del directorio);

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

El 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 Esto significa que añadiendo y borrado de contenido al archivo del directorio. (Esto ya debería estar claro, pero lo repetiré, un directorio es simplemente un archivo, aunque especial, que simplemente almacena una lista de todos los archivos y subdirectorios contenidos). Esto significa que puedes 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 donde 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 directory debería funcionar)

Absolutamente correcto.

Si tengo r-- en un directorio, recibo errores al intentar cd directory o touch directory/newfile como era de esperar. Pero si ejecuto ls directory -- bueno, no me da un error, pero no aparecen archivos, aunque sé que hay archivos que me pertenecen y/o sobre los que tengo derechos dentro del directorio. Así que, ls se 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 ninguna salida ocurre cuando el directorio está completamente vacío. Si tiene permiso de lectura en un directorio, el contenido debería aparecer en la lista independientemente del permiso de los archivos/subdirectorios. Otra posibilidad es que los archivos y directorios estén ocultos. Pruebe a ejecutar ls -a directory . Puede volver a comprobar que tiene permiso de lectura en el directorio ejecutando ls -ld directory . Compruebe también la salida de alias ls .

Si tengo -w- en un directorio, recibo errores en cd y ls como era de esperar. Pero si intento crear un nuevo archivo - touch directory/newfile - También me sale un error. ¿Por qué?

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

Todos los x categorías funcionan exactamente como se esperaba; puedo cd en directorios con --x pero nada más. Puedo cd en directorios con -wx crear y eliminar archivos, pero ls devuelve un error. Y puedo cd en r-x directorios, listar su contenido y trabajar en los archivos para los que tengo permisos, pero no puedo crear o eliminar archivos. Todo esto tiene sentido para mí.

Entonces, ¿qué es lo que no he entendido bien sobre r-- y -w- ?

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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X