Ever have a file you can’t do anything with? Can’t change it, can’t delete it, can’t even look at it? We’re going to find out why.
FreeBSD, and by extension, OS X (which is loosely based on FreeBSD), uses file permissions. This lets the system control access to files and directories by different users. Would you want another user looking at your files? Of course not. Permissions determine who can access any file or directory and whether it can be edited or deleted.
There are three types of access for a file:
Read: You can view the file, and only that.
Write: You can edit or change the file. You can also delete the file.
Execute: You can ‘run’ the file if it’s a binary or application. Shell scripts must have this bit set to run.
These are used to determine access for owners, groups, and everyone else. A group is a collection of users on the system. For example, the Wheel group would be users which are administrators on the system. A user can belong to several groups or only one, depending on what the admin sets it to.
If you do a long-list (ls -l) on your user directory you will see something like this:
craig@zinger:~$ ls -l total 5656 drwxr-xr-x 28 craig staff 952 Oct 14 15:52 Applications drwx------@ 5 craig staff 170 Nov 2 21:34 Desktop drwxr--r--@ 257 craig staff 8738 Nov 2 22:25 Documents drwx------@ 32 craig staff 1088 Nov 4 13:24 Downloads drwx------@ 13 craig staff 442 Nov 2 21:34 Dropbox -rw-r--r--@ 1 craig staff 1167 Oct 26 15:43 Folder Action Script.rtf drwx------@ 82 craig staff 2788 Oct 23 17:44 Library drwxr-xr-x 118 craig staff 4012 Oct 27 17:37 Manuals drwxr-xr-x@ 8 craig staff 272 Jul 23 2007 Maps
Lets break the permissions down by looking at the first column. The first character, d, means it’s a directory. The – means it’s a file. Next you have nine characters following this, each of which can be one of four characters: –, r, w, x. These are arranged into triplets (groups of three). The first set are for the owner, the second are for the group, and the third are everyone else. The @ on the end is the ACL (Access Control List) which I won’t go into because I don’t think I really understand it that well myself (but I’m working on it!). You’ll notice not all the letters are set with a letter (r/w/x). If, for example, the r/w/x is not there (there is a – instead), that means the attribute is denied, or you can’t write/read the file.
Let’s look at an example to clarify this. In the list above, let’s explore the Desktop directory (d). I can read, write, and execute (rwx) it, and no one else can since the first triplet after the d has rwx and everything else is a dash. In Finder, they can’t even look in it. Ever come across a folder with a red and white circle with a line in it? Try looking in it. You can’t. If you have more than one user on your computer, you can’t look into others folders unless they change the permissions.
The execute bit is slightly different for directories than regular files. In order to list a directory, the read bit must be set. In order to delete a file in it, the execute bit must be set. On files, the execute bit means the file can be run, as in the case of shell scripts, or applications.
If you are the owner of the file you can change the attributes with the chmod command. chmod stands for change mode, or change the access. There are two ways to change permissions using the chmod tool: using switches, or using octal numbers.
The chmod command has several switches. It’s syntax looks like this:
$ chmod [who] [operator] [permission] file
The [who] is used to specify which users the permissions apply to.
u user the owner of the file g group users who are members of the file's group o others everyone else a all everyone - same as ugo
The [operator] specifies how the modes should be changed.
+ adds the mode to the specified class - removes the mode from the specified class = the modes specified are to be made exact for the class
There are three basic permissions. These are:
r Read w Write x Execute
For example, if I wanted to give access to my Desktop folder to others in my group I would change the access:
craig@zinger:~$ chmod g+rwx Desktop
This would give everyone in my group, in my case ‘staff’, read, write and execute permission to my Desktop folder.
There are other types of permissions which are more advanced. If you are interested check the man pages (man chmod).
For some, it may be easier to use numbers (letter combinations can sometimes be cryptic). Each set of attributes can be expressed as a number, depending on which bits are set. Using the table below you can change the permissions for each user/group.
Value Permission Directory Listing 0 No read, no write, no execute --- 1 No read, no write, execute --x 2 No read, write, no execute -w- 3 No read, write, execute -wx 4 Read, no write, no execute r-- 5 Read, no write, execute r-x 6 Read, write, no execute rw- 7 Read, write, execute rwx
The normal permissions on commands available to most users in Terminal , 755, would be:
rwxr-xr-x or rwx r-x r-x
Which would give the owner, the system, all permissions, and everyone else read/execute permission. This is so that the commands are available to users but cannot be changed or deleted so that other users can use them.
Lets say you have a folder you don’t want anyone to look into. You can change the permissions so no one can view or move the folder. In this case the command would be:
craig@zinger:~$ chmod 700 foldername 7 0 0 rwx --- ---
The 7 means you can read, write, execute the file but the two zeros mean no one else can do anything with it.
Note: if you set permissions on a file, remember the file is in a directory. If no one can enter the directory, they can’t read the file. You need to make sure it is in a place where others have access.
You can’t go around changing permissions on whatever you feel like. Some files or directories are not meant to be messed with (system files especially). The system expects certain files to have certain permissions and sometimes complains when they are different. You might need to occasionally open Disk Utilities and do a Repair Permissions. What this does is reset the system installed files to their original access states. This sometimes fixes small problems with the smooth running of the system but it certainly isn’t a fix all.