衝撃の発見!ディレクトリのパーミッション(アクセス権限)

 今回はディレクトリのパーミッションについてです。
ファイルのパーミッションはまぁ~意味の通りなんで分かりやすい。

ファイルのパーミッション
記号意味
r読込権限
w書込・削除権限
x実行権限


それに引き換えディレクトリのパーミッションになると分かりずらい・・・
ってか記号の意味と一致しないからすぐに忘れる。
という事で、さっきの表にディレクトリに対する意味も付け加えると下の表になります。

ディレクトリのパーミッション
記号ファイルディレクトリ
r読込権限リスト表示権限
w書込(修正)・削除権限ディレクトリ配下への作成・削除権限
x実行権限ディレクトリへの移動権限
配下のファイル読込・複製権限


 結果としてはディレクトリのパーミッションで最大のカギとなったのが赤字にした配下のファイル読込・複製権限だ!これはどこのサイトにも説明が無いんぢゃないかな?
 細かい話はこのページでコマンドを実行した結果を見てほしいが、この赤字部分の理解が無いからディレクトリのパーミッションが分からなくなるものと考える。今回総当たりでディレクトリのパーミッションを変えて試した結果をみて理解を深めて欲しい。

 それではそれぞれのパーミッションの状態の時にどの様な動きに変化するのか実際にコマンドを打って確認してみましょう。
確認する為の構成として「test」というディレクトリ内に「ファイル1」「シンボリックリンク1」「ディレクトリ1」を作成し、ディレクトリ1内に同様の構成で「xxx2」を作成。これらは全てパーミッション777としました。

pwd
/

ls -lh
drwxr-xr-x 2 root root 4.0K xx月 xx 00:00 test

ls -lhR
./test:
-rwxrwxrwx 1 root root  100 xx月 xx 00:00 file1.txt
lrwxrwxrwx 1 root root   13 xx月 xx 00:00 link1.lnk -> /proc/version
drwxrwxrwx 3 root root 4.0K xx月 xx 00:00 test1

./test/test1:
-rwxrwxrwx 1 root root  100 xx月 xx 00:00 file2.txt
lrwxrwxrwx 1 root root   13 xx月 xx 00:00 link2.lnk -> /proc/version
drwxrwxrwx 2 root root 4.0K xx月 xx 00:00 test2

./test/test1/test2:

目次
 ・読込み権限(Readable)
   ‐ 読込権限のみの場合(r--)
   ‐ 読込みと書込み権限の場合(rw-)
   ‐ 読込と実行権限の場合(r-x)

 ・書込み権限(Writable)
   - 書き込み権限のみの場合(-w-)
   - 書込みと実行権限の場合(-wx)

 ・実行権限(eXecutable)
   - 実行権限のみの場合(--x)

読込み権限(Readable)

 読込み権限はディレクトリに対してはリスト表示権限の有無なのでlsコマンドでファイルの一覧が表示可能かどうか。という事になります。
ではコマンドを実行して確認してみます。

読込み権限のみの場合(r--)

ls -lh
drwxr--r-- 3 root root 100 xx月 xx 00:00 test

ls -lh test/
ls: 'test/file1.txt' にアクセスできません: 許可がありません
ls: 'test/link1.lnk' にアクセスできません: 許可がありません
ls: 'test/test1' にアクセスできません: 許可がありません
合計 0
-????????? ? ? ? ?             ? file1.txt
l????????? ? ? ? ?             ? link1.lnk
d????????? ? ? ? ?             ? test1

touch test/test.txt
touch: 'test/test.txt' に touch できません: 許可がありません

cd test/
-bash: cd: test/: 許可がありません

cp test/file.txt .
cp: 'test/file.txt' を stat できません: 許可がありません


cat test/file1.txt
cat: test/file1.txt: 許可がありません

cd test/test1
-bash: cd: test/test1: 許可がありません

cat test/link1.lnk
cat: test/link1.lnk: 許可がありません

1行目
lsコマンドの結果から「test」というディレクトリが所有者rootで存在しています。
そのディレクトリの第三者権限を読み込み(r--)にしました。その結果が以降のコマンドになります。
4行目
lsコマンドでtestディレクトリ配下のファイル一覧を見ようとしました。
「r(リスト表示権限)」は与えたので確かにリストが表示されました。が、多分「x(移動権限)」が無い為なのかな?ファイルタイプは分かるけどタイムスタンプや容量、所有者は「?」で隠されていますね。
13行目
touchコマンドでtestディレクトリ配下にtest.txtというファイルを作成しようとしましたが、「w(作成権限)」が無いので怒られました。
16行目
cdコマンドでtestディレクトリに移動しようとしましたが、「x(移動権限)」が無い為に移動できませんでした。
19行目
cpコマンドで test/file1.txt をカレントディレクトリにコピーしようとしましたが怒られました。
23,26,29行目
配下のファイル閲覧、ディレクトリ移動は全て無理でした。

結果
 このパーミッション(r--)は、あるユーザやグループに対して『ディレクトリ内にどんなファイルやディレクトリがあるかは閲覧させるけど、ファイルの作成・削除。さらにファイルの内容や容量/権限は見せたくない!』っていう状況の場合には有効です。
そんな要件無い。とは言わないけどあまりなさそうな気がする・・・

読込みと書込み権限の場合(rw-)

ls -lh
drwxrw-rw- 3 root root 100 xx月 xx 00:00 test

ls -lh test/
ls: 'test/file1.txt' にアクセスできません: 許可がありません
ls: 'test/link1.lnk' にアクセスできません: 許可がありません
ls: 'test/test1' にアクセスできません: 許可がありません
合計 0
-????????? ? ? ? ?             ? file1.txt
l????????? ? ? ? ?             ? link1.lnk
d????????? ? ? ? ?             ? test1

touch test/test.txt
touch: 'test/test.txt' に touch できません: 許可がありません

cd test/
-bash: cd: test/: 許可がありません

cp test/file.txt .
cp: 'test/file.txt' を stat できません: 許可がありません


cat test/file1.txt
cat: test/file1.txt: 許可がありません

cd test/test1
-bash: cd: test/test1: 許可がありません

cat test/link1.lnk
cat: test/link1.lnk: 許可がありません

1行目
lsコマンドの結果から「test」というディレクトリが所有者rootで存在しています。
そのディレクトリの第三者権限を読み込み(rw-)にしました。その結果が以降のコマンドになります。
4行目
lsコマンドでtestディレクトリ配下のファイル一覧を見ようとしましたが、
1つ上で行った「r--」の時と結果は変わらないですね・・・という事はやっぱり「x(移動権限)」を与えないとファイル権限や容量などを知る事が出来ないという事なのかな?
13行目
touchコマンドでtest配下にファイルを作成しようとしましたが、「w(作成権限)」を追加したにもかかわらずファイル作成できず!!
16行目
cdコマンドでtestディレクトリに移動しようとしましたが、「x(移動権限)」が無い為に移動できませんでした。
19行目
cpコマンドで test/file1.txt をカレントディレクトリにコピーしようとしましたが怒られました。作成権限でコピーできると思ってたんだけど・・・
23,26,29行目
配下のファイル閲覧、ディレクトリ移動は全て無理でした。

結果
 え?なんで??という結果でした。
「r--」から作成権限加えて「rw-」に権限変更したのに結果が全く一緒!!
という事は作成権限「w」は単体で権限追加しても意味がなく、移動/配下ファイルの読込・複製権限「x」も一緒に追加しないといけないという結果に。

 ファイルのパーミッションでは見るけどディレクトリでこのパーミッションを見ないわけだ・・・。意味が無いんだもん。こういうところにもディレクトリのパーミッションが分かりづらい要因があるんだろうなぁ~。

読込と実行権限の場合(r-x)

ls -lh
drwxr-xr-x 3 root root 100 xx月 xx 00:00 test

ls -lh test/
-rwxrwxrwx 1 root root 100 xx月 xx 00:00 file1.txt
lrwxrwxrwx 1 root root  13 xx月 xx 00:00 link1.lnk -> /proc/version
drwxrwxrwx 3 root root 100 xx月 xx 00:00 test1

touch test/test.txt
touch: 'test/test.txt' に touch できません: 許可がありません

cd test/
pwd
/test
cd ..

cp test/file.txt .
ls -lh
-rwxr-xr-x 1 fedora fedora 100 xx月 xx 00:00 file.txt


cat test/file1.txt
file1.txtの中身です!!

cd test/test1
pwd
/test/test1
cd ../..

cat test/link1.lnk
Linux version x.xx.xx-xxx ・・・・・・・・・・・

1行目
lsコマンドの結果から「test」というディレクトリが所有者rootで存在しています。
そのディレクトリの第三者権限を読み込み(r-x)にしました。その結果が以降のコマンドになります。
4行目
おおっ!? 「x(移動権限)」 を追加した事でファイル一覧が詳細まできちんと見れるようになりました。シンボリックリンクはどこにリンクされているかまでわかります。
9行目
「w(作成権限)」が無いのでやっぱり作成はできないですね。
12行目
「x(移動権限)」を追加したのでやっとディレクトリに移動する事が出来ました。
17行目
cpコマンドで test/file1.txt をカレントディレクトリにコピーできました。「x(移動権限)」を追加した事で移動だけでなく複製も可能になりました。
22行目
これも「x(移動権限)」を追加した事でやっとファイルの中身が見る事ができました。
25行目
さらに深いディレクトリ移動もできるようになりました。
30行目
シンボリックリンク先のファイル内容も見る事ができました。

結果
 このパーミッション(r-x)はFTPサーバとかのファイル共有であるユーザやグループの人に閲覧・取得してもらうのに使えそうですね。管理人(このフォルダの所有者)が写真ファイル置き仲間内にダウンロードしてもらう等の使い方には最適ですね。「w」権限も与えていないのでファイルの削除をされることもありません。

 そしてディレクトリの移動権限「x」はだいぶキーポイントであることが発覚しました。
他のサイトでもディレクトリの「x」は移動権限であることの記載はあるのですが、もっと大事な権限として
そのディレクトリ配下のファイル読込権限複製権限の有無も含まれているという事が発覚しました。

書込み権限(Writable)

 書込み権限はディレクトリに対してはディレクトリ配下への作成・削除権限なのでファイルやディレクトリの新規作成や削除が可能かどうか。という事になります。
ではコマンドを実行して確認してみます。

書き込み権限のみの場合(-w-)

ls -lh
drwx-w--w- 3 root root 100 xx月 xx 00:00 test

ls -lh test/
ls: ディレクトリ 'test/' を開くことが出来ません: 許可がありません

touch test/test.txt
touch: 'test/test.txt' に touch できません: 許可がありません

cd test/
-bash: cd: test/: 許可がありません

cp test/file.txt .
cp: 'test/file.txt' を stat できません: 許可がありません


cat test/file.txt
cat: test/file.txt: 許可がありません

結果
 どのコマンドを実行しても怒られるだけで何もできなかったのでコマンド毎の詳細は無で結果に行っちゃいます。
20年以上Linuxいじってるけどこんなパーミッション「-w-」見たことないね・・・(w
結果何もできず・・・ そりゃ見ないわけだ・・・。
でもこれで分かった事は書き込み権限を与えたいからという事で「w」だけ権限を与えても書込みさせることができない。いわゆる「w」単体では何の権限も与えられないという事が分かりました。

読込みと書込み権限の場合(rw-)

 Readableのrw-を参照

書込みと実行権限の場合(-wx)

これは見たことないパーミッションで動作が複雑なのでちょっと説明も複雑になってます。こんなパーミッションを見た事が無い理由も説明を見れば分かります。

ls -lh
drwx-wx-wx 3 root root 100 xx月 xx 00:00 test

ls -lh test/
ls: ディレクトリ 'test/' を開くことが出来ません: 許可がありません

touch test/test.txt

cd test/
ls -lh
ls: ディレクトリ '.' を開くことが出来ません: 許可がありません
cd ..

cp test/file.txt .


cat test/file1.txt
file1.txtの中身です!!

cd test/test1
cd ../..

cat test/link1.lnk
Linux version x.xx.xx-xxx ・・・・・・・・・・・

1行目
lsコマンドの結果から「test」というディレクトリが所有者rootで存在しています。
そのディレクトリの第三者権限を読み込み(-wx)にしました。その結果が以降のコマンドになります。
4行目
「r(リスト表示権限)」を与えなかったのでファイル一覧は表示できず。
7行目
「w(作成権限)」と合わせて「x(移動権限)」を与えた事で初めてディレクトリ配下にファイルを作成する事が出来ました。
9行目
「x(移動権限)」を与えてるのでtestディレクトリに移動できました。
10行目
「r(リスト表示権限)」を付けていないので4行目同様にlsコマンドは怒られました。
14行目
 cpコマンドで test/file1.txt をカレントディレクトリにコピーできました。ここでも複製ができたという事はやっぱり「x(移動権限&配下ファイルの読込権限)」に複製の権限も??
 testディレクトリに「r(リスト表示権限)」を与えなかった為にリスト表示ができません。よってtest配下のfile.txtはTabキーでのファイル名補完をしてくれませんでした。
しかしリスト表示ができないだけで「r-x」権限のコマンドで確認した「x(複製権限)」があるとするならばコピーできるはず!と思い、ファイル名補完せずにきちんとファイル名を入力してコピーコマンドを実行したところコピーする事が出来ました。

 なのであたりまえっちゃ~当たり前ですが、「r(リスト表示権限)」が無いとTabキーでの補完はできません。
 更にコマンドでは書いてないですが、「r」のリスト表示権限と「x」の配下のファイル読み込み権限が無いとディレクトリ配下の容量を確認する「du -s」コマンドも権限が無い!と怒られます。
17行目
「r-x」の時と今回の「-wx」でファイルの中身を閲覧する事が出来ました。という事は「--x」でも見る事が出来れば、「x(移動権限)」に配下ファイルの読込権限があるという事になりますな・・・
20行目
さらに深いディレクトリ移動もできました。
23行目
シンボリックリング先の内容も見る事が出来ました。

結果
 このパーミッション(-wx)はFTPサーバの利用として、ユーザにどんなファイルが存在しているかは知られたくない。しかし管理者観点で?ファイルを共有してほしい際にアップ先として開放するにはよいかもしれませんね。でももしこのような利用の為にこのパーミッションにするとなった場合は、どのようなファイルがあるかわからないとはいえ、所有者自身のファイル以外は消せないようにスティッキービットを付けた方がいいかもしれないですね。

実行権限(eXecutable)

 最後は実行権限。ディレクトリに対してはディレクトリへの移動権限です。
移動権限の有無なのでcdコマンドで対象ディレクトリに移動できるかどうか。という事になります。
この移動権限というのはどのサイトでも共通して書かれています。

 が、しかし!!コマンドの解説前に結果から言うと(いや、このページの冒頭でも書いちゃってるが)移動権限だけではなく、配下のファイル読み込み権限。さらには複製権限の有無も含まれていることが分かりました。
ではコマンドを実行して確認してみます。

実行権限のみの場合(--x)

ls -lh
drwx--x--x 3 root root 100 xx月 xx 00:00 test

ls -lh test/
ls: ディレクトリ 'test/' を開くことが出来ません: 許可がありません

touch test/test.txt
touch: 'test/test.txt' に touch できません: 許可がありません

cd test/
ls -lh
ls: ディレクトリ '.' を開くことが出来ません: 許可がありません
cd ..


cat test/file.txt
file.txtの中身です!!

cd test/test1
pwd
test/test1
cd ../..

cat test/link1.lnk
Linux version x.xx.xx-xxx ・・・・・・・・・・・

1行目
lsコマンドの結果から「test」というディレクトリが所有者rootで存在しています。
そのディレクトリの第三者権限を読み込み(--x)にしました。その結果が以降のコマンドになります。
4行目
「r(リスト表示権限)」与えなかったのでファイル一覧は表示できず。
7行目
「w(作成権限)」が無いのでやっぱり作成もできないですね。
10行目
「x(移動権限)」を与えてるのでtestディレクトリに移動できました。
11行目
4行目同様にlsコマンドは怒られました。
16行目
Readable(r-x)の22行目やWritable(-wx)の12行目と同様に「x(移動権限&配下ファイルの読込・複製権限)」を与えたのでファイルの読込が出来ました。
しかし「r(リスト表示権限)」を与えなかった為Tabキーでのファイル名補完はできませんが、きちんとファイル名やディレクトリ名を入力すればファイルの中身閲覧する事ができました。
19行目
「r(リスト表示権限)」を与えなかったのでディレクトリ名補完はできないが、ディレクトリ名をきちんと入力すればさらに深いディレクトリ移動もできました。
22行目
「r(リスト表示権限)」を与えなかったのでディレクトリ名補完はできないが、 シンボリックリンク名をきちんと入力すればリンク先の内容も見る事が出来ました。
24行目
さらに深い階層のシンボリックリンクの内容を表示させることができました。

読込と実行権限の場合(r-x)

Readableのr-xを参照

書込みと実行権限の場合(-wx)

Writableの-wxを参照

総括

 ディレクトリのパーミッションとしてカギを握っていたのは「x」でした。
どのサイトにも「移動権限」という記載はあるが、配下ファイルの読込権限とか複製権限についてまで書かれているサイトはだいぶ少ないと思われる。
このページを見てディレクトリへのパーミッションの理解が深まって頂ければ幸いです。