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 directory
debe 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 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 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, 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 se esperaba. Pero si trato de crear un archivo nuevo, touch directory/newfile
también recibo un error. ¿Por qué?
Todas las categorías x funcionan exactamente como se esperaba; Puedo cd
entrar en directorios con --x
, pero nada más. Puedo cd
entrar en directorios con -wx
, crear y eliminar archivos, pero ls
devuelve un error. Y puedo acceder cd
a r-x
directorios, 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-
?
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 directory
entonces, los "archivos" dentro directory
deberían aparecer, pero si usa ls -l
qué llamadas, stat(2)
la operación fallará silenciosamente, ya que stat
requiere 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 touch
llama 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á.
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 ls
comando.
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
, cp
etc.
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, cd
al 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 directory
debe 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
, ovi directory/fileimade
, orm 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 directory
debería funcionar)
Absolutamente correcto.
Si tengo
r--
en un directorio, recibo errores al intentarcd directory
otouch directory/newfile
, como se esperaba. Pero si ejecutols 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,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 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 encd
yls
, como se esperaba. Pero si trato de crear un archivo nuevo,touch directory/newfile
tambié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
cd
entrar en directorios con--x
, pero nada más. Puedocd
entrar en directorios con-wx
, crear y eliminar archivos, perols
devuelve un error. Y puedo accedercd
ar-x
directorios, 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.
CASmnl42
ls -l
a 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?Jörg W. Mittag
CASmnl42
readwrite
conrw-
permiso y dos archivos dentro de namedrwtoedit
yrwtodelete
, ambos conrw-
permiso (los permisos son míos como propietario). El comandorm -f readwrite/rwtodelete
falla con errorPermission denied
. El comandovi readwrite/rwtoedit
carga el editor pero no el archivo, nuevamente conPermission denied
error. 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?TazónDeRojo