The chmod Command

Do you know how to rename a file you
can't read? Better yet, do you know how other users can rename your
files? Have you ever ftp'd a program from another host and been
unable to run it?

The subject of file permissions, and how to manipulate them
with the chmod command, is a good
place to start learning about these situations.

First, let's create a file and examine its long listing. (In
order to fit in the magazine, all the listings in this article are
trimmed to fit.)

$ touch test_file
$ ls -l test_file
-rw-rw-r-- 1 eric users

Since I created this file, it makes sense that the third
column shows my user name as the file's owner and that the fourth
shows my group. (On some systems, the group name may be the same as
the user name.) As you follow along in these examples, you will see
your username in place of “eric”.

The leftmost column of the directory listing shows the file's
mode. Mode is the term used to
refer to a file's permissions. ls displays the file's type and mode
together as a grouping of ten one-character fields:

Type

Owner

Group

World

-

rwx

rw-

r--

The type field has several valid values. For the sake of this
tutorial, we are only concerned with two: empty
(-) for a regular file, and d
for directories.

The other three columns cover the three
classes of access that are stored
for each file in a Unix-like file system. Linux (and Unix)
evaluates access in terms of user ownership, group ownership and
world (or other).

For each of these classes, rights are evaluated in terms of
three operations: reading
(r), writing (w) and
executing (x). The permissions above specify
“full” access for the owner, reading and writing for group, and
only reading for world (an unusual combination used for
demonstration). Those permissions specify that

The owner of the file is allowed to read, write and
execute the file.

Any user who is a member of the group that owns the
file is permitted to write to the file.

Any other user can only read the file.

Changing permissions

If test_file were a very important document that we did not
want anyone to be able to modify or delete, we would need to remove
write access from group:

$ chmod g-w test_file
$ ls -l test_file
-rw-r--r-- 1 eric users

We see that the w for group is now
replaced with a -, signifying that write
permission is denied to members of the group
users.

If test_file contained sensitive information that only
members of the group users should be able to
review:

$ chmod o-r test_file
$ ls -l test_file
-rw-r----- 1 eric users

Now we see that the last triplet of the mode field, which
specifies permissions for world, are all dashes. This means that
other users who do not belong to the users group
have no permissions to do anything with test_file whatsoever.

The command line usage for chmod mode looks like this:

chmod [options] new-modefilename

The new mode is specified in octal
mode or symbolic mode.
We'll cover symbolic mode first. In the first example we used
g-w to remove write permission for group. As you
might be able to guess, g stood for group,
- for remove and w
represented write permission.

We are not able to display the file's contents because we do
not have read access to our own file. When we specified
u-rwx to chmod, we removed all access for the
user (the file's owner). We were also denied permission when we
attempted to add the contents of another file to it since we
removed write access. (I should note that
rm would still be able to delete
this file, although it will normally request confirmation.)

$ chmod u+rwx test_file
$ ls -l test_file
-rwxrwx--- 1 eric users

When we specify u+rwx, all permissions are
restored. Removing permissions from a file we own does not affect
our ability to restore the permissions, because the mode is
not stored in the file. It is
stored in a structure called an inode entry. Only the owner of the
file (and root) may modify this.