GNU/Linux >> Linux Esercitazione >  >> Linux

Posso impedire la creazione di una cartella con un determinato nome?

Non puoi, dato che l'utente che crea la directory ha i permessi sufficienti per scrivere sulla directory padre.

Puoi invece sfruttare il inotify famiglia di chiamate di sistema fornite dal kernel Linux, per controllare la creazione (e facoltativamente mv -ing) della directory shop nella directory data, se creata (o facoltativamente mv -ed), rm la cartella.

Il programma in spazio utente di cui hai bisogno in questo caso è inotifywait (fornito con inotify-tools , installalo prima se necessario).

Assumendo la directory shop risiederebbe in /foo/bar directory, impostiamo un monitoraggio per /foo/bar/shop creazione e rm istantaneamente se creato:

inotifywait -qme create /foo/bar | \
             awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
  • inotifywait -qme create /foo/bar orologi /foo/bar directory per qualsiasi file/directory che potrebbe essere creata, ad esempio controlla qualsiasi create evento

  • Se creato, awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }' controlla se il file è una directory e il nome è shop (/,ISDIR shop$/ ), in caso affermativo rm la cartella (system("rm -r -- /foo/bar/shop") )

Devi eseguire il comando come utente che dispone dell'autorizzazione di scrittura sulla directory /foo/bar per la rimozione di shop dalla directory.

Se vuoi monitorare mv -ing anche le operazioni, aggiungi watch per moved_to anche l'evento:

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

Solo per notare, se stai cercando un file, non una directory, chiamato 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") }'

Per rispondere letteralmente in base alla domanda sulla prevenzione di una cartella di un certo nome da creare.

touch shop

Non puoi creare una directory se esiste un file con lo stesso nome

mkdir: cannot create directory ‘shop’: File exists


Che dire del dirottamento di mkdir chiamata di 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

Si noti che all'interno di questo gestore è possibile registrare il PID del processo che desidera invece creare questa directory:

$ 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

Devi inserirlo in ~/.bashrc di root (o chiunque esegua la tua app) per garantire che venga utilizzato:

export LD_PRELOAD=/path/to/test.so

Linux
  1. È possibile limitare l'esecuzione di determinati comandi in una directory?

  2. Rimuove un collegamento simbolico a una directory

  3. Come posso verificare se esiste una directory?

  4. Impossibile rimuovere una directory in Unix

  5. Come posso escludere una directory dal comando ls

Come posso caricare un'intera cartella, che contiene altre cartelle, usando sftp su Linux?

git clone senza cartella del progetto

Linux / Cartella e cartella /root

Come evitare di andare in SWAP?

Come scollegare (rimuovere) lo speciale hardlink . creato per una cartella?

ls si blocca per una determinata directory