Ничего не добавлять в любой из ваших сценариев запуска оболочки, это ненужный взлом.
Вместо этого добавьте
AddKeysToAgent yes
в ваш .ssh / config
Таким образом, ssh-add запускается автоматически при первом использовании ssh в другом окне. Вам нужно только повторно ввести свой ключ, когда он истечет через ssh-agent или после перезагрузки.
Вы не можете, поскольку пользователь, создающий каталог, имеет достаточно прав для записи в родительский каталог.
Вместо этого вы можете использовать семейство системных вызовов 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") }'
Как насчет перехвата системного вызова 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
Создайте символическую ссылку, указывающую на несуществующее местоположение внутри несуществующего каталога. Это имеет некоторые забавные последствия:
$ 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
EEXIST
(Файл существует). ENOENT
(Нет такого файла или каталога) ENOENT
. lstat, конечно, вернет информацию о символической ссылке. У этого есть два преимущества перед некоторыми другими предлагаемыми здесь решениями: (а) вам не нужна запущенная служба, отслеживающая создание каталога, и (б) имя не существует для большинства команд.
Вам придется попробовать, но я подозреваю, что какие бы правила перезаписи у вас ни были, они не используют lstat или другие команды без разыменования, что приводит к их сбою.
Дать буквально ответ на вопрос о предотвращении создания папки с определенным именем.
touch shop
Вы не можете создать каталог, если существует файл с таким же именем
mkdir: невозможно создать каталог 'shop': Файл существует
(Мог бы прокомментировать ответ Миати, но не могу вспомнить свою старую учетную запись и у нее недостаточно репутации для этой новой ...)
Вы можете заблокировать создание путем создания файла и последующего изменения атрибутов файла.
$ 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