この記事について
chmodコマンドとは、ファイルやディレクトリの権限を変更するUNIXおよびUNIX系オペレーティングシステムのシェルコマンドのことです。
例えば、下記のコマンドを実行すると、sample.txtの権限を「オーナー以外は読み取り専用」に変更することができます。
chmod 644 sample.txt
今回はこの「644」とはなんぞや!?
どうしてこれで「オーナー以外は読み取り専用」に指定できるの!?
という内容になります。
chmodコマンドには他にもオプションがあったり、数字ではない指定方法もあったりするのですが、
詳しい使い方は他にもたくさんわかりやすい記事があるので、今回は「数字モードで指定する値」にフォーカスを当てて解説していきたいと思います!
なぜ書こうと思ったか
権限の指定はある程度よく使うパターンというのが限られているので、
この指定のときはこの数字(「オーナー以外は読み取り専用」の時は「644」など)、というのを覚えてしまえば理解していなくても使えてしまうのですが、
仕組みを理解しておくと、あまり使わない権限を指定したい時や、これなんだっけ?という時に調べなくても考えることができます!
意外とこの仕組みの部分を説明してくれる記事があまり見つからなかったので、今回書いてみることにしました。
少しでも私のような駆け出しエンジニアの方の参考になれば幸いです!
目次
- そもそもファイルの権限ってどういうもの?
- 権限設定を数字モードで指定する値に変換する
- 2進数から10進数の変換について
- まとめ
そもそもファイルの権限ってどういうもの?
ディレクトリ上でls -laコマンドを叩くとファイルの一覧が表示されると思います。
一番左に表示されている謎の文字列がそのファイルの権限を表しています。
例: drwxr-xrx-
まずはこの謎の文字列について解説していきます。
この文字列は4つの塊に分けることができます。
d rwx r-x r--
1つ目の塊はファイル種別を表しており、
2〜4つ目の塊は誰に対する権限かを表しています。
1つ目の塊(d):ファイル種別
2つ目の塊(rwx):自分に対する権限
3つ目の塊(r-x):グループに対する権限
4つ目の塊(r--):他人に対する権限
1つ目の塊のファイル種別の解説は権限設定に直接関係ないので今回は割愛します。
2〜4つ目の塊についてはさらに3つの値に分割することができます。
rwx
↓
r w x
これはそれぞれ読み(r)、書き(w)、実行(x)の許可を表しており、
許可があればそれぞれのローマ字、なければハイフン( - )を表示しています。
つまり、下記の権限はこう読み解くことができます。
rwxr-xr--
rwx:自分に対して読み、書き、実行を許可
r-x:グループに対して読み、実行を許可
r--:他人に対して読みのみを許可
謎の文字列が表す権限はわかるようになりましたね。
次はこれをchmodの数字モードを用いて3桁の数字で指定したいと思います。
権限設定を数字モードで指定する値に変換する
例に挙げた文字列をchmodの数字モード指定する値に表現するとこうなります。
rwxr-xr--
↓
754
意味がわからないですね。ここからが本題です。
まず謎の文字列を2進数で表現してみます。
許可があれば(ローマ字であれば)1を、許可がなければ(ハイフンであれば)0を立てます。
rwxr-xr--
↓
111101100
これをグループごとに3桁区切りに分けて考えます。
111 101 100
さらにそれぞれグループごとに2進数から10進数に変換します。
111 101 100
↓
7 5 4
あら不思議、3桁の数字ができあがりました!
この値を使って下記のようにコマンドを叩くことでsample.txtの権限を「rwxr-xr--」に変更することができます。
chmod 754 sample.txt
ls -laコマンドでsample.txtの権限が「rwxr-xr--」になっていることを確認できると思います。
2進数から10進数の変換について
ここの部分に関してはまた長くなりますので馴染みのない方は調べてみてください。
二進指数え法というのがとても便利なので併せて覚えると変換が楽にできます。
参考:https://qiita.com/ysda/items/0054584dcd1a9ccb41a2
まとめ
権限の設定を数字モードへ変換する仕組みをまとめると下記になります。
- 先頭1桁を除いた9桁の文字列を2進数に変換する
- 2進数を3桁区切りで3つの塊に分ける
- それぞれの塊を2進数から10進数に変換する
これでいつでもchmodの数字モードで権限が変更できますね。
最後までお読みいただき、ありがとうございました!