Contents
ディレクトリのパーミッション
Linux において、パーミッションは必ず理解しなければならない概念です。
ただ、rwx の意味がファイルとディレクトリで異なるのが辛い…!!!←ということでまとめてみました。
パーミッションを有効にするとどうなるのか
まず、ディレクトリの各パーミッションを有効にすると以下のような動きになります。
r | そのディレクトリ内のファイル一覧を表示可能 |
w | そのディレクトリ内でのファイル作成/削除/移動(名前変更)可能 |
x | そのディレクトリ内のファイルにアクセス可能 そのディレクトリへ移動可能 |
ビットを立てる
実際に各パーミッションを有効にしたパターンでファイル一覧の表示(ls)、ファイル作成(touch)、ファイルへのアクセス(cat)/ ディレクトリへの移動(cd)を試していきます。
前提
前提として、umaskはデフォルト、一般ユーザのホームディレクトリにあらかじめ dir1 ディレクトリと file1 ファイルを作成しておきます。
$ umask
0002
$ mkdir dir1
$ ls -l
合計 0
drwxrwxr-x. 2 testuser testuser 6 4月 24 15:13 dir1
$ echo test > dir1/file1
$ ls -l dir1
合計 4
-rw-rw-r–. 1 testuser testuser 5 4月 24 15:22 file1
では、順に見てみましょう。
– (0)
$ chmod 000 dir1
$ ls dir1
ls: ディレクトリ dir1 を開くことが出来ません: 許可がありません
$ touch dir1/file2
touch: `dir1/file2′ に touch できません: 許可がありません
$ cat dir1/file1
cat: dir1/file1: 許可がありません
$ cd dir1
-bash: cd: dir1: 許可がありません
r (4)
$ chmod 400 dir1
$ ls dir1
ls: dir1/file1 にアクセスできません: 許可がありません
file1
$ touch dir1/file2
touch: `dir1/file2′ に touch できません: 許可がありません
$ cat dir1/file1
cat: dir1/file1: 許可がありません
$ cd dir1/file2
-bash: cd: dir1/file2: 許可がありません
w (2)
$ chmod 200 dir1
$ ls dir1
ls: ディレクトリ dir1 を開くことが出来ません: 許可がありません
$ touch dir1/file2
touch: `dir1/file2′ に touch できません: 許可がありません
$ cat dir1/file1
cat: dir1/file1: 許可がありません
$ cd dir1
-bash: cd: dir1: 許可がありません
x (1)
$ chmod 100 dir1
$ ls dir1
ls: ディレクトリ dir1 を開くことが出来ません: 許可がありません
$ touch dir1/file2
touch: `dir1/file2′ に touch できません: 許可がありません
$ cat dir1/file1
test
$ cd dir1
[dir1]$
rw (6)
$ chmod 600 dir1
$ ls dir1
ls: dir1/file1 にアクセスできません: 許可がありません
file1
$ touch dir1/file2
touch: `dir1/file2′ に touch できません: 許可がありません
$ cat dir1/file1
cat: dir1/file1: 許可がありません
$ cd dir1
-bash: cd: dir1: 許可がありません
rx (5)
$ chmod 500 dir1
$ ls dir1
file1
$ touch dir1/file2
touch: `dir1/file2′ に touch できません: 許可がありません
$ cat dir1/file1
test
$ cd dir1
[dir1]$
wx (3)
$ chmod 300 dir1
$ ls dir1
ls: ディレクトリ dir1 を開くことが出来ません: 許可がありません
$ touch dir1/file2
$ cat dir1/file1
test
$ cd dir1
[dir1]$
rwx (7)
$ chmod 700 dir1
$ ls dir1
file1
$ touch dir1/file2
$ cd dir1
$ cat dir1/file1
test
[dir1]$ ls
file1 file2
まとめると
ディレクトリのパーミッションについてまとめると以下のようになります。
ls | touch | cat | cd | |
– | × | × | × | × |
r | 〇 | × | × | × |
w | × | × | × | × |
x | × | × | 〇 | 〇 |
rw | 〇 | × | × | × |
rx | 〇 | × | 〇 | 〇 |
wx | × | 〇 | 〇 | 〇 |
rwx | 〇 | 〇 | 〇 | 〇 |
上表を参考にディレクトリのパーミッションについて特徴的な部分をピックアップしたものが以下です。
- 書き込み権限は実行権限が無ければ意味が無い
- ファイルに読み取り権限があってもディレクトリに実行権限がなければファイルにはアクセス出来ない
- 使用するのは「読み取り:rx(5)」か「読み書き:rwx(7)」くらい
番外編:親ディレクトリのパーミッションは影響するのか
ついでに親ディレクトリのパーミッションとの関係性も記載します。
まずはルートディレクトリを見てみます。
$ ls -ld /
dr-xr-xr-x. 17 root root 224 2月 22 2019 /
ルートディレクトリのパーミッションは555になっています(これあまり気にしている人いなさそう)。
ugo 全てに書き込み権限がありませんが、root は所有者等に関係なくなんでもできるので root であれば作成や削除が可能です。
$ mkdir /dir2
mkdir: ディレクトリ `/dir2′ を作成できません: 許可がありません
$ su –
# mkdir /dir2
# ls /
bin dev etc lib media opt root sbin sys usr
boot dir2 home lib64 mnt proc run srv tmp var
ルートのパーミッションは 555 ということを踏まえたうえで色々とパターンを見ていきましょう。
親ディレクトリが000の場合
$ ls /dir000/dir777
ls: /dir000/dir777 にアクセスできません: 許可がありません
$ touch /dir000/dir777/file222&&ls /dir111/dir777
touch: `/dir000/dir777/file222′ に touch できません: 許可がありません
$ cat /dir000/dir777/file111
cat: /dir000/dir777/file111: 許可がありません
$ cd /dir000/dir777
-bash: cd: /dir000/dir777: 許可がありません
親ディレクトリが444の場合
$ ls /dir444/dir777
ls: /dir444/dir777 にアクセスできません: 許可がありません
$ touch /dir444/dir777/file222&&ls /dir111/dir777
touch: `/dir444/dir777/file222′ に touch できません: 許可がありません
$ cat /dir444/dir777/file111
cat: /dir444/dir777/file111: 許可がありません
$ cd /dir444/dir777
-bash: cd: /dir444/dir777: 許可がありません
親ディレクトリが111の場合
[testuser@sizu ~]$ ls /dir111/dir777
file111
[testuser@sizu ~]$ touch /dir111/dir777/file222&&ls /dir111/dir777
file111 file222
[testuser@sizu ~]$ cat /dir111/dir777/file111
test
[testuser@sizu ~]$ cd /dir111/dir777
[testuser@sizu dir777]$
番外編まとめ
つまるところ、親ディレクトリのパーミッションは子ディレクトリに影響します。ただし、影響するのは実行権限のみ。以下の2パターンです。
- 親に実行権あり:子ディレクトリに何ら影響しない
- 親に実行権なし:子ディレクトリでの操作が何もできない
番外編まとめの項目が、知りたかったことそのまま書いてあったのでスッキリしました。
PHPなどのデプロイ時、目的のディレクトリが777でも権限エラーが起きるのが悩みでした。
親をたどって、どんどん緩めていけば動くには動いていたのですが、そうするとアクセスされたくないディレクトリまで755や777のような大きな権限を与えることに気持ち悪さを感じていました。
親のディレクトリは実行権限以外関係がないというのは目から鱗でした。
> k.tさん
コメントありがとうございます。
こういったコメント、凄く励みになります。
我ながら、改めて見返すと凄く見づらい記事ですね(笑)
これからも精進してきますのでよろしくお願いします。