LINUX.ORG.RU

Возможно ли залочить директорию от попыток ее удаления/переименования/перемещения?


0

1

Можно ли как-нибудь залочить директорию на время работы проги?
На сколько я знаю такое не приветствуется, и его скорее всего не реализовано.
Приветствуются любые костыли или теоретически возможные варианты, может какие-то манипуляции с правами доступа сделать.

★★

man acl

// b.

anonymous
()
Ответ на: комментарий от V1KT0P

Нет, рут недоступен.

Напиши свой fuse-модуль (а может уже есть). Хотя можешь написать «нет, fusermount недоступен».

anonymous
()
Ответ на: комментарий от ziemin

а что ты сделать хочешь? По идее каталоги это тоже файлы. Может на них flock сработает?

Пробовал flock и fcntl, бесполезно. Хотя может я не правильно их использовал. Но нагуглить что-то нормальное не смог.

V1KT0P ★★
() автор топика
Ответ на: комментарий от ziemin

Может на них flock сработает?

«Чо», при flock файл удалить нельзя? // btw вы, батенька, уже не первый раз отличаетесь.

anonymous
()
Ответ на: комментарий от anonymous

Напиши свой fuse-модуль (а может уже есть). Хотя можешь написать «нет, fusermount недоступен».

Блокировка нужна для небольшой статически собранной консольной утилитки, тянуть что-то еще нельзя.

V1KT0P ★★
() автор топика
Ответ на: комментарий от anonymous

А блин, чтоб сторонние не удалили? Тогда пардон.

anonymous
()

снять права записи с директории в которой находится защищаемая директория (простая защита от удаления и переименования)

anonymous
()

и ещё, от кого защищаем? кто будет пытаться изменять директорию? и какие у него будут права?

anonymous
()

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

arturpub ★★
()

Можно ли как-нибудь залочить директорию на время работы проги?

объясни для начала зачем?

dikiy ★★☆☆☆
()
Ответ на: комментарий от teod0r

Как скажешь.

$ mkdir test
$ touch test/file1
$ touch test/file2
$ gcc -std=c99 test.c
$ ./a.out
<в другом терминале: mv test test2>

file: .
file: ..
file: file1
file: file2
closedir: 0
$

#include <sys/stat.h>
#include <stdio.h>
#include <dirent.h>

int
main(int argc, char *argv[])
{
    DIR *d = opendir("./test");

    char line[80];
    fgets(line, sizeof(line), stdin);

    struct dirent *e;
    while ((e = readdir(d))) {
        printf("file: %s\n", e->d_name);
    }
    int res = closedir(d);
    printf("closedir: %d\n", res);

    return 0;
}
arturpub ★★
()

Перед запуском сделай chattr +i имя_файла, после окончания - chattr -i имя_файла.

anonymous
()
Ответ на: комментарий от teod0r

я не программист

Теперь ясно. «Открытие» директории это получение read-only ссылки на нее. Ее может уже не быть в ФС, или она могла быть перемещена, но по этой ссылке все еще можно пройти. В случае удаления смысла в этом нет, т.к. все файлы тоже были удалены, а новые добавить нельзя. А вот перемещение директории (внутри одной ФС конечно) программисту вредить не будет, он уже ее открыл держит за хвост.

Фактически, директория не удалится, пока ее все не закроют, хотя обычному юзеру это и не видно. То же самое с файлами, правда в удаленные, но еще открытые файлы еще и писать можно хоть до победного, пока все место не займешь. Один из способов хранения очень временных данных — открыть файл в /tmp на запись и сразу удалить его.

arturpub ★★
()

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

vtVitus ★★★★★
()
Ответ на: комментарий от anonymous

снять права записи с директории в которой находится защищаемая директория (простая защита от удаления и переименования)

снять права записи с директории в которой находится защищаемая директория (простая защита от удаления и переименования)

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

и ещё, от кого защищаем? кто будет пытаться изменять директорию? и какие у него будут права?

объясни для начала зачем?

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

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

Жаль, прийдется городить костыли в самой утилите =(.

V1KT0P ★★
() автор топика

В linux, пока файл открыт в программе, он останется доступен ей, даже если вне программы его удалили.

anonymous
()

Возможно ли залочить директорию от попыток ее удаления/переименования/перемещения?

рут недоступен

Нет, нельзя.

anonymous
()
Ответ на: комментарий от V1KT0P

Дело в том что запрет удаления/переименования/перемещения нужен для того чтоб программа работающая в этой директории не натворила делов из-за ошибки пользователя.

Ошибка пользователя это:

  • действия пользователя с программой, что приводит к прямому удалению директории самой программой (вызывается некоторая функция);
  • действия пользователя с программой, что приводит к косвенному удалению директории за счет использования сторонних программ (вызывается сторонняя программа, или удаляется файл, являющийся признаком сторонней программе для удаления, или ещё что-то);
  • действия пользователя со сторонними программами.
anonymous
()
Ответ на: комментарий от V1KT0P

Что-то сложно представить без примера, что это за место в утилите, в котором при удалении файлов или директории можно огрести реальные проблемы. Что она конкретно делает? Что в файлах? Document bundle?

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

arturpub ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.