「お前にはこのファイル触らせねーからm9(^Д^)」が出来る[chmod]とパーミッションについて

パーミッションがかけられたファイルを扱う機会があったので、簡単にまとめてみます。
環境はmacOSです。

## パーミッションについて

パーミッショは、アクセス権限のことです。
つまり、あるファイルやディレクトリを読み・書き・実行することが出来るかどうかを示しているのです。
これを弄って大ッ嫌いな上司に嫌がらせをしたり、人に見られたくない、ウフフなファイルを見れないようにしてしまいましょう。

まずはパーミッショを確認してみます。

## パーミッションの確認方法
### 確認の方法
`$ ls -l`を実行するとそのディレクトリ直下にあるファイルやディレクトリの情報を詳しく見ることができます。
その中にパーミッションの情報もあるので、実際に見て行きましょう。

現在のディレクトリ内は以下のようになっているとします。

<img width="434" alt="スクリーンショット 2018-07-07 6.17.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/264761/ddf03b5f-8e02-b696-d1bc-9b42c6a316cc.png">

そこで`$ ls -l`を実行してみます。

```
$ ls -l
total 0
drwxr-xr-x  1  [user]  [group]  0  7  7 06:03 test-directory
-rw-r--r--  1  [user]  [group]  0  7  7 06:02 test.py
-rw-r--r--  1  [user]  [group]  0  7  7 06:02 test.rb
-rw-rw-rw-  1  [user]  [group]  0  7  7 06:02 test.txt
```

色々出てきましたね。
一番右にファイルやディレクトリの名前がありますが、その行はそのファイルの情報を表します。


> ファイルがいっぱいあって、目的のファイルを見つけにくいときはパイプを使いましょう。

> ```
ls -l | grep [file_name]
```
[file_name]は一部分だけでも大丈夫です。

> また、ここではユーザー (user) やグループ (group) の説明は省きますが、興味があれば調べてみてください。

> ```
$ cat /etc/password
$ cat /etc/group
groups
chown user:group filename
```
等が関係してきます。

一番左の
`drwxr-xr-x`
は、最初の1文字がデータの種類を示しており、

|文字|データの種類|
|:-:|:-:|
|d|ディレクトリ|
|-|ファイル|
|l|シンボリックリンク|

残りの9文字が、3文字1区切りで左から順に、ユーザー・グループ・その他に対するパーミッションなのです。
この例で言えば

|rwx|r-x|r-x|
|:-:|:-:|:-:|
|ユーザー|グループ|その他| 
となります。

### パーミッションの表示

パーミッションを確認しましたが、`r・w・x・-`の4文字が使われていることに気づきましたか？
上の例では、ユーザーのパーミッションは`rwx`でしたが、グループのパーミッションは`r-x`でした。

この表記には以下のルールがあります。

|1文字目|2文字目|3文字目|
|:-:|:-:|:-:|
|r / -|w / -|x / -|
|read(読み込み)|write(書き込み)|execute(実行)|
文字があれば可能、-(ハイフン)であれば不可なのです。

つまり、このtest-directoryというディレクトリは

ユーザー : 読み込み・書き込み・実行ができる
グループ : 読み込み・実行ができる
その他　: 読み込み・実行ができる

という状態にあることが分かりました。
これらが理解できたところで、パーミッションを書き換えてみましょう。

## パーミッションの変更
パーミッションの変更は`$ chmod` で行うことができますが、
追加・削除するパーミッションの指定方法は２つあります。


### 1 ) 文字列で指定する方法

`$ chmod [文字列] [対象のファイル・ディレクトリ]`

文字列で「誰に どの権限を どうするか」を指定することができます。
指定方法は次の通りです。

|誰?|どうする?|どの権限?|
|:-:|:-:|:-:|
|u (ユーザー) / g (グループ) / o (その他) / a (全員)|+ (付与) / - (削除)|r / w / x|

ユーザーから実行権限を奪いたい時は、`u-x`という文字列を指定します。

```
$ chmod u-x test-directory
$ ls -l | grep test-directory
drw-r-xr-x  2  [user]  [group]  64  7  7 06:07 test-directory
```
ユーザーのパーミッション部分から`x`が無くなっていることが分かりますね。

また、誰の部分と権限の部分は複数指定することができ、
グループとその他から実行権限を失くして、書き込みは可能にしたい時は、

```
$ chmod go+w-x test-directory
$ ls -l | grep test-directory
drw-rw-rw-  2  [user]  [group]  64  7  7 06:07 test-directory
```

となります。

誰にの部分で`a(全員)`を指定すると、ユーザー・グループ・その他のパーミッションを変更することができます。

```
$ chmod a-x test-directory
$ ls -l | grep test-directory
drwxrwxrwx  2  [user]  [group]  64  7  7 06:07 test-directory
```

### 2 ) 数値で指定する方法

さて、パーミッションである`rwx`の3文字ですが、2進数で表すこともできますよね。

文字がある => 1
ハイフンがある => 0

とすれば、`rwx`の順番は決まっているので、

`rwx` : 111
`r-x` : 101 

のように表せます。
次は、これを10進数に戻しましょう。

|パーミッション|2進数|10進数|
|:-:|:-:|:-:|
|rwx|111|7 (= 4 + 2 + 1)|
|r-x|101|5 (= 4 + 0 + 1)|

となりますね。

したがって、１つのパーミッションは0~7の数字で表すことができ、
これがユーザー・グループ・その他の3個あるので、

`rwx rw- r--` => 764

といった感じで、表すことができます。

ではこの数値を使って、パーミッションを変更して行きましょう。

```
$ chmod 764 test-directory
$ ls -l | grep test-directory
drwxrw-r--  2  [user]  [group]  64  7  7 06:07 test-directory
```

これでパーミッションの変更が簡単にできました。


どちらの方法を使うかは自由ですが、個人的には数値指定の方が楽に感じます。

## まとめ
どうでしたか？
僕の説明が分かりやすければ、簡単にパーミッションについて理解することができたかと思います。

`$ chmod 700 [file or directory]`
とでもしてやれば、自分以外はアクセスすることができないファイルが出来上がります。

これであーんなファイルやこーんなファイルも、~~さらには、上司への恨み辛みを書き連ねた怨讐こもるファイルも、~~思いのままですね。
![80ce05f34270ad96125fa383fdf92f50_600.jpg](https://qiita-image-store.s3.amazonaws.com/0/264761/57046efc-cdf4-ee00-2862-df9c59fb6218.jpeg)


是非とも快適なライフを！