2

Скажем, я хочу предоставить colleague пользователю доступ на чтение к каталогу /rather/long/path/to/the/directory , но не обязательно к его родительским каталогам.

Как объяснено, например, здесь и там, я сначала должен убедиться, что colleague может пройти путь. Использование setfacl :

setfacl -m u:colleague:x /rather
setfacl -m u:colleague:x /rather/long
setfacl -m u:colleague:x /rather/long/path
setfacl -m u:colleague:x /rather/long/path/to
setfacl -m u:colleague:x /rather/long/path/to/the
setfacl -m u:colleague:xr /rather/long/path/to/the/directory

Это довольно утомительно для глубоко вложенного пути. Есть ли более элегантный способ сделать это?

PS Чтобы сделать это немного сложнее, будучи обычным пользователем, я мог бы не иметь права изменять разрешения для каталога верхнего уровня в пути (например, /home). Если возможно, решение должно либо игнорировать эти каталоги (при условии, что colleague может их обойти), либо, что еще лучше, проверить, разрешено ли colleague обойти их, и выдать сообщение об ошибке, если это не так.

1 ответ1

3

Простой, глупый ответ:

Вы можете немного сократить свою последовательность команд, комбинируя первые n –1 из них:

setfacl -m u:colleague:x  /rather /rather/long /rather/long/path /rather/long/path/to /rather/long/path/to/the
setfacl -m u:colleague:xr /rather/long/path/to/the/directory

«Очевидное» предупреждение:

Даже если вы владеете целевым (конечным) каталогом, вам необходимо иметь доступ (ход) к каждому каталогу в пути.  Если есть какой-либо каталог, к которому у вас нет доступа, и у вас нет его, вам не повезло.  (Вы должны принять личность (т. root или владелец каталога), которая позволяет вам предоставить доступ, или убедить кого-то, кто имеет право сделать это.  Это выходит за рамки этого вопроса.)

Но если есть промежуточные каталоги, которыми вы владеете, но не имеете доступа (например, кто-то выполнил chmod 0), вам нужно дать себе доступ сверху вниз.

Ответ: (TL; DR)

Я сделал вышеупомянутый пункт, потому что это работает снизу вверх:

leaf="/rather/long/path/to/the/directory"
branch="$leaf"
while branch="$(dirname "$branch")"
do
     setfacl -m u:colleague:x "$branch"  ||  break
     if [ "$branch" = / ]
     then
         break
     fi
done
setfacl -m u:colleague:xr "$leaf"

При желании вы можете скрыть любые сообщения об ошибках от setfacl , добавив 2> /dev/null .  Если у вас есть патологическая ситуация, когда вам принадлежит /rather/long и /rather/long/path/to , но не /rather/long/path (но его разрешения открыты), удалите || break после setfacl , потому что вам нужно продолжать лазить по дереву после получения ошибки в setfacl … /rather/long/path .  В противном случае, если вы не являетесь пользователем root , вы можете удалить тест if [ "$branch" = / ] , поскольку цикл завершится, когда вы достигнете уровня каталога, на котором вы не сможете запустить setfacl .  (Но это не очень хорошая идея; если вы сохраните это как скрипт, вы однажды запустите его как root , и у вас будет бесконечный цикл.)

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .