GNU/Linux >> Tutoriales Linux >  >> Linux

¿Puedo evitar que se cree una carpeta con un nombre determinado?

No puede, dado que el usuario que crea el directorio tiene suficientes permisos para escribir en el directorio principal.

En su lugar, puede aprovechar el inotify familia de llamadas al sistema proporcionadas por el kernel de Linux, para observar la creación (y opcionalmente mv -ing) del directorio shop en el directorio dado, si se crea (u opcionalmente mv -ed), rm el directorio.

El programa de espacio de usuario que necesita en este caso es inotifywait (viene con inotify-tools , instálelo primero si es necesario).

Asumiendo el directorio shop residiría en /foo/bar directorio, configuremos un monitoreo para /foo/bar/shop creación, y rm instantáneamente si se crea:

inotifywait -qme create /foo/bar | \
             awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
  • inotifywait -qme create /foo/bar relojes /foo/bar directorio para cualquier archivo/directorio que pueda crearse, es decir, busque cualquier create evento

  • Si se crea, awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }' comprueba si el archivo es un directorio y el nombre es shop (/,ISDIR shop$/ ), si es 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 la eliminación de shop del directorio.

Si desea monitorear mv Operaciones -ing también, agregue reloj para moved_to evento también:

inotifywait -qme create,moved_to /foo/bar | \
             awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'

Solo para tener en cuenta, si está buscando un archivo, no un directorio, llamado shop :

inotifywait -qme create /foo/bar | \
                 awk '$NF == "shop" { system("rm -- /foo/bar/shop") }'

inotifywait -qme create,moved_to /foo/bar | \
                 awk '$NF == "shop" { system("rm -- /foo/bar/shop") }'

Para responder literalmente basado en la pregunta de prevenir una carpeta de un cierto nombre a ser creado.

touch shop

No puede crear un directorio si existe un archivo con un nombre idéntico

mkdir: cannot create directory ‘shop’: File exists


¿Qué pasa con el secuestro de mkdir? llamada al sistema con LD_PRELOAD ...?

$ ls
test.c
$ cat test.c 
#define _GNU_SOURCE

#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dlfcn.h>

typedef int (*orig_mkdir_func_type)(const char *path, mode_t mode);

int mkdir(const char *path, mode_t mode) {
    if(!strcmp(path, "shop")) return 1;

    orig_mkdir_func_type orig_func;
    orig_func = (orig_mkdir_func_type)dlsym(RTLD_NEXT, "mkdir");
    return orig_func(path, mode);
}
$ gcc -shared -fPIC test.c -o test.so
$ LD_PRELOAD='./test.so' mkdir test
$ LD_PRELOAD='./test.so' mkdir shop
mkdir: cannot create directory ‘shop’: No such file or directory
$ ls
test  test.c  test.so

Tenga en cuenta que dentro de este controlador puede registrar el PID del proceso que desea crear este directorio en su lugar:

$ cat test.c 
#define _GNU_SOURCE

#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dlfcn.h>

typedef int (*orig_mkdir_func_type)(const char *path, mode_t mode);

int mkdir(const char *path, mode_t mode) {
    if(!strcmp(path, "shop")) {
        FILE* fp = fopen("/tmp/log.txt", "w");
        fprintf(fp, "PID of evil script: %d\n", (int)getpid());
        fclose(fp);
    }

    orig_mkdir_func_type orig_func;
    orig_func = (orig_mkdir_func_type)dlsym(RTLD_NEXT, "mkdir");
    return orig_func(path, mode);
}
$ gcc -shared -fPIC test.c -o test.so
$ LD_PRELOAD='./test.so' mkdir shop
$ cat /tmp/log.txt 
PID of evil script: 8706

Debe colocar esto en ~/.bashrc de root (o quienquiera que esté ejecutando su aplicación) para asegurarse de que se usará:

export LD_PRELOAD=/path/to/test.so

Linux
  1. ¿Cómo puedo comprobar si existe un directorio?

  2. No se puede eliminar un directorio en Unix

  3. ¿Por qué una carpeta debe ser ejecutable?

  4. Cómo desvincular (eliminar) el enlace duro especial. creado para una carpeta?

  5. Cambiar el nombre de una carpeta enorme:¿es arriesgado?

¿Se puede descifrar/eliminar el cifrado de la carpeta de inicio de un usuario?

Eliminar un enlace simbólico a un directorio

¿Cómo puedo cargar una carpeta completa, que contiene otras carpetas, usando sftp en linux?

Linux / Carpeta y /carpeta raíz

¿Cómo evitar ir a SWAP?

ls se cuelga para un directorio determinado