
Допустим, я хочу предоставить пользователю 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 из них:
setfacl -mu:коллега:x /rather /rather/long /rather/long/path /rather/long/path/to /rather/long/path/to/the setfacl -mu:коллега:xr /довольно/длинный/путь/к/каталогу
«Очевидное» предупреждение:
Даже если вы являетесь владельцем целевого (конечного) каталога, вам необходимо иметь доступ на выполнение (проход) для каждого каталога в пути. Если есть какой-либо каталог, к которому у вас нет доступа и которым вы не владеете, вам не повезло. (Вам необходимо принять личность (т. е. root
владельца каталога), которая позволит вам предоставить себе доступ, или убедить кого-то, у кого есть полномочия сделать это. Это выходит за рамки этого вопроса.)
Но если есть промежуточные каталоги, которыми вы владеете, но к которым у вас нет доступа (например, кто-то сделал chmod 0
), вам нужно предоставить себе доступсверху вниз.
Ответ: (TL;DR)
Я высказал эту мысль, потому что это работает снизу вверх:
лист="/довольно/длинный/путь/к/каталогу" ветвь="$лист" в то время как ветвь="$(имя_директории "$branch")" делать setfacl -mu:коллега:x "$branch" || перерыв если [ "$branch" = / ] затем перерыв фи сделанный setfacl -mu:коллега:xr "$лист"
При желании вы можете скрыть любые сообщения об ошибках от , setfacl
добавив 2> /dev/null
. Если у вас патологическая ситуация, когда вы владеете /rather/long
и /rather/long/path/to
, но не /rather/long/path
(но его разрешения открыты), удалите || break
после setfacl
, потому что вам нужно продолжать подниматься по дереву после получения ошибки на setfacl … /rather/long/path
. В противном случае, если вы не root
, вымогудалите if [ "$branch" = / ]
тест, потому что цикл прервется, когда вы достигнете уровня каталога, где вы не сможете запустить setfacl
. (Но это не очень хорошая идея; если вы сохраните это как скрипт, вы когда-нибудь запустите его как root
, и тогда у вас будет бесконечный цикл.)
Само собой разумеется, что если вы сделаете это скриптом, то путь к каталогу и имя коллеги должны быть параметрами.