Назад | Перейти на главную страницу

Блокировка rm -rf для приложения

У меня есть приложение, которое во время выполнения генерирует интересные промежуточные результаты в каталог ./tmp.
В конце выполнения этот каталог будет удалено.
Как я могу сохранить его содержимое?

У меня в системе нет uid 0.
Поэтому я не могу перехватывать (блокировать отключение) любые операции ввода-вывода.
В настоящее время я останавливаю это приложение и cp его содержимое.

Приложение скомпилировано статически, поэтому разделяемые библиотеки + LD_PRELOAD не поможет. Приложение использует папку **. / ** tmp, которая не связана ни с какой переменной env.

Спасибо за ответы.

Это может быть значение переменных среды TMPDIR или TEMPDIR. Вы можете попробовать установить это в другой каталог и посмотреть, использует ли программа это вместо этого. Возможно, это настройка конфигурации.

Если вы можете удалить каталог / tmp или все, что в нем, как пользователь без полномочий root, то ваши разрешения кажутся неправильными.

В моей системе есть следующие разрешения:

drwxr-xr-x 26 root root 4096 2009-10-14 12:00 /
drwxrwxrwt 27 root root 12288 2009-10-19 16:10 /tmp

Каталог / позволяет только root удалять каталоги верхнего уровня, а липкий бит в / tmp позволяет владельцам удалять только свои собственные файлы в / tmp. Очевидно, что для решения этих проблем вам потребуется root.

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

Создайте unlink.c, содержащий:

int unlink(const char *pathname) {
   return 0; 
}

int unlinkat(int dirfd, const char *pathname, int flags) {
   return 0;
}

Мы также переопределяем функцию unlinkat, если она ее использует. Теперь вы можете запустить:

% gcc unlink.c --shared -o unlink.so
% file unlink.so
unlink.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), 
dynamically linked, not stripped
% touch foo
% LD_PRELOAD=./unlink.so rm foo
% ls foo 
foo

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

На ум приходят две мысли:

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

    chattr + i / путь / к / файлам / *

  2. Если программа является сценарием, отключите команду rm для этого пользователя. Создайте псевдоним, который ничего не делает для rm:

    псевдоним rm = 'эхо'

Я думаю, что первое предотвратит удаление файлов, но не произойдет автоматически. Во втором случае приложение не сможет удалить какие-либо файлы, по крайней мере, с помощью команды RM. Если он использует вызов файловой системы, вам будет сложно предотвратить удаление таким образом.