Можно ли предотвратить создание папки с определенным именем?

Ничего не добавлять в любой из ваших сценариев запуска оболочки, это ненужный взлом.

Вместо этого добавьте

AddKeysToAgent yes

в ваш .ssh / config

Таким образом, ssh-add запускается автоматически при первом использовании ssh в другом окне. Вам нужно только повторно ввести свой ключ, когда он истечет через ssh-agent или после перезагрузки.

16
03.10.2016, 06:36
5 ответов

Вы не можете, поскольку пользователь, создающий каталог, имеет достаточно прав для записи в родительский каталог.

Вместо этого вы можете использовать семейство системных вызовов 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 event

  • Если создано, awk '/, ISDIR shop $ / {system ("rm -r - / foo / bar / shop")}' проверяет наличие файла это каталог и его имя магазин ( /, ISDIR shop $ / ), если это так, rm каталог ( system ("rm -r - / foo / bar / shop ") )

Для удаления вам необходимо запустить команду от имени пользователя, имеющего разрешение на запись в каталог / foo / bar магазин из справочника.


Если вы хотите отслеживать операции mv -ing, добавьте также наблюдение за событием move_to :

inotifywait -qme create,moved_to /foo/bar | \
             awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/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") }'
31
27.01.2020, 19:47

Как насчет перехвата системного вызова 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
5
27.01.2020, 19:47

Создайте символическую ссылку, указывающую на несуществующее местоположение внутри несуществующего каталога. Это имеет некоторые забавные последствия:

$ ln -s non-existent/foobar foo
$ ls -ln
total 0
lrwxrwxrwx 1 1000 1000 19 Okt  4 17:17 foo -> non-existent/foobar
$ mkdir foo
mkdir: cannot create directory ‘foo’: File exists
$ cat foo
cat: foo: No such file or directory
$ echo foo > foo
zsh: no such file or directory: foo
  1. mkdir, link и другие не работают с EEXIST (Файл существует).
  2. Попытка открыть путь для чтения, записи или добавления завершится неудачно с ENOENT (Нет такого файла или каталога)
  3. Использование stat (2) (не lstat (2) или stat (1) ) на локации также не работает с ENOENT . lstat, конечно, вернет информацию о символической ссылке.

У этого есть два преимущества перед некоторыми другими предлагаемыми здесь решениями: (а) вам не нужна запущенная служба, отслеживающая создание каталога, и (б) имя не существует для большинства команд.

Вам придется попробовать, но я подозреваю, что какие бы правила перезаписи у вас ни были, они не используют lstat или другие команды без разыменования, что приводит к их сбою.

4
27.01.2020, 19:47

Дать буквально ответ на вопрос о предотвращении создания папки с определенным именем.

touch shop

Вы не можете создать каталог, если существует файл с таким же именем

mkdir: невозможно создать каталог 'shop': Файл существует

30
27.01.2020, 19:47

(Мог бы прокомментировать ответ Миати, но не могу вспомнить свою старую учетную запись и у нее недостаточно репутации для этой новой ...)

Вы можете заблокировать создание путем создания файла и последующего изменения атрибутов файла.

$ sudo touch shop
$ sudo chattr +i shop

Тогда любая попытка сделать что-либо с этим файлом будет заблокирована - даже если пользователь станет пользователем root.

$ rm shop
rm: remove write-protected regular empty file ‘shop’? y
rm: cannot remove ‘shop’: Operation not permitted
$ sudo rm shop
rm: cannot remove ‘shop’: Operation not permitted
4
27.01.2020, 19:47

Теги

Похожие вопросы