Linux は完全なマルチユーザシステムです。このため、ユーザの権限に基いてファイルやディレクトリに対する操作を制御するために、パーミッションシステムを提供する事が必要です。このパーミッションシステムは、すべてのシステムリソースとデバイス (Unix システムではすべてのデバイスはファイルまたはディレクトリとして表現されます) を対象とします。この原理はすべての Unix システムで共通ですが、特に興味深く比較的知られていない上級の使い方があるので、注意は常に必要です。
ファイルとディレクトリには、ユーザの種類別に 3 種類の特定のパーミッションが付けられます:
3 種類の権限は組み合わせて使う事が可能です:
読み込み (「read」の r
で表記されます);
書き込み (または変更、「write」の w
で表記されます);
実行 (「eXecute」の x
で表記されます)。
ファイルの場合、これらの権限は簡単に理解できます: 読み込み権限があれば、内容を読む (コピーを含めて) 事が可能です。書き込み権限があれば、内容を変更する事が可能です。実行権限があれば、内容を実行する事が可能です (プログラムの場合のみ有効)。
ディレクトリは別のやり方で取り扱われます。読み込み権限があれば、そのエントリ (ファイルとディレクトリ) のリストを閲覧する事が可能です。書き込み権限があれば、ファイルを作成および削除する事が可能です。実行権限があれば、そのディレクトリを横断する事が可能です (cd
コマンドでそのディレクトリに移動できます)。ディレクトリの読み込み権限が無くてもディレクトリを横断する事ができるならば、ディレクトリ内の名前を知っているエントリにアクセスする事が可能です。ただし、エントリの存在を知らないか、エントリの完全な名前を知らない場合、そのエントリを見つけることはできません。
ファイルのパーミッションを制御する 3 種類のコマンド:
chown user file
ファイルの所有者を変更します;
chgrp group file
ファイルの所有グループを変更します;
chmod rights file
ファイルのパーミッションを変更します。
権限の指定方法には 2 種類あります。それらの中でも、記号指定が最もわかりやすく覚えやすいでしょう。これは上で述べた文字記号を使います。ユーザのカテゴリ (u
/g
/o
) に対する権限を (=
で) 明示するか、(+
で) 追加するか、(-
で) 取り除く事ができます。そんな訳で、u=rwx,g+rw,o-r
式は、所有者に読み込み、書き込み、実行権限を与え、所有グループに読み込み、書き込み権限を追加し、その他のユーザから読み込み権限を奪います。追加と削除によって変更されない権限はそのままです。「all」を意味する文字 a
は 3 つのユーザカテゴリすべてを表現します。このため、a=rx
はすべてのカテゴリのユーザに対して同じ権限 (読み込みと実行権限を与えますが、書き込み権限は与えません) を与えます。
(8 進数) 数値表記は各権限を値で表現します: 読み込みは 4、書き込みは 2、実行権限は 1 です。権限を組み合わせるには組み合わせたい権限に対応する数字を合計します。ユーザの各カテゴリ (所有者、グループ、その他) に対して与える権限を同じ順番で連結して、それぞれの権限を割り当てます。
例えば、chmod 754 file
コマンドは以下の権限を設定します: 所有者に書き込み、読み込み、実行権限 (7 = 4 + 2 + 1 なので) を設定し; 所有グループに読み込み、実行権限 (5 = 4 + 1 なので) を設定し; その他のユーザに読み込み権限を設定します。0
は権限が無い事を意味します; このため chmod 600 file
は所有者に読み込み、書き込み権限を設定し、所有者以外のユーザにはいかなる権限も与えません。最もよく使われる権限の組み合わせは、実行ファイルやディレクトリの場合 755
で、データファイルの場合 644
です。
同じ原則に従って特別な権限を表す 4 番目の桁は先に説明した 3 桁の権限表記の前に付けます。setuid
、setgid
、sticky
ビットがそれぞれ 4、2、1 に対応します。chmod 4754
は前に説明した権限に加えて、setuid
ビットを設定します。
8 進数表記の権限設定が使えるのは、あるファイルに対するすべての権限を一度に設定する場合だけです; 例えば、所有グループに読み込み権限を与えるなどの、新しい権限を追加したい場合は使えません。なぜなら、既に設定されている権限を考慮して、新しい権限を数値表記に直さなければいけないからです。