¿Cómo es que un usuario puede eliminar los archivos 755 de otro usuario?

35

Tengo un script de carga de respaldo que scp los archivos a otro servidor usando el usuario upload. Otra secuencia de comandos en el servidor de destino se envía a otro usuario y establece el modo de archivo en 755.

Si luego SSH en el servidor de destino con el uploadusuario, puedo eliminar los archivos seleccionados. ¿No deberían ser de solo lectura?

Así es como se ve un archivo en el servidor de destino, y el usuario uploadpuede eliminarlo.

-rwxr-xr-x 1 maciekish maciekish 650M Nov  1 01:07 2014-11-01-data.tar.bz2

El usuario uploadse acaba de agregar usando useraddy no es parte del maciekishgrupo.

Cuando intento eliminar el archivo a uploadtravés de ssh, me pregunto si deseo eliminar el "archivo normal protegido contra escritura" y puedo decirlo Yy eliminarlo.

Maciej Swic
fuente
44
Esencialmente un duplicado de ¿Por qué puede rmeliminar archivos de solo lectura?
G-Man el

Respuestas:

64

Los archivos son de solo lectura; sin embargo, eliminar un archivo no lo modifica sino solo el directorio padre (básicamente elimina el archivo de la lista del directorio), y parece que tiene permisos completos de escritura en el directorio.

Puede establecer el stickybit, también conocido como indicador de "eliminación restringida", que evitará que cualquier persona, excepto el propietario, renombre o elimine archivos en ese directorio (como en /tmp). Para hacer esto, ejecute chmod o+t *directory*como el propietario del directorio.

Gravedad
fuente
12

En un sistema de archivos Unix típico, cualquier archivo puede identificarse mediante un número arbitrario de entradas de directorio, cada una de las cuales contiene un "enlace duro".

Desde el punto de vista de la implementación, existe una diferencia entre eliminar la última entrada de directorio (enlace duro) para un archivo y simplemente eliminar una referencia de entre muchas. Sin embargo, desde un punto de vista semántico no hay diferencia.

Si existen múltiples enlaces duros a un archivo, escribir en el archivo usando cualquiera de ellos altera el archivo visto por todos ellos. rmSin embargo, el uso en un enlace simplemente hace que el archivo no sea accesible a través de ese enlace. Otros enlaces al archivo continúan viendo exactamente el mismo archivo.

Super gato
fuente
3
Comúnmente conocido como enlaces duros.
Bob
1
@Bob: Sé que el término "enlace duro" se usa para describir referencias que se crean a un archivo ya existente; en los casos en que un archivo nunca ha tenido más de una referencia, ¿esa referencia solitaria todavía se llama "enlace duro"?
supercat
3
No hay diferencia entre los enlaces. Cree el archivo A, cree el enlace rígido B, elimine el archivo A. ¿B es ahora un archivo o un enlace rígido? Para entender cómo funciona, es mejor verlo como N enlaces duros y no como 1 archivo y (N-1) enlaces duros. También están los enlaces que existen cuando se abre un archivo.
gnasher729
@ gnasher729: Estoy de acuerdo en que en los casos en que existen múltiples enlaces o han existido en un archivo, tiene sentido referirse a todos ellos como "enlaces duros" si no hay una diferencia semántica entre ellos. Por otro lado, creo que tanto desde el punto de vista semántico como del rendimiento, podría haber ventajas para distinguir entre una entrada de directorio que siempre ha sido la única referencia a un archivo, frente a una para la que se hayan creado otros enlaces duros. En cualquier caso, no sabía si sería correcto hacer referencia, por ejemplo, a las entradas del directorio, "cada una de las cuales se llama 'enlace duro'".
Supercat
2
@supercat no es increíblemente común, pero es correcto. Considere el campo st_nlink("número de enlaces duros") en struct stat. En pocas palabras, los directorios contienen enlaces duros a los archivos.
Hobbs