TL;DR
linuxでパーミッションを変更したい場合数字で指定することが多いですよね。
でもエンジニアなりたての人等は、パーミッションの意味は理解してても、パーミッションの数字については訳分からん状態だと思います。
例えば↓とか
777 (rwxrwxrwx)
755 (rwxr-xr-x)
744 (rwxr--r--)
644 (rw-r--r--)
( ゚Д゚)ハァ?
って感じですよね。
そんな人でもビット演算の方法を学べば、パーミッションの数字が理解できます!
ビット演算とは?
ざっくり言うと2進数の計算です。
2進数って?
0
と1
で表す数字です。
例えば10進数の0~9
を2進数で表す場合は以下
10進数 | 2進数 |
---|---|
0 | 0 |
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
8 | 1000 |
9 | 1001 |
2進数の法則
上の表でお気づきの方もいるかと思いますが、2進数にはある法則があります。
それは 2の累乗は一番左の値のみ1になり、0が1つずつ増えていく というものです。
例えば上の表から2の累乗を抜き出したものが以下の表
10進数 | 2進数 |
---|---|
2 | 10 |
4 | 100 |
8 | 1000 |
位が1つずつ増えてますよね。
ビット演算の方法
ビット演算ではこの2の累乗を基準に計算をします。
例えば以下の2進数があったとします。
1111
これを10進数に直す計算として、まずは分かりやすく2進数を分解してみます。
# 頭の0は計算に関係ありません。桁数をそろえるために分かりやすくしています。
1000
0100
0010
0001
それぞれを10進数に直すと
1000 => 8
0100 => 4
0010 => 2
0001 => 1
ですね。
あとは10進数に直した数字を足すと……
1 1 1 1 ←2進数
8 4 2 1 ←10進数
となり1111
は15
ということが分かります。
で、それが何になるんや?
はい、本題はlinuxパーミッションの数字の意味でしたね。
linuxのパーミッションはrwx
で表されます。
これはある言葉の一文字を取ったものです。
文字 | 意味 |
---|---|
r | read(読み込み) |
w | write(書き込み) |
x | exec(実行) |
ls -al
でディレクトリをのぞいてみると、drwxrw-r-x
みたいな文字が左部にあると思います。
全部つながっているので分かりづらいですが、区切るとこんな感じ。
d/rwx/rw-/r-x
文字 | 意味 |
---|---|
d | ディレクトリを表す(ファイルなら- ) |
rwx | rootのパーミッション |
rw- | グループのパーミッション |
r-x | その他ユーザーのパーミッション |
※rootやグループ等のパーミッション範囲については割愛します。
先ほどからちらほら出ていますが、-
という表記がありますよね?
これはパーミッションがない状態を表しています。
そして実はこれ、2進数を表しています。
各パーミッションがついている状態を2進数で表すと
パーミッション | 2進数 | 10進数 |
---|---|---|
r-- | 100 | 4 |
-w- | 010 | 2 |
--x | 001 | 1 |
ここまで見ていただいた方はピンときたのではないでしょうか。
そうです、chmod
では2進数を使い、パーミッションを指定しているのです。
例えば、rootに全権限を持たせる場合はrwx => 4 + 2 + 1
で7
。
その他ユーザーには読み込み権限だけ与える場合はr-- => 4 + 0 + 0
で4
となります。
最後に
慣れるまでは、rwx
は2進数で111
、r-x
は2進数で101
という風に変換し、あとはビット演算で計算する、という風にビット演算で慣れつつもパーミッションの数字を覚えてもらえればと思います。