Change Mode

Reading time ~3 minutes

You may not share my excitement at this, but if you are someone for whom CLI, UNIX and/or binary have been some sort of enigma at any point, then you may at least have some sympathy for me.

In the previous post I went through how I made file executable for the first time, by using chmod command. Taking one step at a time, I did it the boring way as it didn't require additional explanation... Now, I want to look at the more fun version of it which uses binary!

This is the command I looked at last time:

chmod a+x bin/mastermind

If mt current permissions are:

-rw-r--r--  1 Jarkyn  staff  312 12 Mar 15:30 mastermind
(You may want to refer to the detailed breakdown of this output here)

Running the above chmod command would change them to the following:

👻  mastermind [master] ⚡ ls -l bin
-rwxr-xr-x  1 Jarkyn    staff    312    12 Mar 15:40   mastermind

Which means that we added ability to execute mastermind file to all user types. Lets rewind this change by running the opposite of "+" command:

chmod a-x bin/mastermind

This would take away ability to execute from all the user types and we are back to:

-rw-r--r--  1 Jarkyn  staff  312 12 Mar 15:50 mastermind

Next, we will put ability to execute back fot all user types, but this time instead of cmod a+x we will use:

chmod 755 <file_path>

Running it would bring us back to

-rwxr-xr-x  1 Jarkyn    staff    312    12 Mar 16:02   mastermind

So this code 755 seems to be doing the magic, lets see how it's doing it. First, let's look at those permissions:

rwx r-x r-x

We can think of those as switches for a specific permission in each group:

on on on    on off on    on off on

And taking it step further we can represent this as binary switches: 1 means on, 0 means off.

111 101 101

Now, if we convert each one to the decimal:

  111 => 7
  101 => 5
  101 => 5

And this is why we can say:

chmod 755 <file_path>

As you imagine there will be a number of permutations representing whether each r/w/x is on or off

--- => 000 => 0 => NO read write or execute

--x => 001 => 1 => Execute (because last bit set to 1)

-w- => 010 => 2 => Write (because middle bit set to 1)

-wx => 011 => 3 => Write,Execute (because last 2 bits set to 1)

r-- => 100 => 4 => Read (because first bit set to 1)

r-x => 101 => 5 => Read,Execute (because first and last bits set to 1)

rw- => 110 => 6 => Read,Write (because first and second bits set to 1)

rwx => 111 => 7 => Read, Write, Execute (because all bits set to 1)

Say you wanted following permissions for a file:

rwx r-- --x

This is how the command would look like:

chmod 741 <file_path>

That's it, no magic and no more mystery! Which brings me to the end of this geek out session, hope you found it useful!

Express blog posting

Published on June 05, 2015

Micah's cohort

Published on May 27, 2015