Pregunta corta
¿Por qué podemos manipular un archivo de solo lectura en Vim usando :+ w+ q+ !incluso sin ser administrador?
Pregunta larga:
Tengo un archivo de texto (myFile.txt) que es de solo lectura para todos:
navid@navid-ThinkPad-T530:~/ubuntuTest$ ls -l myFile.txt
-r--r--r-- 1 navid navid 26 Aug 22 21:21 myFile.txt
Puedo abrirlo con Vim sin tener privilegios de administrador:
navid@navid-ThinkPad-T530:~/ubuntuTest$ vi myFile.txt
Lo modifico y presiono: Esc+ :+ w+ q+ Entery veo este mensaje de error:
E45: 'readonly' option is set (add ! to override)
Hasta ahora, todo tiene sentido. Pero cuando presiono: Esc+ :+ w+ q+ !+ Enter, Vim guarda los cambios.
Estoy usando Ubuntu 16.04 y VIM 7.4.
command-line
permissions
vim
chmod
read-only
Navid Vafaei
fuente
fuente
Modifying a file and replacing a file are two different things
Respuestas:
Como @Rob ya mencionó , solo puede hacer esto si tiene acceso de escritura al directorio que contiene el archivo. Intentar hacer lo mismo con un archivo, por ejemplo,
/etc
fallará.En cuanto a cómo
vim
está haciendo esto, elimina el archivo y lo vuelve a crear. Para probar esto, creé un archivo propiedad de root:Y luego procedió a editar el archivo
vim
de la manera que usted describe, pero adjuntando el procesostrace
para ver qué está sucediendo:Luego verifiqué
strace.out
y encontré:Entonces, primero se eliminó el archivo (
unlink("fff")
), luego se creó un nuevo archivo con el mismo nombre (open("fff", O_WRONLY|O_CREAT|O_TRUNC, 0644)
) y las modificaciones que hice se escribieron en él (write(4, "foasdasdao\n", 11)
). Si prueba esto en casa, verá que después de editarlovim
, el archivo ahora le pertenecerá a usted y no a la raíz.Entonces, estrictamente hablando,
vim
no está editando un archivo al que no tiene acceso de escritura. Está eliminando un archivo de un directorio en el que tiene acceso de escritura y luego crea un nuevo archivo al que, nuevamente, tiene acceso de escritura.fuente
rename(2)
para reemplazar el archivo anterior. Entonces no hay una ventana de tiempo donde sus datos no existan en el disco.Siempre que posea el directorio principal, puede eliminar o reemplazar un archivo sin importar el permiso, ya que puede cambiar el contenido del directorio :).
Pruébelo con otro comando como rm, se lo indicará pero aún puede hacerlo. Haga que el directorio no se pueda escribir y eso debería detenerlo.
Adición:
Solo lo probé, pero mientras sea propietario del archivo, aún puedo modificarlo, incluso con la carpeta de solo lectura. Sin embargo, cuando cambio la propiedad a root: root no puede abrir el archivo para escribir. Entonces resuelve los archivos de modificación propiedad de root (u otra persona)
fuente
Al
w!
usarlo, está eliminando el archivo original ( que se le permite hacer ) y escribiendo su versión en su lugar.Cuando tiene acceso de escritura a un directorio, puede: crear, mover o eliminar archivos dentro de ese directorio.
Ahora déjame cambiar mi usuario y cambiar el archivo
Ahora mira lo que hay allí:
fuente
Ver
:help write-readonly
:Como tiene permisos de escritura en el directorio (lo que significa que puede crear, eliminar o renombrar archivos en él), el sistema lo permite.
El valor predeterminado de
cpoptions
no contieneW
:fuente
Esta es la advertencia de VIM que puede ser relativamente importante teniendo en cuenta cómo funcionan los permisos en UNIX. La aparente falta de intuición de esto se debe a que los sistemas de archivos UNIX tienen permisos para el archivo almacenado en el nodo i del archivo. La estructura del directorio está de alguna manera separada y solo está vinculando estos i-nodos. Los directorios también tienen sus permisos que dicen si puede vincular / desvincular archivos en él, o leerlo o atravesar subdirectorios. Este diseño permite que el mismo archivo pueda aparecer en varios lugares diferentes en la estructura del directorio (a través de enlaces duros). Al decir "agregar! Para anular", VIM está tratando de advertirle que el archivo original estará desvinculado (por lo que permanecerá intacto en todos los demás lugares) y el nuevo archivo se creará y vinculará al lugar original en la estructura del directorio. En caso de que el recuento de enlaces del archivo original disminuya a cero, el archivo original se liberará, pero si no, está clonando efectivamente el archivo. La apertura del archivo también cuenta como enlace, por lo que si algún programa abrió el archivo y usted acepta "agregar! Para anular", el programa no verá los cambios realizados en el archivo con VIM. El archivo solo se desvincula del directorio por VIM y después de cerrar el archivo por otro programa, el archivo se liberará, a menos que esté vinculado en otro lugar.
Tenga en cuenta que en Windows, los permisos para los archivos se almacenan en el directorio, por lo que desde el punto de vista del paradigma de los permisos de Windows, este comportamiento vim puede parecer extraño. Para escribir en el archivo, Windows lógicamente también puede verificar algunos permisos de directorio, incluso permisos de super-directorio. Como se dijo anteriormente, en UNIX, los permisos de directorio son irrelevantes para la manipulación del archivo en la medida en que pudo enumerarlo y abrirlo (es decir, había x para todos los super-directorios). Es posible que el archivo abierto en UNIX ya no tenga el nombre del archivo si se desvincula de todos los directorios después de abrirlo.
Por ejemplo, tiene el archivo / home / user1 / foo y es el mismo archivo que (es decir, está vinculado a) / home / user2 / foo y nadie puede escribir el archivo y actualmente está abierto por el programa P (lectura-escritura abierta por programa iniciado por root). Si user1 lo abre con vim y lo sobrescribe, hace su propia copia y ya no ve el archivo original. Si posteriormente user2 abre su enlace con vim y escribe en él, se volverá a desvincular y creará otra copia. El programa P seguirá viendo el archivo original y podrá leerlo o escribirlo libremente. Tan pronto como el programa cierre el archivo, el archivo desaparecerá (el sistema de archivos lo liberará).
fuente
Tanto su proceso de editor vim como su archivo llevan su
propiedad para que también puedas pagar
y podrías adivinar que alguna vez fue aún más simple
(que requiere solo + w, el permiso de desvinculación de ut en. y ni siquiera la propiedad) se volvió demasiado frecuente para que alguien teclee, de modo que vim se reprogramó para ofrecer automáticamente y, a pedido, realizar automáticamente tal operación.
Intenta sobrescribir la de tu hermana mayor
como simples navid y apuestas son tu vim te da tu negativa deseada.
fuente
Esto no es exactamente una respuesta, pero si realmente desea configurar un archivo para que nadie pueda cambiarlo o eliminarlo, puede hacerlo inmutable.
Normalmente, incluso cuando un archivo es propiedad de root, aún puede eliminar el archivo si tiene permisos de escritura en la carpeta. Pero cuando hace que el archivo sea inmutable, incluso la raíz no puede modificarlo ni eliminarlo.
Para hacer que un archivo sea inmutable (necesita
sudo
):Puedes ver esto con
lsattr
(la letrai
en el resultado):Para volver a normalizar el archivo:
Para aclarar: cuando un archivo es inmutable, no se puede eliminar, renombrar, modificar o incluso enlazar.
Vale la pena leerlo
man chattr
, porque los archivos pueden tener varios atributos útiles.También puede encontrar útil la "eliminación restringida". Si se coloca en una carpeta (no un archivo), esto significa que quien crea un archivo dentro de la carpeta puede modificarlo o eliminarlo, pero nadie más lo está (excepto el usuario root). La carpeta
/tmp
tiene este conjunto de banderas. Puedes ver esto con lat
bandera en/tmp
:Para establecer o eliminar la marca de eliminación restringida en una carpeta:
fuente