File Permissions and Ownership
Each file has access rights associated to it. There are 3 groups of permissions:
- owner/user: the owner of the file .
- group: the group of users who have access.
- world/other: rest of the world.
In the example below:
ls -l /usr/bin/vi
-rw-rw-r-- 1 coop aproject 1601 Mar 9 15:04 a_file
The user is coop and the group is aproject.
Each file also has access right:
r: read access is allowedw: write accessx: execute.-: means that the permission is not allowed on the specific access right.
chmod
A user that owns a file can change it's permissions using chmod (unless root).
For example:
$ ls -l a_file
-rw-rw-r-- 1 coop coop 1601 Mar 9 15:04 a_file
# give user and world execution permission
# remove group write permission
$ chmod uo+x,g-w a_file
$ ls -l a_file
-rwxr--r-x 1 coop coop 1601 Mar 9 15:04 a_file
We can also set permissions using octal digits. The octal number representation is the sum of each digit:
4if the read permission is desired2if the write permission is desired1if the executre permission is desired
# 7 means rwx for user
# 5 means rx for group
# 5 means rx for world
chmod 755 a_file
We can also see the list of permissions in octal:
stat -c "%a %n" a_file
664 file

chown and chgrp
chown is used to change file ownership. chgrp is used to change the group file ownership.
chgrp $some_group /path/to/file
chown $some_user /path/to/file
We can change both the group and user file ownership in one:
chown $some_user:$some_group /path/to/file
# Recursive
chown -R $some_user:$some_group /path/to/dir
umask
umask, or the user file-creation mode, is a Linux command that is used to assign the default file permission sets for newly created folders and files.
When a new file is created, it is created by default with:
touch file
stat -c "%a %n" file
664
When a new directory is created:
mkdir dir
stat -c "%a %n" dir
775 dir
The default value is:
umask
0002
Which means that the created file default permission for world will drop by 2 (666 -> 664) and the directory by 2 (777 -> 775).
We can set it by:
umask 0022
Filesystem Access Control Lists (ACLs)
Linux extends the user/group/world and r/w/x permission model with the full POSIX ACLs.
The ACLs must be implemented in the particular filesystem for them to be available.
Some commands to manage ACLs:
getfacl file|directory
setfacl -m u:$user:rx /home/$user2/file1
# Remove ACL
setfacl -x u:$user /home/$user2/file