パーミッションの読み方
「Permission denied」と出ても、何が足りないのかは分からない
このメッセージは「あなたには許可がありません」としか言っていません。読む権利が無いのか、書く権利が無いのか、そのディレクトリに入る権利が無いのかで、打つ手はまったく変わります。切り分けの材料になるのが、ls -l の左端に出る 10 文字です。
ターミナル
$ ls -l /etc/passwd
-rw-r--r-- 1 root root 2890 May 20 12:00 /etc/passwd10 文字は 1 と 3 と 3 と 3 に割って読む
プレーンテキスト
- rw- r-- r--
│ └┬┘ └┬┘ └┬┘
│ │ │ └ その他の人
│ │ └───── 所有グループ
│ └───────── 所有者
└──────────── 種類先頭の 1 文字は種類です。- なら普通のファイル、d ならディレクトリ、l ならシンボリックリンクを表します。残りの 9 文字は 3 文字ずつの 3 ブロックで、左から所有者、所有グループ、それ以外の全員、の順に並びます。
各ブロックの 3 文字は必ず r w x の順に並び、権利があればその文字、無ければ - になります。r は中身を読める、w は書き換えられる、x は実行できる、です。
ディレクトリの x だけは意味がずれて「その中に入れる」を表します。r があって x が無いディレクトリは、ファイル名の一覧は取れるのに cd で入れず、中のファイルも読めない、という不思議な状態になります。
4 と 2 と 1 を足すと数字になる
同じ権限は数字でも表せます。r を 4、w を 2、x を 1 として、ブロックごとに足すだけです。rw- なら 4 と 2 で 6、r-x なら 4 と 1 で 5、rwx なら 7、何も無ければ 0 になります。これを 3 ブロック分並べた 3 桁が、記号と同じ情報を数字で言い直したものです。
stat を使うと、両方の表記を一度に見られます。
ターミナル
$ stat /etc/hosts
File: /etc/hosts
Size: 200 Blocks: 8 IO Block: 4096 regular file
Access: (0644/-rw-r--r--) Uid: (0/root) Gid: (0/root)0644 と -rw-r--r-- が並んで出ています。書き方が 2 通りあるだけで、中身は同じものです。
s や t が混ざっている行がある
x の位置に、たまに別の文字が立っているファイルを見かけます。
ターミナル
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 May 20 12:00 /usr/bin/passwd
$ ls -ld /tmp
drwxrwxrwt 10 root root 4096 May 20 12:00 /tmp所有者側の s は、誰が起動しても所有者の権限で動く印です。パスワードの変更が一般ユーザーにもできるのは、これがあるからです。末尾の t は、誰でも書き込めるのに他人のファイルは消せない、という制限を足す印で、/tmp が誰かに荒らされない理由になっています。
課題
- touch でファイルを作成する
- ls -l と stat の両方で権限を確認する