ユーザーが指定されたディレクトリへのパスをたどることを許可する

ユーザーが指定されたディレクトリへのパスをたどることを許可する

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 /むしろ /むしろ/長い /むしろ/長い/パス /むしろ/長い/パス/to /むしろ/長い/パス/to/the
setfacl -mu:同僚:xr ディレクトリへのパスは長い

「明白な」警告:

ターゲット (リーフ) ディレクトリを所有している場合でも、パス内のすべてのディレクトリに対する実行 (トラバース) アクセス権が必要です。アクセス権がなく、所有もしていないディレクトリがある場合は、運が悪いことになります。(rootアクセス権を付与できる ID (つまり、ディレクトリの所有者) を想定するか、アクセス権を付与する権限を持つ誰かを説得する必要があります。これはこの質問の範囲外です。)

しかし、あなたが所有しているがアクセス権がない中間ディレクトリがある場合(例えば、誰かが を行った場合chmod 0)、自分自身にアクセス権を与える必要があります。上から下へ

答え: (TL;DR)

上記の点を指摘したのは、これが下から上へと機能するからです。

leaf="/むしろディレクトリへの長いパス"
ブランチ="$リーフ"
branch="$(dirname "$branch")" の場合
する
     setfacl -mu:同僚:x "$branch" || ブレーク
     [ "$branch" = / ]の場合
     それから
         壊す
     フィ
終わり
setfacl -mu:同僚:xr "$リーフ"

setfaclオプションで、を追加することでからのエラーメッセージを非表示にすることができます。 とを所有しているが を所有していない(ただし の権限は開いている)2> /dev/nullという異常な状況の場合は、の後のを削除します。 でエラーが発生した後もツリーを登り続ける必要があるためです。 そうでない場合、 ではない場合は、/rather/long/rather/long/path/to/rather/long/path|| breaksetfaclsetfacl … /rather/long/pathrootできたif [ "$branch" = / ]を実行できないディレクトリ レベルに到達するとループが終了するため、テストを削除しますsetfacl。(ただし、これはあまり良い考えではありません。これをスクリプトとして保存すると、いつか として実行することになりroot、無限ループが発生します。)

言うまでもありませんが、これをスクリプトにする場合は、ディレクトリ パスと同僚の名前をパラメーターにする必要があります。

関連情報