Usted, glen
es el propietario del directorio (vea el .
archivo en su listado). Un directorio es solo una lista de archivos y tiene permiso para modificar esta lista (por ejemplo, agregar archivos, eliminar archivos, cambiar la propiedad para volver a ser suya, etc.). Es posible que no pueda alterar el contenido del archivo directamente, pero puede leer y desvincular (eliminar) el archivo en su conjunto y agregar nuevos archivos posteriormente. 1 Solo presenciando el antes y el después, puede parecer que el archivo ha sido alterado.
Vim utiliza archivos de intercambio y los mueve bajo el agua, lo que explica por qué parece escribir en el mismo archivo que en su shell, pero no es lo mismo. 2
Entonces, lo que hace Vim se reduce a esto:
cat temp > .temp.swp # copy file by contents into a new glen-owned file
echo nope >> .temp.swp # or other command to alter the new file
rm temp && mv .temp.swp temp # move temporary swap file back
1 Esta es una diferencia importante en el manejo de permisos de archivos entre Windows y Unices. En Windows, por lo general, uno no puede eliminar archivos para los que no tiene permiso de escritura.
2 actualización: como se señaló en los comentarios, Vim no lo hace de esta manera para cambiar la propiedad, ya que el número de inodo en el temp
archivo no cambia (aparece ls -li
antes y después). Usando strace
podemos ver exactamente lo que vim
hace. La parte interesante está aquí:
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = -1 EACCES (Permission denied)
unlink("temp") = 0
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 4
write(4, "more text bla\n", 14) = 14
close(4) = 0
chmod("temp", 0664) = 0
Esto muestra que solo se desvincula , pero no cierra el descriptor de archivo temp
. Simplemente sobrescribe todo su contenido ( more text bla\n
en mi caso). Supongo que esto explica por qué el número de inodo no cambia.
ls -il
antes y después ... sitemp
el número de inodo cambió, sabe que es un archivo diferente con el mismo nombre.antes de:
-rw-r--r-- 1 root staff 0 19 Dec 12:38 temp
después:
-rw-r--r-- 1 glen staff 7 19 Dec 12:38 temp
El vim no rompe la barrera del permiso. Solo eche un vistazo a la información del archivo que aparece en la lista cuidadosamente y luego podría descubrir que vim realmente eliminó el archivo original (porque tiene permiso para eliminar el archivo aunque no puede cambiar su contenido) y luego creó un nuevo archivo propio ( ver que el propietario ya no es 'root').
Y mientras edita el archivo original en vim, le advierte que está cambiando un archivo de solo lectura. Entonces, cuando escribe el comando
:wq!
(forzar la operación), lo que vim solo puede hacer es eliminar el archivo existente y crear un nuevo archivo que tenga el mismo nombre.Espero que ayude.
fuente
Use la
-i
opción dels
para ver el número de inodo, que es un identificador único (dentro del sistema de archivos) de un archivo u otro objeto.Verá que el archivo fue reemplazado por un objeto diferente: el número de inodo probablemente cambiará.
Ver el mismo número de inodo no es prueba de nada: se puede reciclar un número de inodo. Si eliminamos el último enlace a un archivo y luego creamos un nuevo archivo, podríamos obtener uno con el mismo número de inodo. Pero eso no puede suceder si el archivo antiguo se elimina después de crear el nuevo. Por ej
mv file file.tmp; touch file; rm file.tmp
. Sospecho que vim realmente hace algo análogo a estoecho new_content > tmpfile; mv tmpfile file
. Lamv
operación se traducirá en unarename
llamada al sistema, por lo que la asignación de números de inodo depende de cómo el sistema de archivos implementa un cambio de nombre que desvincula un destino.fuente