| 1 | Each file has a set of @dfn{file mode bits} that control the kinds of
|
|---|
| 2 | access that users have to that file. They can be represented either in
|
|---|
| 3 | symbolic form or as an octal number.
|
|---|
| 4 |
|
|---|
| 5 | @menu
|
|---|
| 6 | * Mode Structure:: Structure of file mode bits.
|
|---|
| 7 | * Symbolic Modes:: Mnemonic representation of file mode bits.
|
|---|
| 8 | * Numeric Modes:: File mode bits as octal numbers.
|
|---|
| 9 | * Directory Setuid and Setgid:: Set-user-ID and set-group-ID on directories.
|
|---|
| 10 | @end menu
|
|---|
| 11 |
|
|---|
| 12 | @node Mode Structure
|
|---|
| 13 | @section Structure of File Mode Bits
|
|---|
| 14 |
|
|---|
| 15 | The file mode bits have two parts: the @dfn{file permission bits},
|
|---|
| 16 | which control ordinary access to the file, and @dfn{special mode
|
|---|
| 17 | bits}, which affect only some files.
|
|---|
| 18 |
|
|---|
| 19 | There are three kinds of permissions that a user can have for a file:
|
|---|
| 20 |
|
|---|
| 21 | @enumerate
|
|---|
| 22 | @item
|
|---|
| 23 | @cindex read permission
|
|---|
| 24 | permission to read the file. For directories, this means permission to
|
|---|
| 25 | list the contents of the directory.
|
|---|
| 26 | @item
|
|---|
| 27 | @cindex write permission
|
|---|
| 28 | permission to write to (change) the file. For directories, this means
|
|---|
| 29 | permission to create and remove files in the directory.
|
|---|
| 30 | @item
|
|---|
| 31 | @cindex execute/search permission
|
|---|
| 32 | permission to execute the file (run it as a program). For directories,
|
|---|
| 33 | this means permission to access files in the directory.
|
|---|
| 34 | @end enumerate
|
|---|
| 35 |
|
|---|
| 36 | There are three categories of users who may have different permissions
|
|---|
| 37 | to perform any of the above operations on a file:
|
|---|
| 38 |
|
|---|
| 39 | @enumerate
|
|---|
| 40 | @item
|
|---|
| 41 | the file's owner;
|
|---|
| 42 | @item
|
|---|
| 43 | other users who are in the file's group;
|
|---|
| 44 | @item
|
|---|
| 45 | everyone else.
|
|---|
| 46 | @end enumerate
|
|---|
| 47 |
|
|---|
| 48 | @cindex owner, default
|
|---|
| 49 | @cindex group owner, default
|
|---|
| 50 | Files are given an owner and group when they are created. Usually the
|
|---|
| 51 | owner is the current user and the group is the group of the directory
|
|---|
| 52 | the file is in, but this varies with the operating system, the
|
|---|
| 53 | file system the file is created on, and the way the file is created. You
|
|---|
| 54 | can change the owner and group of a file by using the @command{chown} and
|
|---|
| 55 | @command{chgrp} commands.
|
|---|
| 56 |
|
|---|
| 57 | In addition to the three sets of three permissions listed above, the
|
|---|
| 58 | file mode bits have three special components, which affect only
|
|---|
| 59 | executable files (programs) and, on most systems, directories:
|
|---|
| 60 |
|
|---|
| 61 | @enumerate
|
|---|
| 62 | @item
|
|---|
| 63 | @cindex set-user-ID
|
|---|
| 64 | @cindex setuid
|
|---|
| 65 | Set the process's effective user ID to that of the file upon execution
|
|---|
| 66 | (called the @dfn{set-user-ID bit}, or sometimes the @dfn{setgid bit}).
|
|---|
| 67 | For directories on a few systems, give files created in the directory
|
|---|
| 68 | the same owner as the directory, no matter who creates them, and set
|
|---|
| 69 | the set-user-ID bit of newly-created subdirectories.
|
|---|
| 70 | @item
|
|---|
| 71 | @cindex set-group-ID
|
|---|
| 72 | @cindex setgid
|
|---|
| 73 | Set the process's effective group ID to that of the file upon execution
|
|---|
| 74 | (called the @dfn{set-group-ID bit}, or sometimes the @dfn{setgid bit}).
|
|---|
| 75 | For directories on most systems, give files created in the directory
|
|---|
| 76 | the same group as the directory, no matter what group the user who
|
|---|
| 77 | creates them is in, and set the set-group-ID bit of newly-created
|
|---|
| 78 | subdirectories.
|
|---|
| 79 | @item
|
|---|
| 80 | @cindex sticky
|
|---|
| 81 | @cindex swap space, saving text image in
|
|---|
| 82 | @cindex text image, saving in swap space
|
|---|
| 83 | @cindex restricted deletion flag
|
|---|
| 84 | Prevent unprivileged users from removing or renaming a file in a directory
|
|---|
| 85 | unless they own the file or the directory; this is called the
|
|---|
| 86 | @dfn{restricted deletion flag} for the directory, and is commonly
|
|---|
| 87 | found on world-writable directories like @file{/tmp}.
|
|---|
| 88 |
|
|---|
| 89 | For regular files on some older systems, save the program's text image on the
|
|---|
| 90 | swap device so it will load more quickly when run; this is called the
|
|---|
| 91 | @dfn{sticky bit}.
|
|---|
| 92 | @end enumerate
|
|---|
| 93 |
|
|---|
| 94 | In addition to the file mode bits listed above, there may be file attributes
|
|---|
| 95 | specific to the file system, e.g., access control lists (ACLs), whether a
|
|---|
| 96 | file is compressed, whether a file can be modified (immutability), and whether
|
|---|
| 97 | a file can be dumped. These are usually set using programs
|
|---|
| 98 | specific to the file system. For example:
|
|---|
| 99 | @c should probably say a lot more about ACLs... someday
|
|---|
| 100 |
|
|---|
| 101 | @table @asis
|
|---|
| 102 | @item ext2
|
|---|
| 103 | On @acronym{GNU} and @acronym{GNU}/Linux the file attributes specific to
|
|---|
| 104 | the ext2 file system are set using @command{chattr}.
|
|---|
| 105 |
|
|---|
| 106 | @item FFS
|
|---|
| 107 | On FreeBSD the file flags specific to the FFS
|
|---|
| 108 | file system are set using @command{chflags}.
|
|---|
| 109 | @end table
|
|---|
| 110 |
|
|---|
| 111 | Even if a file's mode bits allow an operation on that file,
|
|---|
| 112 | that operation may still fail, because:
|
|---|
| 113 |
|
|---|
| 114 | @itemize
|
|---|
| 115 | @item
|
|---|
| 116 | the file-system-specific attributes or flags do not permit it; or
|
|---|
| 117 |
|
|---|
| 118 | @item
|
|---|
| 119 | the file system is mounted as read-only.
|
|---|
| 120 | @end itemize
|
|---|
| 121 |
|
|---|
| 122 | For example, if the immutable attribute is set on a file,
|
|---|
| 123 | it cannot be modified, regardless of the fact that you
|
|---|
| 124 | may have just run @code{chmod a+w FILE}.
|
|---|
| 125 |
|
|---|
| 126 | @node Symbolic Modes
|
|---|
| 127 | @section Symbolic Modes
|
|---|
| 128 |
|
|---|
| 129 | @cindex symbolic modes
|
|---|
| 130 | @dfn{Symbolic modes} represent changes to files' mode bits as
|
|---|
| 131 | operations on single-character symbols. They allow you to modify either
|
|---|
| 132 | all or selected parts of files' mode bits, optionally based on
|
|---|
| 133 | their previous values, and perhaps on the current @code{umask} as well
|
|---|
| 134 | (@pxref{Umask and Protection}).
|
|---|
| 135 |
|
|---|
| 136 | The format of symbolic modes is:
|
|---|
| 137 |
|
|---|
| 138 | @example
|
|---|
| 139 | @r{[}ugoa@dots{}@r{][}+-=@r{]}@var{perms}@dots{}@r{[},@dots{}@r{]}
|
|---|
| 140 | @end example
|
|---|
| 141 |
|
|---|
| 142 | @noindent
|
|---|
| 143 | where @var{perms} is either zero or more letters from the set
|
|---|
| 144 | @samp{rwxXst}, or a single letter from the set @samp{ugo}.
|
|---|
| 145 |
|
|---|
| 146 | The following sections describe the operators and other details of
|
|---|
| 147 | symbolic modes.
|
|---|
| 148 |
|
|---|
| 149 | @menu
|
|---|
| 150 | * Setting Permissions:: Basic operations on permissions.
|
|---|
| 151 | * Copying Permissions:: Copying existing permissions.
|
|---|
| 152 | * Changing Special Mode Bits:: Special mode bits.
|
|---|
| 153 | * Conditional Executability:: Conditionally affecting executability.
|
|---|
| 154 | * Multiple Changes:: Making multiple changes.
|
|---|
| 155 | * Umask and Protection:: The effect of the umask.
|
|---|
| 156 | @end menu
|
|---|
| 157 |
|
|---|
| 158 | @node Setting Permissions
|
|---|
| 159 | @subsection Setting Permissions
|
|---|
| 160 |
|
|---|
| 161 | The basic symbolic operations on a file's permissions are adding,
|
|---|
| 162 | removing, and setting the permission that certain users have to read,
|
|---|
| 163 | write, and execute or search the file. These operations have the following
|
|---|
| 164 | format:
|
|---|
| 165 |
|
|---|
| 166 | @example
|
|---|
| 167 | @var{users} @var{operation} @var{permissions}
|
|---|
| 168 | @end example
|
|---|
| 169 |
|
|---|
| 170 | @noindent
|
|---|
| 171 | The spaces between the three parts above are shown for readability only;
|
|---|
| 172 | symbolic modes cannot contain spaces.
|
|---|
| 173 |
|
|---|
| 174 | The @var{users} part tells which users' access to the file is changed.
|
|---|
| 175 | It consists of one or more of the following letters (or it can be empty;
|
|---|
| 176 | @pxref{Umask and Protection}, for a description of what happens then). When
|
|---|
| 177 | more than one of these letters is given, the order that they are in does
|
|---|
| 178 | not matter.
|
|---|
| 179 |
|
|---|
| 180 | @table @code
|
|---|
| 181 | @item u
|
|---|
| 182 | @cindex owner of file, permissions for
|
|---|
| 183 | the user who owns the file;
|
|---|
| 184 | @item g
|
|---|
| 185 | @cindex group, permissions for
|
|---|
| 186 | other users who are in the file's group;
|
|---|
| 187 | @item o
|
|---|
| 188 | @cindex other permissions
|
|---|
| 189 | all other users;
|
|---|
| 190 | @item a
|
|---|
| 191 | all users; the same as @samp{ugo}.
|
|---|
| 192 | @end table
|
|---|
| 193 |
|
|---|
| 194 | The @var{operation} part tells how to change the affected users' access
|
|---|
| 195 | to the file, and is one of the following symbols:
|
|---|
| 196 |
|
|---|
| 197 | @table @code
|
|---|
| 198 | @item +
|
|---|
| 199 | @cindex adding permissions
|
|---|
| 200 | to add the @var{permissions} to whatever permissions the @var{users}
|
|---|
| 201 | already have for the file;
|
|---|
| 202 | @item -
|
|---|
| 203 | @cindex removing permissions
|
|---|
| 204 | @cindex subtracting permissions
|
|---|
| 205 | to remove the @var{permissions} from whatever permissions the
|
|---|
| 206 | @var{users} already have for the file;
|
|---|
| 207 | @item =
|
|---|
| 208 | @cindex setting permissions
|
|---|
| 209 | to make the @var{permissions} the only permissions that the @var{users}
|
|---|
| 210 | have for the file.
|
|---|
| 211 | @end table
|
|---|
| 212 |
|
|---|
| 213 | The @var{permissions} part tells what kind of access to the file should
|
|---|
| 214 | be changed; it is normally zero or more of the following letters. As with the
|
|---|
| 215 | @var{users} part, the order does not matter when more than one letter is
|
|---|
| 216 | given. Omitting the @var{permissions} part is useful only with the
|
|---|
| 217 | @samp{=} operation, where it gives the specified @var{users} no access
|
|---|
| 218 | at all to the file.
|
|---|
| 219 |
|
|---|
| 220 | @table @code
|
|---|
| 221 | @item r
|
|---|
| 222 | @cindex read permission, symbolic
|
|---|
| 223 | the permission the @var{users} have to read the file;
|
|---|
| 224 | @item w
|
|---|
| 225 | @cindex write permission, symbolic
|
|---|
| 226 | the permission the @var{users} have to write to the file;
|
|---|
| 227 | @item x
|
|---|
| 228 | @cindex execute/search permission, symbolic
|
|---|
| 229 | the permission the @var{users} have to execute the file,
|
|---|
| 230 | or search it if it is a directory.
|
|---|
| 231 | @end table
|
|---|
| 232 |
|
|---|
| 233 | For example, to give everyone permission to read and write a regular file,
|
|---|
| 234 | but not to execute it, use:
|
|---|
| 235 |
|
|---|
| 236 | @example
|
|---|
| 237 | a=rw
|
|---|
| 238 | @end example
|
|---|
| 239 |
|
|---|
| 240 | To remove write permission for all users other than the file's
|
|---|
| 241 | owner, use:
|
|---|
| 242 |
|
|---|
| 243 | @example
|
|---|
| 244 | go-w
|
|---|
| 245 | @end example
|
|---|
| 246 |
|
|---|
| 247 | @noindent
|
|---|
| 248 | The above command does not affect the access that the owner of
|
|---|
| 249 | the file has to it, nor does it affect whether other users can
|
|---|
| 250 | read or execute the file.
|
|---|
| 251 |
|
|---|
| 252 | To give everyone except a file's owner no permission to do anything with
|
|---|
| 253 | that file, use the mode below. Other users could still remove the file,
|
|---|
| 254 | if they have write permission on the directory it is in.
|
|---|
| 255 |
|
|---|
| 256 | @example
|
|---|
| 257 | go=
|
|---|
| 258 | @end example
|
|---|
| 259 |
|
|---|
| 260 | @noindent
|
|---|
| 261 | Another way to specify the same thing is:
|
|---|
| 262 |
|
|---|
| 263 | @example
|
|---|
| 264 | og-rwx
|
|---|
| 265 | @end example
|
|---|
| 266 |
|
|---|
| 267 | @node Copying Permissions
|
|---|
| 268 | @subsection Copying Existing Permissions
|
|---|
| 269 |
|
|---|
| 270 | @cindex copying existing permissions
|
|---|
| 271 | @cindex permissions, copying existing
|
|---|
| 272 | You can base a file's permissions on its existing permissions. To do
|
|---|
| 273 | this, instead of using a series of @samp{r}, @samp{w}, or @samp{x}
|
|---|
| 274 | letters after the
|
|---|
| 275 | operator, you use the letter @samp{u}, @samp{g}, or @samp{o}. For
|
|---|
| 276 | example, the mode
|
|---|
| 277 |
|
|---|
| 278 | @example
|
|---|
| 279 | o+g
|
|---|
| 280 | @end example
|
|---|
| 281 |
|
|---|
| 282 | @noindent
|
|---|
| 283 | adds the permissions for users who are in a file's group to the
|
|---|
| 284 | permissions that other users have for the file. Thus, if the file
|
|---|
| 285 | started out as mode 664 (@samp{rw-rw-r--}), the above mode would change
|
|---|
| 286 | it to mode 666 (@samp{rw-rw-rw-}). If the file had started out as mode
|
|---|
| 287 | 741 (@samp{rwxr----x}), the above mode would change it to mode 745
|
|---|
| 288 | (@samp{rwxr--r-x}). The @samp{-} and @samp{=} operations work
|
|---|
| 289 | analogously.
|
|---|
| 290 |
|
|---|
| 291 | @node Changing Special Mode Bits
|
|---|
| 292 | @subsection Changing Special Mode Bits
|
|---|
| 293 |
|
|---|
| 294 | @cindex changing special mode bits
|
|---|
| 295 | In addition to changing a file's read, write, and execute/search permissions,
|
|---|
| 296 | you can change its special mode bits. @xref{Mode Structure}, for a
|
|---|
| 297 | summary of these special mode bits.
|
|---|
| 298 |
|
|---|
| 299 | To change the file mode bits to set the user ID on execution, use
|
|---|
| 300 | @samp{u} in the @var{users} part of the symbolic mode and
|
|---|
| 301 | @samp{s} in the @var{permissions} part.
|
|---|
| 302 |
|
|---|
| 303 | To change the file mode bits to set the group ID on execution, use
|
|---|
| 304 | @samp{g} in the @var{users} part of the symbolic mode and
|
|---|
| 305 | @samp{s} in the @var{permissions} part.
|
|---|
| 306 |
|
|---|
| 307 | To set both user and group ID on execution, omit the @var{users} part
|
|---|
| 308 | of the symbolic mode (or use @samp{a}) and use @samp{s} in the
|
|---|
| 309 | @var{permissions} part.
|
|---|
| 310 |
|
|---|
| 311 | To change the file mode bits to set the restricted deletion flag or sticky bit,
|
|---|
| 312 | omit the @var{users} part of the symbolic mode (or use @samp{a}) and use
|
|---|
| 313 | @samp{t} in the @var{permissions} part.
|
|---|
| 314 |
|
|---|
| 315 | For example, to set the set-user-ID mode bit of a program,
|
|---|
| 316 | you can use the mode:
|
|---|
| 317 |
|
|---|
| 318 | @example
|
|---|
| 319 | u+s
|
|---|
| 320 | @end example
|
|---|
| 321 |
|
|---|
| 322 | To remove both set-user-ID and set-group-ID mode bits from
|
|---|
| 323 | it, you can use the mode:
|
|---|
| 324 |
|
|---|
| 325 | @example
|
|---|
| 326 | a-s
|
|---|
| 327 | @end example
|
|---|
| 328 |
|
|---|
| 329 | To set the restricted deletion flag or sticky bit, you can use
|
|---|
| 330 | the mode:
|
|---|
| 331 |
|
|---|
| 332 | @example
|
|---|
| 333 | +t
|
|---|
| 334 | @end example
|
|---|
| 335 |
|
|---|
| 336 | The combination @samp{o+s} has no effect. On @acronym{GNU} systems
|
|---|
| 337 | the combinations @samp{u+t} and @samp{g+t} have no effect, and
|
|---|
| 338 | @samp{o+t} acts like plain @samp{+t}.
|
|---|
| 339 |
|
|---|
| 340 | The @samp{=} operator is not very useful with special mode bits.
|
|---|
| 341 | For example, the mode:
|
|---|
| 342 |
|
|---|
| 343 | @example
|
|---|
| 344 | o=t
|
|---|
| 345 | @end example
|
|---|
| 346 |
|
|---|
| 347 | @noindent
|
|---|
| 348 | does set the restricted deletion flag or sticky bit, but it also
|
|---|
| 349 | removes all read, write, and execute/search permissions that users not in the
|
|---|
| 350 | file's group might have had for it.
|
|---|
| 351 |
|
|---|
| 352 | @xref{Directory Setuid and Setgid}, for additional rules concerning
|
|---|
| 353 | set-user-ID and set-group-ID bits and directories.
|
|---|
| 354 |
|
|---|
| 355 | @node Conditional Executability
|
|---|
| 356 | @subsection Conditional Executability
|
|---|
| 357 |
|
|---|
| 358 | @cindex conditional executability
|
|---|
| 359 | There is one more special type of symbolic permission: if you use
|
|---|
| 360 | @samp{X} instead of @samp{x}, execute/search permission is affected only if the
|
|---|
| 361 | file is a directory or already had execute permission.
|
|---|
| 362 |
|
|---|
| 363 | For example, this mode:
|
|---|
| 364 |
|
|---|
| 365 | @example
|
|---|
| 366 | a+X
|
|---|
| 367 | @end example
|
|---|
| 368 |
|
|---|
| 369 | @noindent
|
|---|
| 370 | gives all users permission to search directories, or to execute files if
|
|---|
| 371 | anyone could execute them before.
|
|---|
| 372 |
|
|---|
| 373 | @node Multiple Changes
|
|---|
| 374 | @subsection Making Multiple Changes
|
|---|
| 375 |
|
|---|
| 376 | @cindex multiple changes to permissions
|
|---|
| 377 | The format of symbolic modes is actually more complex than described
|
|---|
| 378 | above (@pxref{Setting Permissions}). It provides two ways to make
|
|---|
| 379 | multiple changes to files' mode bits.
|
|---|
| 380 |
|
|---|
| 381 | The first way is to specify multiple @var{operation} and
|
|---|
| 382 | @var{permissions} parts after a @var{users} part in the symbolic mode.
|
|---|
| 383 |
|
|---|
| 384 | For example, the mode:
|
|---|
| 385 |
|
|---|
| 386 | @example
|
|---|
| 387 | og+rX-w
|
|---|
| 388 | @end example
|
|---|
| 389 |
|
|---|
| 390 | @noindent
|
|---|
| 391 | gives users other than the owner of the file read permission and, if
|
|---|
| 392 | it is a directory or if someone already had execute permission
|
|---|
| 393 | to it, gives them execute/search permission; and it also denies them write
|
|---|
| 394 | permission to the file. It does not affect the permission that the
|
|---|
| 395 | owner of the file has for it. The above mode is equivalent to
|
|---|
| 396 | the two modes:
|
|---|
| 397 |
|
|---|
| 398 | @example
|
|---|
| 399 | og+rX
|
|---|
| 400 | og-w
|
|---|
| 401 | @end example
|
|---|
| 402 |
|
|---|
| 403 | The second way to make multiple changes is to specify more than one
|
|---|
| 404 | simple symbolic mode, separated by commas. For example, the mode:
|
|---|
| 405 |
|
|---|
| 406 | @example
|
|---|
| 407 | a+r,go-w
|
|---|
| 408 | @end example
|
|---|
| 409 |
|
|---|
| 410 | @noindent
|
|---|
| 411 | gives everyone permission to read the file and removes write
|
|---|
| 412 | permission on it for all users except its owner. Another example:
|
|---|
| 413 |
|
|---|
| 414 | @example
|
|---|
| 415 | u=rwx,g=rx,o=
|
|---|
| 416 | @end example
|
|---|
| 417 |
|
|---|
| 418 | @noindent
|
|---|
| 419 | sets all of the permission bits for the file explicitly. (It
|
|---|
| 420 | gives users who are not in the file's group no permission at all for
|
|---|
| 421 | it.)
|
|---|
| 422 |
|
|---|
| 423 | The two methods can be combined. The mode:
|
|---|
| 424 |
|
|---|
| 425 | @example
|
|---|
| 426 | a+r,g+x-w
|
|---|
| 427 | @end example
|
|---|
| 428 |
|
|---|
| 429 | @noindent
|
|---|
| 430 | gives all users permission to read the file, and gives users who are in
|
|---|
| 431 | the file's group permission to execute/search it as well, but not permission
|
|---|
| 432 | to write to it. The above mode could be written in several different
|
|---|
| 433 | ways; another is:
|
|---|
| 434 |
|
|---|
| 435 | @example
|
|---|
| 436 | u+r,g+rx,o+r,g-w
|
|---|
| 437 | @end example
|
|---|
| 438 |
|
|---|
| 439 | @node Umask and Protection
|
|---|
| 440 | @subsection The Umask and Protection
|
|---|
| 441 |
|
|---|
| 442 | @cindex umask and modes
|
|---|
| 443 | @cindex modes and umask
|
|---|
| 444 | If the @var{users} part of a symbolic mode is omitted, it defaults to
|
|---|
| 445 | @samp{a} (affect all users), except that any permissions that are
|
|---|
| 446 | @emph{set} in the system variable @code{umask} are @emph{not affected}.
|
|---|
| 447 | The value of @code{umask} can be set using the
|
|---|
| 448 | @code{umask} command. Its default value varies from system to system.
|
|---|
| 449 |
|
|---|
| 450 | @cindex giving away permissions
|
|---|
| 451 | Omitting the @var{users} part of a symbolic mode is generally not useful
|
|---|
| 452 | with operations other than @samp{+}. It is useful with @samp{+} because
|
|---|
| 453 | it allows you to use @code{umask} as an easily customizable protection
|
|---|
| 454 | against giving away more permission to files than you intended to.
|
|---|
| 455 |
|
|---|
| 456 | As an example, if @code{umask} has the value 2, which removes write
|
|---|
| 457 | permission for users who are not in the file's group, then the mode:
|
|---|
| 458 |
|
|---|
| 459 | @example
|
|---|
| 460 | +w
|
|---|
| 461 | @end example
|
|---|
| 462 |
|
|---|
| 463 | @noindent
|
|---|
| 464 | adds permission to write to the file to its owner and to other users who
|
|---|
| 465 | are in the file's group, but @emph{not} to other users. In contrast,
|
|---|
| 466 | the mode:
|
|---|
| 467 |
|
|---|
| 468 | @example
|
|---|
| 469 | a+w
|
|---|
| 470 | @end example
|
|---|
| 471 |
|
|---|
| 472 | @noindent
|
|---|
| 473 | ignores @code{umask}, and @emph{does} give write permission for
|
|---|
| 474 | the file to all users.
|
|---|
| 475 |
|
|---|
| 476 | @node Numeric Modes
|
|---|
| 477 | @section Numeric Modes
|
|---|
| 478 |
|
|---|
| 479 | @cindex numeric modes
|
|---|
| 480 | @cindex file mode bits, numeric
|
|---|
| 481 | @cindex octal numbers for file modes
|
|---|
| 482 | As an
|
|---|
| 483 | alternative to giving a symbolic mode, you can give an octal (base 8)
|
|---|
| 484 | number that represents the mode.
|
|---|
| 485 | This number is always interpreted in octal; you do not have to add a
|
|---|
| 486 | leading @samp{0}, as you do in C. Mode @samp{0055} is the same as
|
|---|
| 487 | mode @samp{55}.
|
|---|
| 488 |
|
|---|
| 489 | A numeric mode is usually shorter than the corresponding symbolic
|
|---|
| 490 | mode, but it is limited in that normally it cannot take into account the
|
|---|
| 491 | previous file mode bits; it can only set them absolutely.
|
|---|
| 492 | (As discussed in the next section, the set-user-ID and set-group-ID
|
|---|
| 493 | bits of directories are an exception to this general limitation.)
|
|---|
| 494 |
|
|---|
| 495 | The permissions granted to the user,
|
|---|
| 496 | to other users in the file's group,
|
|---|
| 497 | and to other users not in the file's group each require three
|
|---|
| 498 | bits, which are represented as one octal digit. The three special
|
|---|
| 499 | mode bits also require one bit each, and they are as a group
|
|---|
| 500 | represented as another octal digit. Here is how the bits are arranged,
|
|---|
| 501 | starting with the lowest valued bit:
|
|---|
| 502 |
|
|---|
| 503 | @example
|
|---|
| 504 | Value in Corresponding
|
|---|
| 505 | Mode Mode Bit
|
|---|
| 506 |
|
|---|
| 507 | Other users not in the file's group:
|
|---|
| 508 | 1 Execute/search
|
|---|
| 509 | 2 Write
|
|---|
| 510 | 4 Read
|
|---|
| 511 |
|
|---|
| 512 | Other users in the file's group:
|
|---|
| 513 | 10 Execute/search
|
|---|
| 514 | 20 Write
|
|---|
| 515 | 40 Read
|
|---|
| 516 |
|
|---|
| 517 | The file's owner:
|
|---|
| 518 | 100 Execute/search
|
|---|
| 519 | 200 Write
|
|---|
| 520 | 400 Read
|
|---|
| 521 |
|
|---|
| 522 | Special mode bits:
|
|---|
| 523 | 1000 Restricted deletion flag or sticky bit
|
|---|
| 524 | 2000 Set group ID on execution
|
|---|
| 525 | 4000 Set user ID on execution
|
|---|
| 526 | @end example
|
|---|
| 527 |
|
|---|
| 528 | For example, numeric mode @samp{4755} corresponds to symbolic mode
|
|---|
| 529 | @samp{u=rwxs,go=rx}, and numeric mode @samp{664} corresponds to symbolic mode
|
|---|
| 530 | @samp{ug=rw,o=r}. Numeric mode @samp{0} corresponds to symbolic mode
|
|---|
| 531 | @samp{a=}.
|
|---|
| 532 |
|
|---|
| 533 | @node Directory Setuid and Setgid
|
|---|
| 534 | @section Directories and the Set-User-ID and Set-Group-ID Bits
|
|---|
| 535 |
|
|---|
| 536 | On most systems, if a directory's set-group-ID bit is set, newly
|
|---|
| 537 | created subfiles inherit the same group as the directory, and newly
|
|---|
| 538 | created subdirectories inherit the set-group-ID bit of the parent
|
|---|
| 539 | directory. On a few systems, a directory's set-user-ID bit has a
|
|---|
| 540 | similar effect on the ownership of new subfiles and the set-user-ID
|
|---|
| 541 | bits of new subdirectories. These mechanisms let users share files
|
|---|
| 542 | more easily, by lessening the need to use @command{chmod} or
|
|---|
| 543 | @command{chown} to share new files.
|
|---|
| 544 |
|
|---|
| 545 | These convenience mechanisms rely on the set-user-ID and set-group-ID
|
|---|
| 546 | bits of directories. If commands like @command{chmod} and
|
|---|
| 547 | @command{mkdir} routinely cleared these bits on directories, the
|
|---|
| 548 | mechanisms would be less convenient and it would be harder to share
|
|---|
| 549 | files. Therefore, a command like @command{chmod} does not affect the
|
|---|
| 550 | set-user-ID or set-group-ID bits of a directory unless the user
|
|---|
| 551 | specifically mentions them in a symbolic mode, or sets them in
|
|---|
| 552 | a numeric mode. For example, on systems that support
|
|---|
| 553 | set-group-ID inheritance:
|
|---|
| 554 |
|
|---|
| 555 | @example
|
|---|
| 556 | # These commands leave the set-user-ID and
|
|---|
| 557 | # set-group-ID bits of the subdirectories alone,
|
|---|
| 558 | # so that they retain their default values.
|
|---|
| 559 | mkdir A B C
|
|---|
| 560 | chmod 755 A
|
|---|
| 561 | chmod 0755 B
|
|---|
| 562 | chmod u=rwx,go=rx C
|
|---|
| 563 | mkdir -m 755 D
|
|---|
| 564 | mkdir -m 0755 E
|
|---|
| 565 | mkdir -m u=rwx,go=rx F
|
|---|
| 566 | @end example
|
|---|
| 567 |
|
|---|
| 568 | If you want to try to set these bits, you must mention them
|
|---|
| 569 | explicitly in the symbolic or numeric modes, e.g.:
|
|---|
| 570 |
|
|---|
| 571 | @example
|
|---|
| 572 | # These commands try to set the set-user-ID
|
|---|
| 573 | # and set-group-ID bits of the subdirectories.
|
|---|
| 574 | mkdir G H
|
|---|
| 575 | chmod 6755 G
|
|---|
| 576 | chmod u=rwx,go=rx,a+s H
|
|---|
| 577 | mkdir -m 6755 I
|
|---|
| 578 | mkdir -m u=rwx,go=rx,a+s J
|
|---|
| 579 | @end example
|
|---|
| 580 |
|
|---|
| 581 | If you want to try to clear these bits, you must mention them
|
|---|
| 582 | explicitly in a symbolic mode, e.g.:
|
|---|
| 583 |
|
|---|
| 584 | @example
|
|---|
| 585 | # This command tries to clear the set-user-ID
|
|---|
| 586 | # and set-group-ID bits of the directory D.
|
|---|
| 587 | chmod a-s D
|
|---|
| 588 | @end example
|
|---|
| 589 |
|
|---|
| 590 | This behavior is a @acronym{GNU} extension. Portable scripts should
|
|---|
| 591 | not rely on requests to set or clear these bits on directories, as
|
|---|
| 592 | @acronym{POSIX} allows implementations to ignore these requests.
|
|---|