[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.5 ディレクトリの Set-User-ID と Set-Group-ID ビット

ほとんどのシステムでは、ディレクトリに set-group-ID ビットが付いていると、 そのディレクトリ内で新しく作られるファイルは、ディレクトリと同じグループを継承し、 新しく作られるサブディレクトリは、親ディレクトリの set-group-ID ビットを継承する。 また、若干のシステムでは、ディレクトリの set-user-ID ビットが、 ディレクトリ内の新規ファイルの所有者と、新規サブディレクトリの set-user-ID ビットに対して、同様の効果を持っている。 こうした仕組みによって、新しいファイルを共有するために chmodchown を使う必要が軽減し、ユーザにとってファイルの共有がやりやすくなっているのである。

ユーザの便宜のためのこうした仕組みは、ディレクトリの set-user-ID ビットや set-group-ID ビットを拠り所にしている。もし、chmodmkdir が、ディレクトリのそうしたビットを常時クリアする仕様になっていたら、 この仕組みもそれほど便利ではなくなり、ファイルの共有が面倒なことになるだろう。 それ故、chmod などのコマンドは、原則としてディレクトリの set-user-ID ビットや set-group-ID ビットを変更しないのである。 set-user-ID ビットや set-group-ID ビットを変更するには、 ユーザがシンボリックモードで明示的にそう指定するか、‘=755’ のような演算子付き数値モードを使用するか、数値モードでビットを立てるか、5 桁以上の 8 進数からなる数値モードでビットをクリアするか、そのどれかをやる必要がある。 set-group-ID ビットの継承をサポートしているシステムでの例を挙げよう。

 
# 以下のコマンドは、サブディレクトリの set-user-ID ビットと
# set-group-ID ビットを変更しない。従って、デフォルトの値が
# 保持される。
mkdir A B C
chmod 755 A
chmod 0755 B
chmod u=rwx,go=rx C
mkdir -m 755 D
mkdir -m 0755 E
mkdir -m u=rwx,go=rx F

サブディレクトリの set-user-ID ビットや set-group-ID ビットを設定したかったら、 シンボリックモードや数値モードで明示的に指定しなければならない。たとえば、次のようにだ。

 
# 以下のコマンドは、サブディレクトリに set-user-ID ビットと
# set-group-ID bits を付けようとしている。
mkdir G
chmod 6755 G
chmod +6000 G
chmod u=rwx,go=rx,a+s G
mkdir -m 6755 H
mkdir -m +6000 I
mkdir -m u=rwx,go=rx,a+s J

サブディレクトリの set-user-ID ビットや set-group-ID ビットを消去したかったら、 シンボリックモードで明示的にそう指定するか、演算子付き数値モードを使用するか、5 桁以上の 8 進数からなる数値モードで指定するかしなければならない。

 
# 以下のコマンドは、ディレクトリ D の set-user-ID ビットと
# set-group-ID ビットをクリアしようとしている。
chmod a-s D
chmod -6000 D
chmod =755 D
chmod 00755 D

こうした動作は、GNU による拡張である。移植を考慮したスクリプトでは、 ディレクトリの set-user-ID ビットや set-group-ID ビットを立てたり、 クリアしたりするリクエストを当てにしない方がよい。 POSIX の規格で、そうしたリクエストを無視する実装が認められているからだ。 なお、GNU の許可属性指定における 4 桁以下の数値モードの動作は、ディレクトリの set-user-ID ビットや set-group-ID ビットを維持するシステムで使うスクリプト向けであり、 5 桁以上の数値モードの動作は、そうしたビットを維持しないシステムでも使えるスクリプト向けである。

(訳注: 4 桁以下と 5 桁以上の数値によるモード指定の違いについて少し整理しておく。 数値によるモード指定は、原則として絶対的な指定である。 たとえば、755 と指定すれば、755 に対応するモードビットだけが立てられ、 それ以外のビットは 0 になる。ただし、ディレクトリの set-user-ID ビットと set-group-ID ビットについてだけは、話がもう少し複雑である。 4 桁以下の数値による指定の場合、ディレクトリの set-user-ID ビットや set-group-ID ビットを維持するシステムでは、 そうしたビットはデフォルトや現在の状態が引き継がれるのだから、 ユーザがディレクトリの set-user-ID ビットや set-group-ID ビットを数値によって指定しても、それは絶対的な指定にならない。 デフォルト値や現在値に対する追加にしかならないのである。 当然のこととして、この方法では消去もできない。それに対して、5 桁以上の数値による指定の場合は、 どんなシステムでも、すべてのモードビットについて、ユーザの指定は絶対指定になる。 従って、こちらなら、ディレクトリの set-user-ID ビットや set-group-ID ビットの選択的な設定や消去もできるのである。もちろん、お使いの chmod のバージョンが、5 桁の数値指定をサポートしていればだが。)


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

This document was generated on June 7, 2022 using texi2html 1.82.