GNU/Linux >> Tutoriels Linux >  >> Linux

Puis-je empêcher la création d'un dossier d'un certain nom ?

Vous ne pouvez pas, étant donné que l'utilisateur qui crée le répertoire dispose des autorisations suffisantes pour écrire dans le répertoire parent.

Vous pouvez à la place utiliser le inotify famille d'appels système fournis par le noyau Linux, pour surveiller la création (et éventuellement mv -ing) du répertoire shop dans le répertoire donné, s'il a été créé (ou éventuellement mv -ed), rm le répertoire.

Le programme d'espace utilisateur dont vous avez besoin dans ce cas est inotifywait (livré avec inotify-tools , installez-le d'abord si nécessaire).

En supposant le répertoire shop résiderait en /foo/bar répertoire, définissons une surveillance pour /foo/bar/shop création, et rm instantanément si créé :

inotifywait -qme create /foo/bar | \
             awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
  • inotifywait -qme create /foo/bar montres /foo/bar répertoire pour tout fichier/répertoire qui pourrait être créé, c'est-à-dire surveiller tout create événement

  • Si créé, awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }' vérifie si le fichier se trouve être un répertoire et le nom est shop (/,ISDIR shop$/ ), si oui rm le répertoire (system("rm -r -- /foo/bar/shop") )

Vous devez exécuter la commande en tant qu'utilisateur disposant d'une autorisation d'écriture sur le répertoire /foo/bar pour la suppression de shop du répertoire.

Si vous souhaitez surveiller mv -ing opérations aussi, ajouter watch pour moved_to événement aussi :

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

Juste pour noter, si vous cherchez un fichier, pas un répertoire, nommé 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") }'

Pour répondre littéralement en se basant sur la question de la prévention d'un dossier d'un certain nom à créer.

touch shop

Vous ne pouvez pas créer de répertoire si un fichier avec un nom identique existe

mkdir: cannot create directory ‘shop’: File exists


Qu'en est-il du piratage mkdir appel système avec 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

Notez qu'à l'intérieur de ce gestionnaire, vous pouvez enregistrer le PID du processus qui souhaite créer ce répertoire à la place :

$ 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

Vous devez placer ceci dans ~/.bashrc de la racine (ou de la personne qui exécute votre application) pour vous assurer qu'elle sera utilisée :

export LD_PRELOAD=/path/to/test.so

Linux
  1. Comment supprimer un répertoire et un dossier sous Linux ?

  2. Est-il possible d'empêcher certaines commandes d'être exécutées dans un répertoire ?

  3. Comment puis-je changer le nom de plusieurs fichiers dans un dossier ?

  4. Quel appel système Linux est utilisé par la commande ls sous Linux pour afficher le nom du dossier/fichier ?

  5. impossible de sourcer le script dans un répertoire courant

Comment puis-je télécharger un dossier entier, contenant d'autres dossiers, en utilisant sftp sous Linux ?

Impossible de supprimer un répertoire sous Unix

Pourquoi un dossier doit-il être exécutable ?

Linux / Dossier et dossier /racine

Comment dissocier (supprimer) le lien dur spécial . créé pour un dossier ?

Comment puis-je empêcher la détection des calmars ?