OSDN Git Service

info/GNU_coreutils: update to version 8.26
[linuxjm/jm.git] / info / GNU_coreutils / release / perm-ja.texi
1 @c ===========================================================================
2 @c
3 @c This file was generated with po4a. Translate the source file.
4 @c
5 @c ===========================================================================
6 @c File mode bits
7
8 @c Copyright (C) 1994-2016 Free Software Foundation, Inc.
9
10 @c Permission is granted to copy, distribute and/or modify this document
11 @c under the terms of the GNU Free Documentation License, Version 1.3 or
12 @c any later version published by the Free Software Foundation; with no
13 @c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
14 @c Texts.  A copy of the license is included in the ``GNU Free
15 @c Documentation License'' file as part of this distribution.
16
17 各ファイルには、一組のファイル・モードビット (@dfn{file mode bits})
18 というものがあって、ユーザがそのファイルに対してどんなアクセスができるかを制御している。
19 モードビットは、シンボルによっても、8 進数によっても表すことができる。
20
21 @menu
22 * Mode Structure::           ファイル・モードビットの構成。
23 * Symbolic Modes::           ファイル・モードビットの覚えやすい表現。
24 * Numeric Modes::            ファイル・モードビットの 8 進数による表現。
25 * Operator Numeric Modes::   8 進数によるモードの追加、削除、絶対指定。
26 * Directory Setuid and Setgid::  ディレクトリの set-user-ID と set-group-ID。
27 @end menu
28
29 @node Mode Structure
30 @section ファイル・モードビットの構成
31
32 ファイル・モードビットには、二つの構成部分がある。
33 ファイルに対する通常のアクセスを制御するファイル許可属性ビット (@dfn{file permission bits})
34 と、若干のファイルのみに働く特殊モードビット (@dfn{special mode bits}) である。
35
36 ユーザがファイルに対して持つ許可 (訳注: アクセス権とも言う) には、
37 3 種類ある。
38
39 @enumerate
40 @item
41 @cindex read permission
42 ファイルを読み込む許可。ディレクトリに対しては、ディレクトリの中身をリストする許可になる。
43 @item
44 @cindex write permission
45 ファイルに書き出す (ファイルを変更する) 許可。ディレクトリに対しては、
46 そのディレクトリ中でファイルを作成したり、削除したりする許可になる。
47 @item
48 @cindex execute/search permission
49 ファイルを実行する (プログラムとしてそれを動かす) 許可。
50 ディレクトリに対しては、ディレクトリ中のファイルにアクセスする許可になる。
51 @end enumerate
52
53 ユーザにも 3 種類あり、ファイルに対する上記の操作のいづれについても、
54 それぞれ違った許可を持つことができる。
55
56 @enumerate
57 @item
58 ファイルの所有者。
59 @item
60 ファイルの所有グループに属するファイルの所有者以外のユーザ。
61 @item
62 それ以外の全員。
63 @end enumerate
64
65 @cindex owner, default
66 @cindex group owner, default
67 ファイルには、作成されるときに所有者とグループが割り当てられる。
68 たいていの場合、所有者はファイルを作成したユーザであり、
69 グループはファイルが存在するディレクトリのグループだが、
70 オペレーティングシステムやファイルが作成されるファイルシステム、ファイルの作成方法などによって違うこともある。
71 ファイルの所有者やグループは、@command{chown} や @command{chgrp}
72 コマンドを使って、変更することができる。
73
74 上に挙げた 3 種類の許可属性 3 組のほかに、ファイルのモードビットには三つの特殊モードビットが存在するが、
75 そうしたものは、実行ファイル (すなわち、プログラム) と --- ほとんどのシステムでは
76 --- ディレクトリにしか効果を持たない。
77
78 @enumerate
79 @item
80 @cindex set-user-ID
81 @cindex setuid
82 ファイルの実行時に、そのプロセスの実効ユーザ ID をファイルの所有者のものにする
83 (@dfn{set-user-ID bit} とか @dfn{setuid bit} と呼ばれる)。
84 若干のシステムでは、ディレクトリに set-user-ID ビットを付けると、
85 ファイルの作成者が誰であれ、そのディレクトリ中で作成されるファイルの所有者が、
86 ディレクトリの所有者と同じになる。また、新しく作られるサブディレクトリに
87 set-user-ID ビットが付く。
88 @item
89 @cindex set-group-ID
90 @cindex setgid
91 ファイルの実行時に、そのプロセスの実効グループ ID をファイルのグループのものにする
92 (@dfn{set-group-ID bit} とか @dfn{setgid bit} と呼ばれる)。
93 ほとんどのシステムでは、ディレクトリに set-group-ID ビットを付けると、
94 ファイルの作成者がどんなグループに属していようとも、
95 そのディレクトリ中で作成されるファイルのグループが、ディレクトリのグループと同じになる。
96 また、新しく作成されるサブディレクトリに set-group-ID ビットが付く。
97 @item
98 @cindex sticky
99 @cindex swap space, saving text image in
100 @cindex text image, saving in swap space
101 @cindex restricted deletion flag
102 特権を持たないユーザ (訳注: 要するに、root 以外の一般ユーザ)
103 に対して、自分が所有するファイルやディレクトリを除き、
104 ディレクトリ中のファイルの削除や、名前の変更を禁じる。
105 これは、ディレクトリの削除制限フラグ (@dfn{restricted deletion flag})
106 と呼ばれ、@file{/tmp} のような、誰でも書き込めるディレクトリでよく見かけられる。
107
108 古いシステムの中には、通常ファイルにこのビットが付いていると、
109 プログラムのテキスト・イメージをスワップ・デバイスにセーブするものがある。
110 そうすることで、実行時にロードが速くなるわけだ。
111 こちらは、スティッキー・ビット (@dfn{sticky bit}) と呼ばれる。
112 @end enumerate
113
114 @c should probably say a lot more about ACLs... someday
115 上記のファイル・モードビットのほかに、ファイルシステムに固有のファイル属性が存在することがある。
116 たとえば、アクセス・コントロール・リスト (ACL) がそうだし、
117 ファイルが圧縮されているか否か、ファイルが変更可能か否か (変更不可属性)、
118 ファイルがダンプ可能か否か、といった属性が存在することもある。
119 そうした属性は、通常、ファイルシステム固有のプログラムを使って設定される。例を挙げよう。
120
121 @table @asis
122 @item ext2
123 GNU 及び GNU/Linux では、ext2 ファイルシステムに固有なファイル属性は、
124 @command{chattr} コマンドを使って設定される。
125
126 @item FFS
127 FreeBSD では、FFS ファイルシステムに固有なファイルフラグは、
128 @command{chflags} コマンドを使って設定される。
129 @end table
130
131 ファイルのモードビットがそのファイルに対するある操作を許可していたとしても、
132 それでもその操作に失敗することがある。その理由としては、次のようなことが考えられる。
133
134 @itemize
135 @item
136 ファイルシステムに固有な属性やフラグが、その操作を許可していない。
137
138 @item
139 ファイルシステムが読み込み専用でマウントされている。
140 @end itemize
141
142 たとえば、ファイルに変更不可属性が設定されていると、@code{chmod a+w FILE}
143 を直前に実行したとしても、ファイルを変更することはできない。
144
145 @node Symbolic Modes
146 @section シンボリックモード
147
148 @cindex symbolic modes
149 シンボリックモード (@dfn{Symbolic modes}) では、
150 ファイルのモードビットの変更を、1 文字からなるシンボルに対する操作として表現している。
151 シンボリックモードを使えば、ファイルのモードビットのすべてを変更することもできるし、その一部を選択して変更することもできる。
152 もしそうしたければ、変更前のモードビットの値に基づいて変更することも可能だ。
153 現在の @code{umask} に基づいて変更することも、多分できるはずである (@pxref{Umask and Protection})。
154
155 シンボリックモードの書式は、次のとおりである。
156
157 @example
158 @r{[}ugoa@dots{}@r{][}-+=@r{]}@var{perms}@dots{}@r{[},@dots{}@r{]}
159 @end example
160
161 @noindent
162 ここで @var{perms} は @samp{rwxXst} の内の 0 個以上の文字、または
163 @samp{ugo} の内の 1 個の文字である。
164
165 以下のセクションでは、シンボリックモードについて、演算子 (operator)
166 を始め、様々なことを詳しく説明する。
167
168 @menu
169 * Setting Permissions::         許可属性の基本操作。
170 * Copying Permissions::         存在する許可属性をコピーする。
171 * Changing Special Mode Bits::  特殊モードビット。
172 * Conditional Executability::   条件付きで実行属性の変更をする。
173 * Multiple Changes::            複数の変更をする。
174 * Umask and Protection::        umask の働き。
175 @end menu
176
177 @node Setting Permissions
178 @subsection 許可属性の設定
179
180 ファイルの許可属性に対するシンボルによる操作 (operation) の基本は、
181 あるタイプのユーザに対して、ファイルの、読み、書き、実行または検索を行うための許可属性を、
182 追加したり、削除したり、設定したりすることである。
183 そうした操作には、以下の書式を使用する。
184
185 @example
186 @var{users} @var{operation} @var{permissions}
187 @end example
188
189 @noindent
190 上の書式では、三つの部分を空白で区切って示しているが、見やすくするためにすぎない。
191 シンボリックモードの指定には空白があってはならない。
192
193 @var{users} の部分は、どのタイプのユーザの、ファイルに対するアクセス権を変更するかを示している。
194 この部分には、1 個以上の下記の文字を指定する (あるいは、何も指定しないでもよい。
195 その場合どうなるかは、「Umask と保険」セクションで説明している。
196 @pxref{Umask and Protection})。文字を 2 個以上指定した場合の順番に特別な意味はない。
197
198 @table @code
199 @item u
200 @cindex owner of file, permissions for
201 ファイルの所有者。
202 @item g
203 @cindex group, permissions for
204 ファイルの所有グループに属するファイルの所有者以外のユーザ。
205 @item o
206 @cindex other permissions
207 @samp{u} や @samp{g} 以外のすべてのユーザ。
208 @item a
209 すべてのユーザ。@samp{ugo} と同じ。
210 @end table
211
212 @var{operation} の部分は、対象となるユーザのファイルに対するアクセス権をどんなふうに変更するかを指示しており、
213 以下の記号の一つを使用する。
214
215 @table @code
216 @item +
217 @cindex adding permissions
218 @var{users} がそのファイルに対して、すでにどんな許可を持っているかにかかわりなく、
219 それに @var{permissions} を追加する。
220 @item -
221 @cindex removing permissions
222 @cindex subtracting permissions
223 @var{users} がそのファイルに対して、すでにどんな許可を持っているかにかかわりなく、
224 そこから @var{permissions} を削除する。
225 @item =
226 @cindex setting permissions
227 @var{permissions} を、そのファイルに対して @var{users} が持つ許可のすべてにする。
228 @end table
229
230 @var{permissions} の部分は、ファイルに対するどんなアクセス権を変更するかを指示しており、
231 通常は 0 個以上の下記の文字を指定する。@var{users} の部分と同様、文字を
232 2 個以上指定した場合の順番に特別な意味はない。@var{permissions}
233 の部分に何も指定しないことに意味があるのは、操作に @samp{=} 演算子を使用する場合だけである。
234 その場合、指定されたユーザは、そのファイルに対していかなるアクセス権も持たないことになる。
235
236 @table @code
237 @item r
238 @cindex read permission, symbolic
239 @var{users} の、そのファイルを読む権限。
240 @item w
241 @cindex write permission, symbolic
242 @var{users} の、そのファイルに書き込む権限。
243 @item x
244 @cindex execute/search permission, symbolic
245 @var{users} の、そのファイルを実行する権限。ディレクトリの場合は、
246 ディレクトリを検索する権限。
247 @end table
248
249 たとえば、ある通常ファイルについて、すべてのユーザに読み書きを許可するが、
250 その実行は許可しないならば、次のように指定する。
251
252 @example
253 a=rw
254 @end example
255
256 そのファイルの所有者以外のすべてのユーザから書き込み権限を取り上げるには、次のようにする。
257
258 @example
259 go-w
260 @end example
261
262 @noindent
263 上記の指定は、ファイルの所有者がファイルに対して持っているアクセス権には影響を及ぼさない。
264 また、所有者以外のユーザがそのファイルを読んだり、実行したりできるかどうかにも、影響を及ぼさない。
265
266 ファイルの所有者以外のすべてのユーザに対して、そのファイルに何をする権限も一切与えないためには、
267 以下のモードを使用すればよい。それでも、所有者以外のユーザは、
268 ファイルの存在するディレクトリに対する書き込み権限を持っていれば、
269 そのファイルを削除することができるだろうけれど。
270
271 @example
272 go=
273 @end example
274
275 @noindent
276 同じことを指定する別のやり方もある。
277
278 @example
279 og-rwx
280 @end example
281
282 @node Copying Permissions
283 @subsection 存在する許可属性のコピー
284
285 @cindex copying existing permissions
286 @cindex permissions, copying existing
287 ファイルの許可属性を、それが既に持っている許可属性を元にして指定することもできる。
288 そうするには、演算子の後ろに @samp{r}, @samp{w}, @samp{x}
289 という文字を続ける代わりに、@samp{u}, @samp{g}, @samp{o}
290 という文字を使用する。一例を挙げよう。
291
292 @example
293 o+g
294 @end example
295
296 @noindent
297 上記のモード指定は、ファイルのグループに属するユーザのアクセス権を、
298 その他のユーザがそのファイルに対して持っているアクセス権に追加する。
299 従って、仮にファイルの最初のモードが 664 (@samp{rw-rw-r--}) ならば、
300 上記のモード指定は、それを 666 (@samp{rw-rw-rw-}) に変更することになる。
301 ファイルの最初のモードが 741 (@samp{rwxr----x}) だったら、745 (@samp{rwxr--r-x})
302 になるだろう。@samp{-} と @samp{=} の演算子の働きも、同様である。
303
304 @node Changing Special Mode Bits
305 @subsection 特殊モードビットの変更
306
307 @cindex changing special mode bits
308 読み込み、書き出し、実行/検索に関するファイルの許可属性を変更できるだけではない。
309 特殊モードビットも変更することができる。特殊モードビットについては、
310 「ファイルのモードビットの構成」の節で簡単に説明している。@xref{Mode Structure}.
311
312 ファイルの実行時にユーザ ID をセットするように、ファイルのモードビットを変更するには、
313 シンボリックモードの @var{users} の部分に @samp{u} を使用し、
314 @var{permissions} の部分に@samp{s} を使用する。
315
316 ファイルの実行時にグループ ID をセットするように、ファイルのモードビットを変更するには、
317 シンボリックモードの @var{users} の部分に @samp{g} を使用し、
318 @var{permissions} の部分に @samp{s} を使用する。
319
320 ファイルの実行時にユーザ ID とグループ ID の両方をセットするようにするには、
321 シンボリックモードの @var{users} の部分に何も指定せず
322 (あるいは、@samp{a} を使用し)、 @var{permissions} の部分に @samp{s} を使用する。
323
324 削除制限フラグやスティッキー・ビットが有効になるように、ファイルのモードビットを変更するには、
325 シンボリックモードの @var{users} の部分に何も指定せず
326 (あるいは、@samp{a} を使用し)、@var{permissions} の部分に @samp{t} を使用する。
327
328 たとえば、あるプログラムに set-user-ID モードビットを設定するには、
329 次のモードを指定すればよい。
330
331 @example
332 u+s
333 @end example
334
335 そのプログラムから set-user-ID と set-group-ID の両方のモードビットを削除するには、
336 次のモードを指定する。
337
338 @example
339 a-s
340 @end example
341
342 削除制限フラグやスティッキー・ビットを設定するには、次のモードを指定する。
343
344 @example
345 +t
346 @end example
347
348 @samp{o+s} という組み合わせには、何の効果もない。GNU のシステムでは、
349 @samp{u+t} や @samp{g+t} という組み合わせにも、全く効果がなく、
350 また @samp{o+t} は、単なる @samp{+t} と同じ働きをする。
351
352 特殊モードビットの設定や変更では、@samp{=} はあまり役に立たない。
353 たとえば、こんな指定をしたとしよう。
354
355 @example
356 o=t
357 @end example
358
359 @noindent
360 上記のモードは、確かに、削除制限フラグやスティッキー・ビットを設定することはするが、
361 同時に、ファイルのグループに属していないユーザが、
362 そのファイルに対して、読み、書き、実行/検索の権限を持っていたとしても、
363 そうした権限をすべて削除してしまう。
364
365 set-user-ID や set-group-ID ビットがディレクトリに付いている場合の、
366 ほかの約束事については、「ディレクトリの Set-User-ID と Set-Group-ID
367 ビット」の節をご覧になっていただきたい。@xref{Directory Setuid and Setgid}.
368
369 @node Conditional Executability
370 @subsection 条件付きの実行属性変更
371
372 @cindex conditional executability
373 シンボルによる許可属性の指定には、もう一つ特別なタイプがある。@samp{x}
374 の代わりに、@samp{X} を使用すると、実行/検索の許可属性に変更があるのは、
375 ファイルがディレクトリである場合か、あるいは、(どのユーザかに)
376 すでに実行許可が付いていた場合だけになる。
377
378 一例を挙げよう。
379
380 @example
381 a+X
382 @end example
383
384 @noindent
385 上記のモードは、すべてのユーザにディレクトリを検索する許可、
386 または、ファイルを実行する許可を与えるが、後者については、どのユーザかが、
387 すでにそのファイルを実行できたならば、という条件が付く。
388
389 @node Multiple Changes
390 @subsection 複数の変更
391
392 @cindex multiple changes to permissions
393 シンボリックモードの書式は、これまでに述べてきたよりも、実際にはもっと複雑である (@pxref{Setting Permissions})。
394 ファイルのモードビットに対して、複数の変更を一度に行うには、二つの方法がある。
395
396 一つ目の方法は、シンボリックモードの @var{users} の部分の後ろに、複数の
397 @var{operation} と @var{permissions} を指定することである。
398
399 たとえば、こんなふうにだ。
400
401 @example
402 og+rX-w
403 @end example
404
405 @noindent
406 このモードは、ファイルの所有者以外のユーザに、読み込み許可を与え、
407 さらに、ファイルがディレクトリであるか、どのユーザかがすでに実行許可を持っていた場合には、実行/検索許可も与えている。
408 また、ファイルの所有者以外のユーザから、ファイルへの書き出し許可を取り上げている。
409 なお、この指定は、ファイルの所有者が持っている許可には影響を及ぼさない。
410 このモードは、以下の二つのモードと等価である。
411
412 @example
413 og+rX
414 og-w
415 @end example
416
417 複数の変更を行う二つ目の方法は、単純なシンボリックモードを
418 2 個以上、コンマで区切って指定することである。たとえば、
419
420 @example
421 a+r,go-w
422 @end example
423
424 @noindent
425 これは、すべてのユーザにそのファイルに対する読み込み許可を与え、
426 所有者以外のすべてのユーザから書き出し許可を削除している。もう一つ、例を挙げる。
427
428 @example
429 u=rwx,g=rx,o=
430 @end example
431
432 @noindent
433 こちらは、そのファイルに対するすべての許可ビットを明示的に設定している。
434 (ファイルのグループに属さないユーザには、ファイルに対する許可を一切与えていない。)
435
436 複数の変更を行う二つの方法を組み合わせて使うこともできる。
437
438 @example
439 a+r,g+x-w
440 @end example
441
442 @noindent
443 この指定は、すべてのユーザにファイルの読み込み許可を与え、
444 さらに、ファイルのグループに属するユーザには、実行/検索許可も与えているが、
445 書き出し許可は与えていない。上記のモードを指定する方法は、ほかにもいくつかあるだろう。
446 その一つを挙げておく。
447
448 @example
449 u+r,g+rx,o+r,g-w
450 @end example
451
452 @node Umask and Protection
453 @subsection Umask と保険
454
455 @cindex umask and modes
456 @cindex modes and umask
457 シンボリックモードの @var{users} の部分を省略すると、デフォルトの @samp{a}
458 が使用される (すべてのユーザが対象になる)。が、この場合、システム変数
459 @code{umask} で設定されている許可属性は、全く影響を受けない
460 (訳注: @code{umask} で許可しないことになっている許可属性は、
461 現在実際には許可になっていようと、不許可であろうと、@samp{-w} や @samp{+w}
462 といった @var{users} 部のない指定では、変更されないということ。
463 以下で例を挙げて説明している)。@code{umask} の値は、@code{umask}
464 コマンドで設定することができる。@code{umask} のデフォルトの値は、システムによって様々である。
465
466 @cindex giving away permissions
467 シンボリックモードで @var{users} の部分を省略するのは、@samp{+} 以外の操作では、
468 おおむね役に立たない。@var{users} の省略が @samp{+} で役に立つのは、その場合、
469 意図した以上の許可をファイルに付けてしまわないための、簡単にカスタマイズできる保険として、
470 @code{umask} が使用できるからである。
471
472 一例を挙げると、@code{umask} の値が 2 ということは、
473 ファイルの所有者でもなく、ファイルのグループにも所属していない一般ユーザに、
474 書き出し許可を与えないということである。その場合、
475
476 @example
477 +w
478 @end example
479
480 @noindent
481 というモードは、ファイルの所有者とファイルのグループに所属するユーザに、
482 書き出し許可を追加するが、それ以外のユーザには、書き出し許可を追加しない。それに対して、
483
484 @example
485 a+w
486 @end example
487
488 @noindent
489 というモードは、@code{umask} を無視して、ファイルへの書き出し許可を、
490 文字通りすべてのユーザに与えるのである。
491
492 @node Numeric Modes
493 @section 数値モード
494
495 @cindex numeric modes
496 @cindex file mode bits, numeric
497 @cindex octal numbers for file modes
498 シンボリックモードで指定する代わりに、モードを表す 1 個の 8 進数
499 (基数 8) を指定することもできる。この数値は常に 8 進数として解釈されるので、
500 C 言語の場合とは違って、先頭に @samp{0} を付ける必要はない。@samp{0055}
501 というモードは、@samp{55} というモードと同じなのだ。(とは言え、@samp{00055}
502 のような、5 桁以上のモードは、特別な扱いを受けることがある。
503 @xref{Directory Setuid and Setgid}.)
504
505 数値モードは、たいていの場合、対応するシンボリックモードより短くてすむが、
506 ファイルの変更前のモードビットを踏まえて指定することが、
507 普通はできないという制限がある。数値モードでは、絶対的な形で指定することしかできないのだ。
508 ディレクトリの set-user-ID ビットと set-group-ID ビットは、
509 この一般的な制限の対象外である。 @xref{Directory Setuid and Setgid}.
510 なお、演算子付き数値モードを使えば、ファイルの変更前のモードビットを踏まえた指定が可能になる。
511 @xref{Operator Numeric Modes}.
512
513 ファイルの所有者、ファイルのグループに所属する他のユーザ、それ以外の一般ユーザ、
514 この 3 種のユーザに与える許可属性には、それぞれ 3 ビットを要し、その 3 ビットは
515 1 個の 8 進数で表現される。三つの特殊モードビットにも、おのおの 1 ビットが必要であり、
516 こちらも一つにまとめて、もう一つの 8 進数として表現される。
517 各ビットの並び方は、最下位のビットから上位のビットへ向かって、次のようになっている。
518
519 @example
520 モードの  対応する
521 値        モードビット
522
523           ファイルのグループに所属しない一般ユーザ:
524    1      実行/検索
525    2      書き出し
526    4      読み込み
527
528           ファイルのグループに所属する所有者以外のユーザ:
529   10      実行/検索
530   20      書き出し
531   40      読み込み
532
533           ファイルの所有者:
534  100      実行/検索
535  200      書き出し
536  400      読み込み
537
538           特殊モードビット:
539 1000      削除制限フラグ、またはスティッキー・ビット
540 2000      ファイルの実行時にグループ ID をセットする
541 4000      ファイルの実行時にユーザ ID をセットする
542 @end example
543
544 たとえば、数値モードの @samp{4755} は、シンボリックモードの @samp{u=rwxs,go=rx}
545 に当たり、数値モードの @samp{664} は、シンボリックモードの @samp{ug=rw,o=r}
546 に相当している。数値モードの @samp{0} は、シンボリックモードの @samp{a=} に相当する。
547
548 @node Operator Numeric Modes
549 @section 演算子付き数値モード
550
551 演算子付き数値モードは、@samp{-}, @samp{+}, @samp{=} を前に付けた数値モードである。
552 そうした演算子が表している意味は、シンボリックモードの場合と同じだ。
553 たとえば、@samp{+440} は、ファイルの所有者とグループに対する読み込み許可を有効にし、
554 @samp{-1} は、その他の一般ユーザに対する実行許可を無効にする。
555 また、@samp{=600} は、ファイルの所有者に対する読み込みと書き出しの許可を有効にするが、
556 それ以外のすべての許可を無効にする。
557 演算子付き数値モードは、シンボリックモードと組み合わせて使うことも可能だ。
558 両者の間はコンマで区切ればよい。一例を挙げると、@samp{=0,u+r}
559 は、すべての許可を無効にした上で、ファイルの所有者の読み込み許可だけを有効にする。
560
561 コマンド  @samp{chmod =755 @var{dir}} と @samp{chmod 755 @var{dir}}
562 の違いは、前者がディレクトリ @var{dir} の setuid と setgid
563 をクリアするのに対して、後者はそれをそのまま維持するという点にある。
564 @xref{Directory Setuid and Setgid}.
565
566 演算子付き数値モードは、GNU による拡張である。
567
568 @node Directory Setuid and Setgid
569 @section ディレクトリの Set-User-ID と Set-Group-ID ビット
570
571 ほとんどのシステムでは、ディレクトリに set-group-ID ビットが付いていると、
572 そのディレクトリ内で新しく作られるファイルは、ディレクトリと同じグループを継承し、
573 新しく作られるサブディレクトリは、親ディレクトリの set-group-ID ビットを継承する。
574 また、若干のシステムでは、ディレクトリの set-user-ID ビットが、
575 ディレクトリ内の新規ファイルの所有者と、新規サブディレクトリの set-user-ID
576 ビットに対して、同様の効果を持っている。
577 こうした仕組みによって、新しいファイルを共有するために @command{chmod} や
578 @command{chown} を使う必要が軽減し、ユーザにとってファイルの共有がやりやすくなっているのである。
579
580 ユーザの便宜のためのこうした仕組みは、ディレクトリの set-user-ID
581 ビットや set-group-ID ビットを拠り所にしている。もし、@command{chmod} や
582 @command{mkdir} が、ディレクトリのそうしたビットを常時クリアする仕様になっていたら、
583 この仕組みもそれほど便利ではなくなり、ファイルの共有が面倒なことになるだろう。
584 それ故、@command{chmod} などのコマンドは、原則としてディレクトリの
585 set-user-ID ビットや set-group-ID ビットを変更しないのである。
586 set-user-ID ビットや set-group-ID ビットを変更するには、
587 ユーザがシンボリックモードで明示的にそう指定するか、@samp{=755}
588 のような演算子付き数値モードを使用するか、数値モードでビットを立てるか、5 桁以上の
589 8 進数からなる数値モードでビットをクリアするか、そのどれかをやる必要がある。
590 set-group-ID ビットの継承をサポートしているシステムでの例を挙げよう。
591
592 @example
593 # 以下のコマンドは、サブディレクトリの set-user-ID ビットと
594 # set-group-ID ビットを変更しない。従って、デフォルトの値が
595 # 保持される。
596 mkdir A B C
597 chmod 755 A
598 chmod 0755 B
599 chmod u=rwx,go=rx C
600 mkdir -m 755 D
601 mkdir -m 0755 E
602 mkdir -m u=rwx,go=rx F
603 @end example
604
605 サブディレクトリの set-user-ID ビットや set-group-ID ビットを設定したかったら、
606 シンボリックモードや数値モードで明示的に指定しなければならない。たとえば、次のようにだ。
607
608 @example
609 # 以下のコマンドは、サブディレクトリに set-user-ID ビットと
610 # set-group-ID bits を付けようとしている。
611 mkdir G
612 chmod 6755 G
613 chmod +6000 G
614 chmod u=rwx,go=rx,a+s G
615 mkdir -m 6755 H
616 mkdir -m +6000 I
617 mkdir -m u=rwx,go=rx,a+s J
618 @end example
619
620 サブディレクトリの set-user-ID ビットや set-group-ID ビットを消去したかったら、
621 シンボリックモードで明示的にそう指定するか、演算子付き数値モードを使用するか、5 桁以上の
622 8 進数からなる数値モードで指定するかしなければならない。
623
624 @example
625 # 以下のコマンドは、ディレクトリ D の set-user-ID ビットと
626 # set-group-ID ビットをクリアしようとしている。
627 chmod a-s D
628 chmod -6000 D
629 chmod =755 D
630 chmod 00755 D
631 @end example
632
633 こうした動作は、GNU による拡張である。移植を考慮したスクリプトでは、
634 ディレクトリの set-user-ID ビットや set-group-ID ビットを立てたり、
635 クリアしたりするリクエストを当てにしない方がよい。
636 POSIX の規格で、そうしたリクエストを無視する実装が認められているからだ。
637 なお、GNU の許可属性指定における 4 桁以下の数値モードの動作は、ディレクトリの
638 set-user-ID ビットや set-group-ID ビットを維持するシステムで使うスクリプト向けであり、
639 5 桁以上の数値モードの動作は、そうしたビットを維持しないシステムでも使えるスクリプト向けである。
640
641 (訳注: 4 桁以下と 5 桁以上の数値によるモード指定の違いについて少し整理しておく。
642 数値によるモード指定は、原則として絶対的な指定である。
643 たとえば、755 と指定すれば、755 に対応するモードビットだけが立てられ、
644 それ以外のビットは 0 になる。ただし、ディレクトリの set-user-ID ビットと
645 set-group-ID ビットについてだけは、話がもう少し複雑である。
646 4 桁以下の数値による指定の場合、ディレクトリの set-user-ID ビットや
647 set-group-ID ビットを維持するシステムでは、
648 そうしたビットはデフォルトや現在の状態が引き継がれるのだから、
649 ユーザがディレクトリの set-user-ID ビットや set-group-ID
650 ビットを数値によって指定しても、それは絶対的な指定にならない。
651 デフォルト値や現在値に対する追加にしかならないのである。
652 当然のこととして、この方法では消去もできない。それに対して、5 桁以上の数値による指定の場合は、
653 どんなシステムでも、すべてのモードビットについて、ユーザの指定は絶対指定になる。
654 従って、こちらなら、ディレクトリの set-user-ID ビットや set-group-ID
655 ビットの選択的な設定や消去もできるのである。もちろん、お使いの @command{chmod}
656 のバージョンが、5 桁の数値指定をサポートしていればだが。)