ディレクトリを作成するユーザーが親ディレクトリに書き込むための十分な権限を持っている場合は、できません。
代わりに 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