| @c File mode bits |
|
|
| @c Copyright (C) 1994 |
|
|
| @c Permission is granted to copy, distribute and/or modify this document |
| @c under the terms of the GNU Free Documentation License, Version 1.3 or |
| @c any later version published by the Free Software Foundation; with no |
| @c Invariant Sections, with no Front-Cover Texts, and with no Back-Cover |
| @c Texts. A copy of the license is included in the ``GNU Free |
| @c Documentation License'' file as part of this distribution. |
|
|
| Each file has a set of @dfn{file mode bits} that control the kinds of |
| access that users have to that file. They can be represented either in |
| symbolic form or as an octal number. |
|
|
| @menu |
| * Mode Structure:: Structure of file mode bits. |
| * Symbolic Modes:: Mnemonic representation of file mode bits. |
| * Numeric Modes:: File mode bits as octal numbers. |
| * Operator Numeric Modes:: ANDing, ORing, and setting modes octally. |
| * Directory Setuid and Setgid:: Set-user-ID and set-group-ID on directories. |
| @end menu |
|
|
| @node Mode Structure |
| @section Structure of File Mode Bits |
|
|
| The file mode bits have two parts: the @dfn{file permission bits}, |
| which control ordinary access to the file, and @dfn{special mode |
| bits}, which affect only some files. |
|
|
| There are three kinds of permissions that a user can have for a file: |
|
|
| @enumerate |
| @item |
| @cindex read permission |
| permission to read the file. For directories, this means permission to |
| list the contents of the directory. |
| @item |
| @cindex write permission |
| permission to write to (change) the file. For directories, this means |
| permission to create and remove files in the directory. |
| @item |
| @cindex execute/search permission |
| permission to execute the file (run it as a program). For directories, |
| this means permission to access files in the directory. |
| @end enumerate |
|
|
| There are three categories of users who may have different permissions |
| to perform any of the above operations on a file: |
|
|
| @enumerate |
| @item |
| the file's owner; |
| @item |
| other users who are in the file's group; |
| @item |
| everyone else. |
| @end enumerate |
|
|
| @cindex owner, default |
| @cindex group owner, default |
| Files are given an owner and group when they are created. Usually the |
| owner is the current user and the group is the group of the directory |
| the file is in, but this varies with the operating system, the |
| file system the file is created on, and the way the file is created. You |
| can change the owner and group of a file by using the @command{chown} and |
| @command{chgrp} commands. |
|
|
| In addition to the three sets of three permissions listed above, the |
| file mode bits have three special components, which affect only |
| executable files (programs) and, on most systems, directories: |
|
|
| @table @asis |
| @item The @dfn{set-user-ID bit} (@dfn{setuid bit}). |
| @cindex set-user-ID |
| @cindex setuid |
| On execution, set the process's effective user ID to that of the file. |
| For directories on a few systems, give files created in the directory |
| the same owner as the directory, no matter who creates them, and set |
| the set-user-ID bit of newly-created subdirectories. |
|
|
| @item The @dfn{set-group-ID bit} (@dfn{setgid bit}). |
| @cindex set-group-ID |
| @cindex setgid |
| On execution, set the process's effective group ID to that of the file. |
| For directories on most systems, give files created in the directory |
| the same group as the directory, no matter what group the user who |
| creates them is in, and set the set-group-ID bit of newly-created |
| subdirectories. |
|
|
| @item The @dfn{restricted deletion flag} or @dfn{sticky bit}. |
| @cindex sticky |
| @cindex swap space, saving text image in |
| @cindex text image, saving in swap space |
| @cindex restricted deletion flag |
| Prevent unprivileged users from removing or renaming a file in a directory |
| unless they own the file or the directory; this is commonly |
| found on world-writable directories like @file{/tmp}. |
| For regular files on some older systems, save the program's text image on the |
| swap device so it will load more quickly when run, so that the image |
| is ``sticky''. |
| @end table |
|
|
| In addition to the file mode bits listed above, there may be file attributes |
| specific to the file system, e.g., access control lists (ACLs), whether a |
| file is compressed, whether a file can be modified (immutability), and whether |
| a file can be dumped. These are usually set using programs |
| specific to the file system. For example: |
| @c should probably say a lot more about ACLs... someday |
|
|
| @table @asis |
| @item ext2 |
| On GNU and GNU/Linux the file attributes specific to |
| the ext2 file system are set using @command{chattr}. |
|
|
| @item FFS |
| On FreeBSD the file flags specific to the FFS |
| file system are set using @command{chflags}. |
| @end table |
|
|
| Even if a file's mode bits allow an operation on that file, |
| that operation may still fail, because: |
|
|
| @itemize |
| @item |
| the file-system-specific attributes or flags do not permit it; or |
|
|
| @item |
| the file system is mounted as read-only. |
| @end itemize |
|
|
| For example, if the immutable attribute is set on a file, |
| it cannot be modified, regardless of the fact that you |
| may have just run @code{chmod a+w FILE}. |
|
|
| @node Symbolic Modes |
| @section Symbolic Modes |
|
|
| @cindex symbolic modes |
| @dfn{Symbolic modes} represent changes to files' mode bits as |
| operations on single-character symbols. They allow you to modify either |
| all or selected parts of files' mode bits, optionally based on |
| their previous values, and perhaps on the current @code{umask} as well |
| (@pxref{Umask and Protection}). |
|
|
| The format of symbolic modes is: |
|
|
| @example |
| @r{[}ugoa@dots{}@r{][}-+=@r{]}@var{perms}@dots{}@r{[},@dots{}@r{]} |
| @end example |
|
|
| @noindent |
| where @var{perms} is either zero or more letters from the set |
| @samp{rwxXst}, or a single letter from the set @samp{ugo}. |
|
|
| The following sections describe the operators and other details of |
| symbolic modes. |
|
|
| @menu |
| * Setting Permissions:: Basic operations on permissions. |
| * Copying Permissions:: Copying existing permissions. |
| * Changing Special Mode Bits:: Special mode bits. |
| * Conditional Executability:: Conditionally affecting executability. |
| * Multiple Changes:: Making multiple changes. |
| * Umask and Protection:: The effect of the umask. |
| @end menu |
|
|
| @node Setting Permissions |
| @subsection Setting Permissions |
|
|
| The basic symbolic operations on a file's permissions are adding, |
| removing, and setting the permission that certain users have to read, |
| write, and execute or search the file. These operations have the following |
| format: |
|
|
| @example |
| @var{users} @var{operation} @var{permissions} |
| @end example |
|
|
| @noindent |
| The spaces between the three parts above are shown for readability only; |
| symbolic modes cannot contain spaces. |
|
|
| The @var{users} part tells which users' access to the file is changed. |
| It consists of one or more of the following letters (or it can be empty; |
| @pxref{Umask and Protection}, for a description of what happens then). When |
| more than one of these letters is given, the order that they are in does |
| not matter. |
|
|
| @table @code |
| @item u |
| @cindex owner of file, permissions for |
| the user who owns the file; |
| @item g |
| @cindex group, permissions for |
| other users who are in the file's group; |
| @item o |
| @cindex other permissions |
| all other users; |
| @item a |
| all users; the same as @samp{ugo}. |
| @end table |
|
|
| The @var{operation} part tells how to change the affected users' access |
| to the file, and is one of the following symbols: |
|
|
| @table @code |
| @item + |
| @cindex adding permissions |
| to add the @var{permissions} to whatever permissions the @var{users} |
| already have for the file; |
| @item - |
| @cindex removing permissions |
| @cindex subtracting permissions |
| to remove the @var{permissions} from whatever permissions the |
| @var{users} already have for the file; |
| @item = |
| @cindex setting permissions |
| to make the @var{permissions} the only permissions that the @var{users} |
| have for the file. |
| @end table |
|
|
| The @var{permissions} part tells what kind of access to the file should |
| be changed; it is normally zero or more of the following letters. As with the |
| @var{users} part, the order does not matter when more than one letter is |
| given. Omitting the @var{permissions} part is useful only with the |
| @samp{=} operation, where it gives the specified @var{users} no access |
| at all to the file. |
|
|
| @table @code |
| @item r |
| @cindex read permission, symbolic |
| the permission the @var{users} have to read the file; |
| @item w |
| @cindex write permission, symbolic |
| the permission the @var{users} have to write to the file; |
| @item x |
| @cindex execute/search permission, symbolic |
| the permission the @var{users} have to execute the file, |
| or search it if it is a directory. |
| @end table |
|
|
| For example, to give everyone permission to read and write a regular file, |
| but not to execute it, use: |
|
|
| @example |
| a=rw |
| @end example |
|
|
| To remove write permission for all users other than the file's |
| owner, use: |
|
|
| @example |
| go-w |
| @end example |
|
|
| @noindent |
| The above command does not affect the access that the owner of |
| the file has to it, nor does it affect whether other users can |
| read or execute the file. |
|
|
| To give everyone except a file's owner no permission to do anything with |
| that file, use the mode below. Other users could still remove the file, |
| if they have write permission on the directory it is in. |
|
|
| @example |
| go= |
| @end example |
|
|
| @noindent |
| Another way to specify the same thing is: |
|
|
| @example |
| og-rwx |
| @end example |
|
|
| @node Copying Permissions |
| @subsection Copying Existing Permissions |
|
|
| @cindex copying existing permissions |
| @cindex permissions, copying existing |
| You can base a file's permissions on its existing permissions. To do |
| this, instead of using a series of @samp{r}, @samp{w}, or @samp{x} |
| letters after the |
| operator, you use the letter @samp{u}, @samp{g}, or @samp{o}. For |
| example, the mode |
|
|
| @example |
| o+g |
| @end example |
|
|
| @noindent |
| adds the permissions for users who are in a file's group to the |
| permissions that other users have for the file. Thus, if the file |
| started out as mode 664 (@samp{rw-rw-r |
| it to mode 666 (@samp{rw-rw-rw-}). If the file had started out as mode |
| 741 (@samp{rwxr |
| (@samp{rwxr |
| analogously. |
|
|
| @node Changing Special Mode Bits |
| @subsection Changing Special Mode Bits |
|
|
| @cindex changing special mode bits |
| In addition to changing a file's read, write, and execute/search permissions, |
| you can change its special mode bits. @xref{Mode Structure}, for a |
| summary of these special mode bits. |
|
|
| To change the file mode bits to set the user ID on execution, use |
| @samp{u} in the @var{users} part of the symbolic mode and |
| @samp{s} in the @var{permissions} part. |
|
|
| To change the file mode bits to set the group ID on execution, use |
| @samp{g} in the @var{users} part of the symbolic mode and |
| @samp{s} in the @var{permissions} part. |
|
|
| To set both user and group ID on execution, omit the @var{users} part |
| of the symbolic mode (or use @samp{a}) and use @samp{s} in the |
| @var{permissions} part. |
|
|
| To change the file mode bits to set the restricted deletion flag or sticky bit, |
| omit the @var{users} part of the symbolic mode (or use @samp{a}) and use |
| @samp{t} in the @var{permissions} part. |
|
|
| For example, to set the set-user-ID mode bit of a program, |
| you can use the mode: |
|
|
| @example |
| u+s |
| @end example |
|
|
| To remove both set-user-ID and set-group-ID mode bits from |
| it, you can use the mode: |
|
|
| @example |
| a-s |
| @end example |
|
|
| To set the restricted deletion flag or sticky bit, you can use |
| the mode: |
|
|
| @example |
| +t |
| @end example |
|
|
| The combination @samp{o+s} has no effect. On GNU systems |
| the combinations @samp{u+t} and @samp{g+t} have no effect, and |
| @samp{o+t} acts like plain @samp{+t}. |
|
|
| The @samp{=} operator is not very useful with special mode bits. |
| For example, the mode: |
|
|
| @example |
| o=t |
| @end example |
|
|
| @noindent |
| does set the restricted deletion flag or sticky bit, but it also |
| removes all read, write, and execute/search permissions that users not in the |
| file's group might have had for it. |
|
|
| @xref{Directory Setuid and Setgid}, for additional rules concerning |
| set-user-ID and set-group-ID bits and directories. |
|
|
| @node Conditional Executability |
| @subsection Conditional Executability |
|
|
| @cindex conditional executability |
| There is one more special type of symbolic permission: if you use |
| @samp{X} instead of @samp{x}, execute/search permission is affected only if the |
| file is a directory or already had execute permission. |
|
|
| For example, this mode: |
|
|
| @example |
| a+X |
| @end example |
|
|
| @noindent |
| gives all users permission to search directories, or to execute files if |
| anyone could execute them before. |
|
|
| @node Multiple Changes |
| @subsection Making Multiple Changes |
|
|
| @cindex multiple changes to permissions |
| The format of symbolic modes is actually more complex than described |
| above (@pxref{Setting Permissions}). It provides two ways to make |
| multiple changes to files' mode bits. |
|
|
| The first way is to specify multiple @var{operation} and |
| @var{permissions} parts after a @var{users} part in the symbolic mode. |
|
|
| For example, the mode: |
|
|
| @example |
| og+rX-w |
| @end example |
|
|
| @noindent |
| gives users other than the owner of the file read permission and, if |
| it is a directory or if someone already had execute permission |
| to it, gives them execute/search permission; and it also denies them write |
| permission to the file. It does not affect the permission that the |
| owner of the file has for it. The above mode is equivalent to |
| the two modes: |
|
|
| @example |
| og+rX |
| og-w |
| @end example |
|
|
| The second way to make multiple changes is to specify more than one |
| simple symbolic mode, separated by commas. For example, the mode: |
|
|
| @example |
| a+r,go-w |
| @end example |
|
|
| @noindent |
| gives everyone permission to read the file and removes write |
| permission on it for all users except its owner. Another example: |
|
|
| @example |
| u=rwx,g=rx,o= |
| @end example |
|
|
| @noindent |
| sets all of the permission bits for the file explicitly. (It |
| gives users who are not in the file's group no permission at all for |
| it.) |
|
|
| The two methods can be combined. The mode: |
|
|
| @example |
| a+r,g+x-w |
| @end example |
|
|
| @noindent |
| gives all users permission to read the file, and gives users who are in |
| the file's group permission to execute/search it as well, but not permission |
| to write to it. The above mode could be written in several different |
| ways; another is: |
|
|
| @example |
| u+r,g+rx,o+r,g-w |
| @end example |
|
|
| @node Umask and Protection |
| @subsection The Umask and Protection |
|
|
| @cindex umask and modes |
| @cindex modes and umask |
| If the @var{users} part of a symbolic mode is omitted, it defaults to |
| @samp{a} (affect all users), except that any permissions that are |
| @emph{set} in the system variable @code{umask} are @emph{not affected}. |
| The value of @code{umask} can be set using the |
| @code{umask} command. Its default value varies from system to system. |
|
|
| @cindex giving away permissions |
| Omitting the @var{users} part of a symbolic mode is generally not useful |
| with operations other than @samp{+}. It is useful with @samp{+} because |
| it allows you to use @code{umask} as an easily customizable protection |
| against giving away more permission to files than you intended to. |
|
|
| As an example, if @code{umask} has the value 2, which removes write |
| permission for users who are not in the file's group, then the mode: |
|
|
| @example |
| +w |
| @end example |
|
|
| @noindent |
| adds permission to write to the file to its owner and to other users who |
| are in the file's group, but @emph{not} to other users. In contrast, |
| the mode: |
|
|
| @example |
| a+w |
| @end example |
|
|
| @noindent |
| ignores @code{umask}, and @emph{does} give write permission for |
| the file to all users. |
|
|
| @node Numeric Modes |
| @section Numeric Modes |
|
|
| @cindex numeric modes |
| @cindex file mode bits, numeric |
| @cindex octal numbers for file modes |
| As an |
| alternative to giving a symbolic mode, you can give an octal (base 8) |
| number that represents the mode. |
|
|
| The permissions granted to the user, |
| to other users in the file's group, |
| and to other users not in the file's group each require three |
| bits: one bit for read, one for write, and one for execute/search permission. |
| These three bits are represented as one octal digit; |
| for example, if all three are present, the resulting 111 (in binary) |
| is represented as the digit 7 (in octal). The three special |
| mode bits also require one bit each, and they are as a group |
| represented as another octal digit. Here is how the bits are arranged, |
| starting with the highest valued bit: |
|
|
| @example |
| Value in Corresponding |
| Mode Mode Bit |
|
|
| Special mode bits: |
| 4000 Set user ID |
| 2000 Set group ID |
| 1000 Restricted deletion flag or sticky bit |
|
|
| The file's owner: |
| 400 Read |
| 200 Write |
| 100 Execute/search |
|
|
| Other users in the file's group: |
| 40 Read |
| 20 Write |
| 10 Execute/search |
|
|
| Other users not in the file's group: |
| 4 Read |
| 2 Write |
| 1 Execute/search |
| @end example |
|
|
| For example, numeric mode @samp{4751} corresponds to symbolic mode |
| @samp{u=srwx,g=rx,o=x}, and numeric mode @samp{664} corresponds to symbolic mode |
| @samp{ug=rw,o=r}. Numeric mode @samp{0} corresponds to symbolic mode |
| @samp{a=}. |
|
|
| A numeric mode is usually shorter than the corresponding symbolic |
| mode, but it is limited in that normally it cannot take into account the |
| previous file mode bits; it can only set them absolutely. |
| The set-user-ID and set-group-ID bits of directories are an exception |
| to this general limitation. @xref{Directory Setuid and Setgid}. |
| Also, operator numeric modes can take previous file mode bits into |
| account. @xref{Operator Numeric Modes}. |
|
|
| Numeric modes are always interpreted in octal; you do not have to add a |
| leading @samp{0}, as you do in C@. Mode @samp{0055} is the same as |
| mode @samp{55}. However, modes of five digits or more, such as |
| @samp{00055}, are sometimes special (@pxref{Directory Setuid and Setgid}). |
|
|
| @node Operator Numeric Modes |
| @section Operator Numeric Modes |
|
|
| An operator numeric mode is a numeric mode that is prefixed by a |
| @samp{-}, @samp{+}, or @samp{=} operator, which has the same |
| interpretation as in symbolic modes. For example, @samp{+440} enables |
| read permission for the file's owner and group, @samp{-1} disables |
| execute permission for other users, and @samp{=600} clears all |
| permissions except for enabling read-write permissions for the file's |
| owner. Operator numeric modes can be combined with symbolic modes by |
| separating them with a comma; for example, @samp{=0,u+r} clears all |
| permissions except for enabling read permission for the file's owner. |
|
|
| The commands @samp{chmod =755 @var{dir}} and @samp{chmod 755 |
| @var{dir}} differ in that the former clears the directory @var{dir}'s |
| setuid and setgid bits, whereas the latter preserves them. |
| @xref{Directory Setuid and Setgid}. |
|
|
| Operator numeric modes are a GNU extension. |
|
|
| @node Directory Setuid and Setgid |
| @section Directories and the Set-User-ID and Set-Group-ID Bits |
|
|
| On most systems, if a directory's set-group-ID bit is set, newly |
| created subfiles inherit the same group as the directory, and newly |
| created subdirectories inherit the set-group-ID bit of the parent |
| directory. On a few systems, a directory's set-user-ID bit has a |
| similar effect on the ownership of new subfiles and the set-user-ID |
| bits of new subdirectories. These mechanisms let users share files |
| more easily, by lessening the need to use @command{chmod} or |
| @command{chown} to share new files. |
|
|
| These convenience mechanisms rely on the set-user-ID and set-group-ID |
| bits of directories. If commands like @command{chmod} and |
| @command{mkdir} routinely cleared these bits on directories, the |
| mechanisms would be less convenient and it would be harder to share |
| files. Therefore, a command like @command{chmod} does not affect the |
| set-user-ID or set-group-ID bits of a directory unless the user |
| specifically mentions them in a symbolic mode, or uses an operator |
| numeric mode such as @samp{=755}, or sets them in a numeric mode, or |
| clears them in a numeric mode that has five or more octal digits. |
| For example, on systems that support |
| set-group-ID inheritance: |
|
|
| @example |
| |
| |
| |
| 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 |
| @end example |
|
|
| If you want to try to set these bits, you must mention them |
| explicitly in the symbolic or numeric modes, e.g.: |
|
|
| @example |
| |
| |
| 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 |
| @end example |
|
|
| If you want to try to clear these bits, you must mention them |
| explicitly in a symbolic mode, or use an operator numeric mode, or |
| specify a numeric mode with five or more octal digits, e.g.: |
|
|
| @example |
| |
| |
| chmod a-s D |
| chmod -6000 D |
| chmod =755 D |
| chmod 00755 D |
| @end example |
|
|
| This behavior is a GNU extension. Portable scripts should |
| not rely on requests to set or clear these bits on directories, as |
| POSIX allows implementations to ignore these requests. |
| The GNU behavior with numeric modes of four or fewer digits |
| is intended for scripts portable to systems that preserve these bits; |
| the behavior with numeric modes of five or more digits is for scripts |
| portable to systems that do not preserve the bits. |
|
|