
比如說,我想授予使用者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
簡單而愚蠢的答案:
你可以縮短透過結合第一個命令來稍微調整你的命令序列n– 其中 1 個:
setfacl -mu:同事:x /相當/相當/長/相當/長/路徑/相當/長/路徑/到/相當/長/路徑/到/the setfacl -mu:同事:xr /rather/long/path/to/the/目錄
一個「明顯」的警告:
即使您擁有目標(葉)目錄,您也需要對路徑中的每個目錄具有執行(遍歷)存取權限。如果有任何您無法存取且不擁有的目錄,那麼您就不走運了。 (您需要假設一個身份(即root
目錄的所有者)來允許您自己訪問,或者說服有權這樣做的人。這超出了這個問題的範圍。)
但是,如果有您擁有但無法存取的中間目錄(例如,有人已經這樣做了chmod 0
),您需要授予自己存取權限從上到下。
答:(TL;DR)
我提出上述觀點是因為這是由下而上進行的:
leaf="/rather/long/path/to/the/directory" 分支=“$葉” while 分支=“$(目錄名“$branch”)” 做 setfacl -mu:同事:x "$分支" ||休息 if [ "$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
,然後您將有一個無限循環。)
不用說,如果將其作為腳本,則目錄路徑和同事的姓名應該是參數。