GNU/Linux >> Linux の 問題 >  >> Linux

特定の名前のフォルダが作成されないようにすることはできますか?

ディレクトリを作成するユーザーが親ディレクトリに書き込むための十分な権限を持っている場合は、できません。

代わりに inotify を利用できます Linux カーネルによって提供されるシステム コールのファミリで、作成を監視します (オプションで mv -ing) のディレクトリ shop 作成された場合は、指定されたディレクトリ (またはオプションで mv -ed)、rm ディレクトリ。

この場合に必要なユーザー空間プログラムは inotifywait です (inotify-tools が付属しています 、必要に応じて最初にインストールしてください)。

ディレクトリ shop を想定 /foo/bar に存在します ディレクトリ、/foo/bar/shop の監視を設定しましょう 作成、および rm 作成された場合は即座に:

inotifywait -qme create /foo/bar | \
             awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
  • inotifywait -qme create /foo/bar 腕時計 /foo/bar 作成される可能性のあるファイル/ディレクトリのディレクトリ、つまり create を監視します イベント

  • 作成された場合、awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }' ファイルがたまたまディレクトリで、名前が shop であるかどうかを調べます (/,ISDIR shop$/ )、そうであれば rm ディレクトリ (system("rm -r -- /foo/bar/shop") )

ディレクトリ /foo/bar への書き込み権限を持つユーザーとしてコマンドを実行する必要があります shop の削除 ディレクトリから。

mvを監視したい場合 -ing 操作も、moved_to の監視を追加します イベントも:

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

ディレクトリではなく 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") }'

フォルダを防ぐという質問に基づいて文字通り答える 作成される特定の名前の。

touch shop

同名のファイルが存在する場合、ディレクトリを作成できません

mkdir: cannot create directory ‘shop’: File exists


mkdir のハイジャックについてはどうですか 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

このハンドラ内で、代わりにこのディレクトリを作成したいプロセスの PID を記録できることに注意してください:

$ 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

これを ~/.bashrc に配置する必要があります これが確実に使用されるように、root (またはアプリを実行しているユーザー) の権限:

export LD_PRELOAD=/path/to/test.so

Linux
  1. SWAPに行くのを防ぐには?

  2. 特別なハードリンクのリンクを解除 (削除) する方法。フォルダ用に作成された?

  3. 巨大なフォルダの名前変更:危険ですか?

  1. Linuxでディレクトリとフォルダを削除する方法は?

  2. イカが検出されないようにするにはどうすればよいですか?

  3. 特定のディレクトリで ls がハングする

  1. 特定のコマンドがディレクトリで実行されるのを制限することは可能ですか?

  2. ユーザーのホームフォルダから暗号化を解除/暗号化を削除できますか?

  3. ディレクトリが存在するかどうかを確認するにはどうすればよいですか?