Разрешить пользователю переходить по пути к указанному каталогу

Разрешить пользователю переходить по пути к указанному каталогу

Допустим, я хочу предоставить пользователю 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, и тогда у вас будет бесконечный цикл.)

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

Связанный контент