【Linux】シェルスクリプトファイル実行権限付与が Chmod 755 (ファイル名)な理由を権限周りの基礎から解説

##はじめに
どうも、未経験からエンジニア転職を目指しているもきおです。

Linuxにおいて、シェルスクリプトファイルの実行権限を事前に付与させないとファイルを実行する際に(今回は分かりやすいように適当に名前を付けたkengen.shというシェルスクリプトファイルを実行しています)

``` bash 
$ ./kengen.sh
-bash: ./kengen.sh: Permission denied
```
実行権限がないんで実行できませんよって言われます。

そこでGoogle先生の出番です。
実行権限付与するコマンドを調べた結果、Chmod 755 (ファイル名)で権限付与できるとのこと。
そんな簡単なのね、ひゃっフォー！という勢いでそのまま調べたものを活用。

``` bash 
$ chmod 755 kengen.sh
$ ./kengen.sh
$ Hello ← 実行結果
```

無事実行でき、シェルスクリプトファイルに記載していたHelloを表示させることができました。
しかしここでなんで実行権限付与が755なんだ？と思うようになりました。

そこでLinuxの実行権限を改めて学習しなおしたので、この記事に書き記しておきたいと思います。

シェルスクリプトに関してはこちらの記事を読めば理解できてくると思うのでこちらも併せてお読みいただけますと幸いです。

https://qiita.com/mokio/items/ab7951f7c9650b499351

##こんな人に読んで欲しい
・Linuxコマンドについて学び始めた方
・Linuxを実務レベルで今後使っていきたい方

##そもそもなんで実行権限が必要になるの？
なぜLinuxにおいて実行権限が必要になるのでしょうか？

それはそもそもLinuxは**一つのマシンへ複数のユーザーが同時にログインして操作することを前提として作られている**ためです。開発はチームでやるのが基本なのでLinuxもそこら辺を考慮して作られているわけなんですね。

まぁ当たり前のことではありますが、個人開発をしているとそこら辺を考慮して作成することが意外とできないもんですよね。

##まずは実行権限を確認してみる
さて、話は戻りまずはファイルの実行権限を確認してみましょう。
権限確認は**ls -l (ファイル名)**で確認できます。

``` bash 
$ ls -l kengen.sh
$ -rwxr-xr-x  1 (ユーザー名)  staff  13 10 22 06:20 kengen.sh
```

ここで注目していただきたいのは最初の部分の**-rwxr-xr-x**
何やらわけわかんない文字列みたいなのが出てきましたね。

分解してみていきましょう。
まず先頭の文字の**ー**はファイルタイプを表しています。今回はーと表示されており、これは通常ファイルを示しています。ちなみに先頭文字が**d**であればディレクトリ、**l**であればシンボリックリンクを示しています。

後ろの9文字**rwxr-xr-x**はファイルモードと呼ばれここでファイルの権限が表示されています。
この9文字は**rwx**、**r-x**、**r-x**という3文字ごとに一つのブロックになっており、それぞれが**「オーナー」、「グループ」、「その他ユーザー」**に対する権限を示しています。

さて、この**r、w、x**は一体何を表しているのでしょうか？

###権限記号とその意味
r,w,xといった記号はファイルへの操作権限の種類を示しています。
操作は「読み取り」、「書き込み」、「実行」と3種類ありそれぞれ「r」「w」「x」の記号で表現されます。

記号|意味|
|:--|--:|
|r|読み取り(**r**ead)|
|w|書き込み(**w**rite)|
|x|実行(execute)|

よって先程の**-rwxr-xr-x**の権限一覧表は

|ユーザー種別|読み取り|書き込み|実行|
|:--|--:|:--|--:|
|オーナー(rootユーザー)|許可|許可|許可|
|rootグループに所属するユーザー|許可|禁止|許可|
|その他のユーザー|許可|禁止|許可|
となります。

少しLinuxの操作権限に関して理解が深まってきましたね。
さて、次から権限の追加方法を解説していき、実行権限付与が755である理由に迫っていきたいと思います。

##権限変更方法  chmod
ファイルやディレクトリの権限を設定するには**chmod**を使用します。
書式
chmod (ugoa)(+-=)(r w x) (ファイル名)

``` bash:例 
$ chmod u+w kengen.sh
```
初めの「ugoa」はどのユーザーに対する権限を変更するのかを指定しています。
それぞれの記号の意味は以下

|記号|意味|
|:--|--:|
|U|オーナー|
|g|グループ|
|o|その他ユーザー|
|a|ugo全て|

次の「+-=」は記号から推測できるように、「+」は権限の追加「-」は権限削除、「=」は指定した権限と等しくする。

よって先程の
chmod u+w kengen.shはオーナーの書き込み権限を追加するという実行コマンドになります。

##遂に755の核心に迫る

お待たせしました。やっと755の謎を解明していきたいと思います。
これらの権限付与は数値によって付与することが可能です。

|意味|数値|
|:--|--:|
|読み取り(r)|4|
|書き込み(w)|2|
|実行(x)|1|

これらの数値を足した値を「オーナー」「グループ」「その他のユーザー」の3つのグループの順に並べて記載することによりそれぞれのグループごとに権限を付与する事が可能です。
例えば読み取り、書き込み、実行権限全てを付与したい場合は4+2+1=7となります。
読み取り、実行権限のみであれば4+1となります。

したがって**rwx r-x r-x**は<font color='red'> **7 5 5**</font>となる訳なんですね。

``` bash 
$ ls -l kengen.sh
$ -rw-r--r--  1 (ユーザー名)  staff  13 10 22 06:20 kengen.sh ←実行権限なし
$ chmod 755 kengen.sh
$ ls -l kengen.sh
$ -rwxr-xr-x  1 (ユーザー名)  staff  13 10 22 06:20 kengen.sh ←実行権限付与された！
```

あと、よく使われるのは<font color='red'> **644**</font>らしいです。

``` bash 
$ ls -l kengen.sh
$ -rwxr-xr-x  1 (ユーザー名)  staff  13 10 22 06:23 kengen.sh ←実行権限あり
$ chmod 644 kengen.sh
$ ls -l kengen.sh
$ -rw-r--r--  1 (ユーザー名)  staff  13 10 22 06:22 kengen.sh ←オーナー以外読み取り専用
```

ユーザーにファイルは見られても良いが、編集や削除をさせないようにする時によく使うらしいですね。

##あとがき
いかがだったでしょうか？
今回は実行権限付与の際に使用した755の謎の数値の核心に迫りつつ、Linuxの権限周りを解説してみました。

実際企業だと必ずこういった権限管理を行なって運用されているんでしょうね。
自分自身も改めてセキュリティ意識を高め、これからも学習、実装していきたいと思います。

この記事が少しでも良かったと感じていただけましたらLGTMポチッと押していただけますと幸いです。

ここら辺の知識に対し良さげな記事を記載しておきます。

https://qiita.com/ntkgcj/items/6450e25c5564ccaa1b95

https://qiita.com/takuyanin/items/18590600d077df707923