permission deniedで悩まされたので勉強してみた

# **最初に**
ことあるごとにコマンドの実行結果がpermission deniedとなり、こやつは何ぞや、、、となっておりました。パーミション？ なんか難しそう。。敷居高そうだと。
しかし、しっかり勉強したらなんてことなかったです。難しくなかったです。ただの先入観だということがわかったので同じ悩みをお持ちの方のためになればと思い、本記事を投稿します。

# **パーミッションて何？**
linuxコマンドはプログラムを書く人とって切っても切り離せないものですよね。
そもそもLINUXは、サーバーでよく使われるOSですが、そのため１つのマシンへ複数のユーザーが同時にログインして操作することを前提として作られています。この際に、秘密のファイルを他のユーザーに見られてしまったり、誤って他のユーザのファイルを上書きしてしまうことを防ぐため、アクセス権限が必要でした。したがって一つ一つのファイルには、**「誰に、どのような操作を許可するのか」という権限**を規定する情報が設定されています。この情報のことを、**パーミッション**と呼びます。

# **パーミッションを確認しよう**
Linuxで扱われるファイルは、自分で作成したメモのテキストファイルから、システムが提供するライブラリや実行コマンドまで、全てに所有者（オーナー）が設定されています。ファイルのオーナーは、ファイルへのアクセス権限を自由に設定できます。

**`ls`**コマンドを**`-l`**オプションで実行します。

```
$ ls -l 
drwxr-xr-x. 20 root  root  2077 Jul  5 14:34 bin/cat
```
**ls**コマンドを**-l**オプションで実行すると、上記のように出力されます。
左から順に、


| 表示 | 意味 |
|:--|:--|
|d|ファイルタイプ   |
|rwxr-xr-x.|ファイルモード|
|20   |リンク数    |
|root   |ファイルの所有者（オーナー）    |
|root   |ファイルが所属する所有グループ   |
|2077  |サイズ    |
|Jul　5　 <u>4:34</u>   |タイムスタンプ    |
|bin/cat  |ファイル名もしくはディレクトリ名   |

という意味です。
ここでは、簡単にそれぞれの説明をした後に、本題である、ファイルモード（permissionの状態）についてふれていきたいと思います。

###**ファイルタイプ**

ファイルタイプには３種類あります。

|記号|ファイルタイプ|
|:--|:--|
|-  |通常ファイル   |
|d  |ディレクトリ   |
|l   |シンボリックリンク   |

通常ファイルや、ディレクトリは言葉の意味そのままですので、シンボリックリンクについて少し説明します。

### <u>シンボリックリンクとは</u>
リンク先のパス名が書かれた小さな特殊ファイルです。
どういうことでしょうか。
例で確認しましょう。

```
$ pwd
/Users/takuya/example

$ touch file1

$ ln -s file1 file2

$ ls -l
total 8
-rw-r--r--  1 takuya  staff   6 Jul 12 16:45 file1
lrwxr-xr-x  1 takuya  staff  13 Jul 12 16:48 file2@ -> example/file1

$ cat file1
File1

$ cat file2
File1
```
exampleディレクトリに`touch`コマンドでfile1作成したのちに、file1というファイルに対して、file2という名前でシンボリックリンクを作成しました。
そしてシンボリックリンクのリンク先を確認するために、`ls`コマンド`-l`オプションを指定します。矢印で表示されているのが確認できると思います。コマンドでファイル名の代わりにシンボリックリンクを指定すると、そのリンク先のファイルにアクセスできます。上の例では、`cat`コマンドでfile2を指定すると、file1がアクセスされその中身が出力されています。
このように、シンボリックリンクのリンク先がファイルの実体であり本物のファイルです。
また、次のように長いパス名を持つファイルやディレクトリへリンクを作成しておけば、簡単にアクセスできて便利になります。

```
ln -s local/work/code/projects/source source
cd source
```

###**リンク数**

簡単に言えば、ファイルであれば１、ディレクトリであればその一つ下の階層のファイルまたはディレクトリ数（あくまで一つ下の階層までで、その下のファイルなどは含まない）。

```
$ ls -la
.
.
.
drwxr-xr-x+   5 takuya  staff         160 Oct  7  2017 Public/
.
.


$ ls -la Public/
total 0
drwxr-xr-x+  5 takuya  staff   160 Oct  7  2017 ./
drwxr-xr-x+ 70 takuya  staff  2240 Jul 12 17:13 ../
-rw-r--r--   1 takuya  staff     0 Oct  7  2017 .com.apple.timemachine.supported
-rw-r--r--   1 takuya  staff     0 Oct  7  2017 .localized
drwx-wx-wx+  3 takuya  staff    96 Oct  7  2017 Drop Box/

```
といった具合である。


###**オーナー**
Linuxで扱われるファイルは、自分で作成したテキストファイルから、システムが提供するライブラリや実行コマンドまで、全てに所有者（オーナー）が設定されています。ファイルのオーナーは、ファイルへのアクセス権限を自由に設定できる。

####**グループ**
ユーザーをまとめた集まりのことです。例えばシステム管理を行うwheelというグループに複数の管理者ユーザを所属させ、wheelグループに対して許可を与えることで、同じ役割を持つ複数のユーザに同一の権限を与えることができます。ユーザは同時にいくつものグループに所属できます。また、どのユーザも最低一つのグループに所属していないといけません。ユーザを新規作成する際に特に指定しないと、ユーザー名と同一のグループに所属します。
自分がどのグループに所属しているかは、　`groups`コマンドで確認できます。次の例では、現在のログインユーザtakuyaは「staff」と「everyone」という２つのグループに所属しています。

```
$ groups
staff everyone
```
---
また、
サイズは、そのファイル容量、タイムスタンプは最後に編集した日時です。
それでは、いよいよファイルモードについて説明します。

#**ファイルモード**

```
$ ls -l 
drwxr-xr-x. 20 root  root  2077 Jul  5 14:34 bin/cat
```
ファイルタイプの後ろの９文字`rwxr-xr-x`の部分はファイルモードと呼ばれます。
この９文字は`rwx`、`r-x`、`r-x`というように3文字ごとに1つのブロックになっていて、それぞれが`オーナー`、`グループ`、`その他のユーザ`に対するパーミッションを意味しています。

下の表にパーミッションの記号の意味を示しています。

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

先ほどの例では「-」という表示が見られますが、こちらは「未許可」ということを表します。

|ユーザ種別|読み取り|書き込み|実行　　|
|:------ |:-----|:----- |:---|
|オーナー　　　|許可|許可|許可|
|rootグループに所属するユーザ|許可|未許可|許可|
|その他のユーザ|許可|未許可|許可|

このファイルはオーナーにしか書き込み権限がありませんから、その他のユーザはファイルを上書きすおることができません。また、どのユーザにも実行権限がついているため、誰でも実行可能です。

**注)ディレクトリのパーミッション表示も同じ記号を使いますが、ファイルの場合とは違った意味を持ちます。**

|記号|意味|
|:---:|:---|
| r |読み取り：ディレクトリに含まれるファイル一覧の取得|
| w |書き込み：ディレクトリの下にあるファイル・ディレクトリの作成・削除|
| x |実行：ディレクトリをカレントディレクトリにする|

#**ファイルモードを変更する**
ファイルモードの変更には`chmod`コマンドを指定するわけですが、「シンボルモード」による指定と「数値モード」による指定の2種類の方法があり、どちらもよく使われます。

###**\*シンボルモード**
次のような書式で実行します。
`chmod [ugoa][+-=][rwx] <ファイル名>`
シンボルモードによる指定では**「誰に、どのような権限を追加したい（もしくは禁止）するのか」**というのがわかりやすくなっています。

```:例)
$ chmod u+w file.txt
```
u(誰に)+(どうする)w(何を)
また[ugoa]と[+-=]の意味はそれぞれ次のようになっています。

| 記号 | 意味 |
|:-:|:-:|
|u(user)   |オーナー  |
|g(group)  |グループ   |
|o(other)   |その他のユーザー|
|a(all)   |ugo全て   |

| 記号 | 意味 |
|:-:|:-:|
| +  | 権限を追加する  |
| - | 権限を禁止する  |
| = | 指定した権限と等しくする  |

例えば、現在の権限が「r--r--r--」であるファイルfile.txtに対して、オーナーの書き込み権限を追加したい時、以下のコマンドを実行します

```
$ chmod u+w file.txt
```
現在「rwxrwxrwx」であるファイルfile.txtにたいして、「グループ」と「その他のユーザー」には「読み取り」だけの権限に抑えたい時、次のコマンドを実行すると良いでしょう。

``` 
$ chmod go=r file.txt
```

以上のように、**シンボルモードは、相対的な指定方法**です。つまり、指定したパーミッション以外は変化しません。これは、「オーナー権限のみ」などパーミッションの一部だけを変更したいときに便利です。

###**\*数値モード**
書式は以下のようになります。
`chmod <8進数の数値> <ファイル名>`
数値モードは元のパーミッションに関わらず新しいパーミッションの値へと変更する、**絶対指定の方法**です。

例を確認した方が早いですね。

```
$ ls -l file.txt
-rw-r--r--  1 takuya  staff  0 Jul 12 18:58 file.txt

$ chmod 755 file.txt

$ ls -l file.txt
-rwxr-xr-x  1 takuya  staff  0 Jul 12 18:58 file.txt*
```
パーミッションが変更されているのが確認できますね。
では「755」という、よくわからない（今の段階では）ものについて説明します。

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

つまり、「755」というのは「7(4+2+1)5(4+1)5(4+1)」であり、ユーザには全てに権限を、グループとそののユーザには「読み込み」と「実行」する権限を与えているわけです。

#**スーパーユーザ**

ありとあらゆる操作が許可された強い権限を持つユーザがスーパーユーザです。ユーザ名がrootであることから「rootユーザ」とも呼ばれます。スーパーユーザはあらゆる操作が許可された強い権限をもつユーザであり、システムの設定ファイルを変更したり、新しいアプリケーションをインストールしたりすることができますが、強い権限をもつだけにリスクも伴いますので、**通常は一般ユーザでログインして操作し、必要な時だけスーパーユーザとして作業する**といったことが大切になります。
コマンドとして**`su`**コマンドと**`sudo`**コマンドがありますが、違いは、`su`コマンドを実行したのちには、`exit`コマンドでsuperuser状態から抜ける必要があります。ここでは少し題意から外れますので詳しいことは割愛させていただきます。

#**終わりに**
とりあえずpermissionによってエラーが出たら権限を確認し、臨機応変に対処していきたいですね。パーミッションが曖昧だった方の一助になれば幸いです。