パーミッションとリンク
ここは 101 でも 102 でも形を変えて何度も出る、最も費用対効果の高い範囲です。パーミッションは、8進数と記号形式の相互変換、umask からの逆算、ディレクトリに対する x の意味の3つが定番です。リンクは、ハードリンクとシンボリックリンクの制約を比較させる問題がほぼ必ず出ます。
ディレクトリの x は「入れるかどうか」です
権限は所有者、所属グループ、その他の3組に分かれ、それぞれが読み書き実行の3ビットを持ちます。
| 記号 | 数値 | ファイルでの意味 | ディレクトリでの意味 |
|---|---|---|---|
| r | 4 | 中身を読める | 中の一覧を取れる |
| w | 2 | 中身を書き換えられる | 中にファイルを作る、消す、名前を変えられる |
| x | 1 | プログラムとして実行できる | 中に入れる。中のファイルにたどり着ける |
3つ足した数字を、所有者、グループ、その他の順に3桁並べます。
| 8進数 | 記号 | よくある用途 |
|---|---|---|
| 644 | rw-r--r-- | ふつうのファイル。本人だけ書ける |
| 755 | rwxr-xr-x | 実行ファイル、ディレクトリの既定 |
| 600 | rw------- | 本人以外に読ませたくないファイル。SSH の秘密鍵など |
ディレクトリの x を落とすと、名前は見えてもファイルを開くことも cd で入ることもできません。r だけ付いて x が無いディレクトリは、目次だけ読めて本文にたどり着けない状態です。
chmod の2つの書き方
ターミナル
chmod 755 script.sh
chmod u+x script.sh
chmod a=r readme.txt記号形式は、対象と操作と権限を繋げて書きます。対象は u が所有者、g が所属グループ、o がその他、a がすべてです。操作は + が権限を足す、- が引く、= が指定した権限だけにする、です。
= は上書きなので、chmod a=r と打つと実行権も書き込み権も消えます。+ との違いを問う問題がよく出ます。-R を付けると再帰的にディレクトリの中まで当たります。
所有者を変えるのが chown、所属グループを変えるのが chgrp です。chown alice:staff file.txt のようにコロンで区切れば両方まとめて変えられます。所有者の変更は root だけができます。一般ユーザーが自分のファイルを他人に譲ることはできません。
umask はファイルの元が 666 です
新しく作られるファイルやディレクトリのパーミッションは、umask によって削られます。
| 対象 | 元になる値 | umask 022 のとき |
|---|---|---|
| ファイル | 666 | 666 から 022 を落として 644 |
| ディレクトリ | 777 | 777 から 022 を落として 755 |
ファイルの元が 777 ではなく 666 であるところが最大の引っかけです。新規作成のファイルに実行権を勝手に付けるのは危険なので、x を配らない設計になっています。umask 077 なら、ファイルは 600、ディレクトリは 700 です。
引数なしの umask で現在の値、umask -S で記号形式の表示、数値を渡せばその場で変更です。恒久的に変えるならシェルの設定ファイルに書きます。
ハードリンクとシンボリックリンク
| 観点 | ハードリンク | シンボリックリンク |
|---|---|---|
| 作り方 | ln 元 リンク名 | ln -s 元 リンク名 |
| inode | 元と同じ inode を共有する | 自分の inode を持ち、中身は元へのパス |
| 別のファイルシステム | またげない | またげる |
| ディレクトリ | 張れない | 張れる |
| 元を消したら | もう一方から普通に読める | リンク切れになり読めなくなる |
| リンク数 | 張るたびに増える | 元のリンク数は増えない |
ハードリンクは、同じ実体に別の名前を付ける操作です。主従は無くどちらも対等な名前なので、片方を消してもデータは残り、最後の1つを消したときにはじめて実体が解放されます。inode はファイルシステムごとの管理なので、別のファイルシステムには張れません。
シンボリックリンクは、行き先のパスを書いた小さなファイルです。ls -l では先頭が l になり、矢印で元のパスが出ます。行き先が消えても本人は残るので、リンク切れが生まれます。ファイルシステムをまたげるのも、ディレクトリに張れるのも、中身がただのパスだからです。
見分けるには ls -li を使います。先頭に出る inode 番号が元と同じならハードリンク、違えばシンボリックリンクです。ls -l の左から2列目がリンク数で、ハードリンクを1本張ると 1 から 2 に増えます。
よくある引っかけ
umask で落とす元は、ファイルが 666、ディレクトリが 777 です。chmod の = は上書きで、書かなかった権限は消えます。ハードリンクはディレクトリに張れず、ファイルシステムもまたげません。