Perl Perl_2 memo パーミッション
[memo] Unix システムのファイルパーミッション (0x10b)
![[memo] Unix システムのファイルパーミッション (0x10b) [memo] Unix システムのファイルパーミッション (0x10b)](http://img04.ti-da.net/usr/p/o/i/pointoht/20140901_perl.png)
目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x10b 回。
CGI.pm で、実用的なファイルアップロードの処理を確認する前に、アップロード先に指定するディレクトリのパーミッションを確認するが、さらにその前に、Unix 系のオペレーティングシステムにおける、ファイルのパーミッションを確認する。
Web サーバの実行ユーザ
前回 (0x10a) で確認した、ファイルアップロードのための Perl プログラムでは、アップロード先に「 UPFILE/ 」という名前のディレクトリを指定していました。
HTML フォームを通じて、ファイルの書き込みを行う場合、実際にプログラムを起動して、ファイルを書き込むのは Web サーバ ( ここでは Apache ) の仕事です。
このため、アップロード先のディレクトリ UPFILE/ は、Web サーバの実行ユーザ ( Drive Network では www ) 権限で書き込める様に、適切なパーミッションが設定されている必要があります。
ファイルパーミッション
「 ディレクトリ 」のパーミッションを確認する前に、まず、UNIX 系システムの「 ファイル 」のパーミッションを簡単におさらいします。
パーミッション ( permition ) は、英語で「 許可 」や「 承認 」と言う意味を持ちます。
UNIX 系システムのファイルパーミッションは、つまり、特定のユーザがあるファイルを操作する場合に、どの様な操作が「 許可 」されているかという「 権限 」を表現したものです。
パーミッションのクラス
ファイルを操作しようとする場合、全てのユーザは、基本的に 3 つのクラスに区分されます。
1 つ目は、ファイルを所有するクラス「 所有者 」です。これは「 ユーザ 」自身で「 user 」とも表記されます。
2 つ目は、所有者と同じグループに属するクラス「 グループ 」です。これは「 group 」とも表記されます。
3 つ目は、所有者でもグループメンバーでもないクラス「 その他 」です。これは「 others 」とも表記されます。
基本のパーミッション
ほとんどの UNIX 系システムでは、ファイルパーミッションを「 r w x 」の 3 つのアルファベットで区別します。
「 r 」は Read ( 読み込み ) 可能の権限を意味します。
「 w 」は Write ( 書き込み ) 可能の権限を意味します。
「 x 」は eXecute ( 実行 ) 可能の権限を意味します。
パーミッションの表記
UNIX 系のシステムでは、3 つのユーザクラスに対する「 r w x 」の 3 つのモードを次の様に表現します。1 番左の「 - 」はひとまず無視してください。
-rwxrwxrwx
「 rwx 」 の組が 3 つセットされていることが分かります。この 3 つの組は、左から「 所有者 」「 グループ 」「 その他 」のクラスを意味します。
パーミッションを 2 進数で理解する
UNIX 系システムのファイルパーミッションは、「 777 」や「 755 」といった 3 桁の数字で表現されることが良くありますが、 これら 3 桁の数字の 1 桁 1 桁が、それぞれ 3 つのユーザクラスを表す 8 進数の値から成っています。
例えば「 764 」のパーミッションは、所有者に「 7 」、グループに「 6 」、その他に「 4 」という権限が与えられます。
3 つのユーザクラスを表現するために、3 つの桁が必要な訳です。
この 8 進数の表記方法はとても便利ですが、やや抽象度が高いです。これをしっかり理解するには、まず初めに、2 進数の表現を覚えると良いと考えています。
2 進数では、パーミッションの設定をより具体的に表現します。許可がない権限が 0 で、許可がある権限が 1 ( ビットフラグ ) です。
8 進数と同じ 3 桁の記述になっていますが、これは 2 進数の 3 桁です。つまり、8 進数の 1 桁を 2 進数では 3 桁で表す訳です。
--- 000
--x 001
-w- 010
-wx 011
r-- 100
r-x 101
rw- 110
rwx 111
「 rwx 」で表現した許可モードと、2 進数のビットフラグが対応していることが分かります。
このモードのパターンは、「 0 か 1 」の 2 つのパターンの「 3 つの組み合わせ 」で成り立っています。これは、「 2 の 3 乗 」なので、発生する組み合わせは 8 個のモードで表現出来ます。
8 個の値で表現出来るのであれば、それは 8 進数で表現出来ます。という訳で、8 進数の表現が登場します。上記 3 桁の 2 進数は、8 進数の 1 桁に収まります。
パーミッションを 8 進数で理解する
アルファベットと 2 進数のモードに対応する 8 進数の値を並べてみましょう。
--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7
この対応を理解すれば、良く見聞きする次の Tips の意味もより理解出来ます。
「 4 の加算で読み込み権限を付与 」
「 2 の加算で書き込み権限を付与 」
「 1 の加算で実行権限を付与 」
8 進数で 4 は、「 r-- 」で読み込み権限がありますが、これに 2 を加えると、8 進数で 6 になります。アルファベットのモードは「 rw- 」なので、「 書き込み権限 」が追加されていることが分かります。
これに 1 を加算すると 7 になります。アルファベットのモードは「 rwx 」ですから、「 実行権限 」が追加されました。
反対に 8 進数の 7 から 4 を引いた場合は、3 になります。アルファベットのモードは「 -wx 」なので、「 読み読み込み権限 」がはく奪されます。
3 から 2 を引くと、1 になります。アルファベットのモードは「 --x 」になるので、「 書き込み権限 」がはく奪されます。
ちなみに、アルファベットで表現するモードは「 シンボリックモード 」と呼ばれます。
8 進数で 3 つのクラスを表現する
8 進数での 1 桁を 1 つのクラスと見立てれば、「 所有者 」「 グループ 」「 その他 」のクラスを、次の様に 3 桁の数字で表すことが出来ます。
[シンボル] [2 進数] [8 進数]
--- --- --- 000 000 000 000
--x --x --x 001 001 001 111
-w- -w- -w- 010 010 010 222
-wx -wx -wx 011 011 011 333
r-- r-- r-- 100 100 100 444
r-x r-x r-x 101 101 101 555
rw- rw- rw- 110 110 110 666
rwx rwx rwx 111 111 111 777
FTP 接続ソフト等でお馴染みの、3 桁の 8 進数の値がこれです。
0x10b -> 0x10c へ
UNIX 系システムのファイルパーミッションの解説は、巷に山ほどあふれていますが、2 進数を絡めた解説はあまり多くは無いように見受けられます。
僕自身は、シンボリックモードと 2 進数の関係から始めた方が、素直に理解が出来るので、今回は、その部分にフォーカスして、ファイルパーミッションをおさらいしました。
英語版の File system permissions - Wikipedia では、2 進数について少し言及がありますが、日本語版 ファイルパーミッション- Wikipedia では、その少しが削られています。
それらは、「 8 進数の表現は、2 進数ビットの合計 」や「 読み出しビットは合計に 4 を追加する ( 2 進数で 100 ) 」といった些細な表記なのですが、結構大事だと思うんですよね。こういうディテール。
参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。
目次 - Perl Index
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)