linux のディレクトリのパーミッション。
普段意識しないんですが、改めて、調べなおしてみることした
間違ってるかもしれないので、ご指摘いただけると助かります。
Linux のディレクトリの 001(x): execute フラグ
Linux のディレクトリに実行フラグが立っている、立っていないのはなし。
ディレクトリに -x した場合
ディレクトリの内部のエントリ全てにアクセス権を剥奪する。
test/ # ここを -x する ├── a └── bb # サブディレクトリも見えない! └── b1
test から x をオフにすると
chmod a-x test
test 以下のファイル全てにアクセス権を失うことになる。
なぜなのか?ディレクトリのパーミッションを探すときに上位ディレクトリから当たる
ls /var/www/test//bb/b1
この場合
- /var/
- /var/www/
- /var/www/test/ ## ここで拒否される
- /var/www/test/bb
- /var/www/test/bb/b1
この順で、パーミッションが探される。このとき /var/www/test/ で拒否される。
ディレクトリに -r をした場合
ディレクトリの直下エントリ列挙を不能にする
ディレクトリから read を削除すると。
chmod a-r test
こうなる。
test/ # このディレクトリのr は不可能 ├── a └── bb ## ここは読める └── b1
一覧が出来ないので、test/bb の存在を知ることが出来ない。 なので、事前に通知している人だけがアクセスできる。(でも総当りできるし完全な隠蔽の意味には不十分だ)
レアケースだが、次のようなパーミッションも存在できる。
others は 読めて、 owner(user)が読めない場合。
takuya@atom:/var/www$ ll test ls: ディレクトリ test を開くことが出来ません: 許可がありません takuya@atom:/var/www$ ll -dl test/ d-wxrwsrwx 3 takuya www-data 4096 5月 27 14:47 test/
othersで読めるので読めそうなものだけど、user の拒否のほうが優先する。誰でも読めるのに、自分だけが読めない。
ディレクトリを w (writable)にすると?
ディレクトリの内部のファイルを( create new , rename ) 出来る。「rename/mv 出来る」は 新規作成と削除ができることと同じ。
まとめる
パーミッション | 文字 | 影響 | cd | ls |
---|---|---|---|---|
read | - | ディレクトリ自体の中身一覧を読み取れる。子孫には影響しない。 | 可 | 不可 |
read | r | ディレクトリの中身を見みられる | 可 | 可 |
write | - | ディレクトリ中身を編集できない | - | - |
write | w | ディレクトリ中身を編集できる | - | - |
execute | - | ディレクトリの中にアクセスをさせない、子孫にも影響する | 不可 | 不可 |
execute | x | ディレクトリの中にアクセスできる | 可 | "r" による |
覚え方
種類 | read | write | execute |
---|---|---|---|
ファイル | 読む | 書く | 実行 |
ディレクトリ | 一覧表示 | 書き込み | 立ち入り |
こんな感じ
ちなみに、細いものは、次の通り。
- copy = 書く(読み込み+ファイル作成)
- 削除=書く(ディレクトリに書込)
- 追記 =書く
- 移動 = 読む+書く≒コピーして削除
このあたりを細かく制御するには chattr を使います。その話はまたどこかで
参考資料
https://wiki.archlinux.org/index.php/File_permissions_and_attributes