Estoy trabajando en una aplicación web LAMP y hay un proceso programado en algún lugar que sigue creando una carpeta llamada shop
en la raíz del sitio. Cada vez que esto aparece causa conflictos con las reglas de reescritura en la aplicación, no es bueno.
Hasta que encuentre el script ofensivo, ¿hay alguna manera de evitar que shop
se cree una carpeta llamada en la raíz? Sé que puedo cambiar los permisos en una carpeta para evitar que se cambie su contenido, pero no he encontrado una manera de evitar que se cree una carpeta con un nombre determinado.
linux
directory
directory-structure
Andrés
fuente
fuente
Respuestas:
No puede, dado que el usuario que crea el directorio tiene permiso suficiente para escribir en el directorio principal.
En su lugar, puede aprovechar la
inotify
familia de llamadas al sistema proporcionadas por el kernel de Linux, para observar la creación (y opcionalmentemv
-ing) del directorioshop
en el directorio dado, si se creó (u opcionalmentemv
-ed),rm
el directorio.El programa de espacio de usuario que necesita en este caso es
inotifywait
(viene coninotify-tools
, instálelo primero si es necesario).Suponiendo que el directorio
shop
residiría en el/foo/bar
directorio, configuremos un monitoreo para la/foo/bar/shop
creación, erm
instantáneamente si se crea:inotifywait -qme create /foo/bar
vigila el/foo/bar
directorio para cualquier archivo / directorio que pueda crearse, es decir, observe cualquiercreate
eventoSi se crea,
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
comprueba si el archivo es un directorio y el nombre esshop
(/,ISDIR shop$/
), de ser así,rm
el directorio (system("rm -r -- /foo/bar/shop")
)Debe ejecutar el comando como un usuario que tiene permiso de escritura en el directorio
/foo/bar
para eliminarlo delshop
directorio.Si también desea monitorear las
mv
operaciones de llamada, agregue también la observación demoved_to
eventos:Solo para tener en cuenta, si está buscando un archivo, no un directorio, llamado
shop
:fuente
inotifywait
a hacer esto, también es posible que el disparador también pueda atrapar el proceso conps -ef
Para responder literalmente en función de la cuestión de evitar que se cree una carpeta de cierto nombre.
touch shop
No puede crear un directorio si existe un archivo con un nombre idéntico
mkdir: cannot create directory ‘shop’: File exists
fuente
chattr +i shop
para hacerlo inmutable. Hasta que se elimine la bandera inmutable, ni siquiera se puede renombrar / eliminar.rename(2)
seguir funcionando, ya que el nombre no es parte del inodo, pero no lo es. La búsqueda rápida en Internet no revela por qué. ¿Alguna pista?rename
funcione.¿Qué hay de secuestrar
mkdir
syscall conLD_PRELOAD
...?Tenga en cuenta que dentro de este controlador puede registrar el PID del proceso que desea crear este directorio:
Debe colocar esto en la
~/.bashrc
raíz (o quien esté ejecutando su aplicación) para asegurarse de que se utilizará:fuente
LD_PRELOAD
Los trucos como este son básicamente incorrectos, y a menos que sepas lo que estás haciendo, pueden dañar el programa en el que los cargas rompiendo propiedades como la seguridad de la señal asíncrona de la función que estás reemplazando.fopen
debería tener en"a"
lugar de"w"
, por lo que puede preservar los registros anteriores(Hubiera comentado la respuesta de Miati pero no recuerdo mi cuenta anterior y no tengo suficiente reputación en esta nueva ...)
Puede bloquear la creación creando un archivo y luego cambiando los atributos del archivo.
Entonces, cualquier intento de hacer algo con ese archivo se bloqueará, incluso si el usuario se convierte en root.
fuente
Cree un enlace simbólico que apunte a una ubicación no existente dentro de un directorio no existente. Esto tiene algunas implicaciones divertidas:
EEXIST
(El archivo existe).ENOENT
(No existe tal archivo o directorio)ENOENT
. Por supuesto, lstat devolverá la información sobre el enlace simbólico.Esto tiene dos ventajas sobre algunas de las otras soluciones propuestas aquí: (a) no necesita un servicio en ejecución que rastrea la creación del directorio y (b) el nombre parece no existir para la mayoría de los comandos.
Tendrá que intentarlo, pero sospecho que, independientemente de las reglas de reescritura que tenga, no usan lstat u otros comandos sin referencia, lo que hace que fallen.
fuente