もうPermission deniedなんて怖くない!〜linuxのパーミッションについてかなり丁寧に説明してみる〜
開発中よく目にするエラー
Permission denied.
環境構築中、よくこのエラー見ますよね。
よく見る割に「とりあえずsudoで無理やり対応」という雑な対応が多い気がしたので、
まずはパーミッションについて整理してみようと思いました。
前提
そもそも、linuxはみんなで使うものだった
今でこそ一人一台コンピュータを持つのは当たり前になりましたが、
昔コンピュータはすごく高価だったので、一台のコンピュータを皆で使っていました。
これだとプライバシーがなくなる
しかしこれだと、こういう問題がおきます。
Aさんが、自分のちょっと言えない秘密を書いたファイルを作成、
保存しました。
コンピュータはみんなで使うもの。
Aさんのファイルはみんなに共有され、
そしてみんなに書き換えられてしまいました。これは非常にこまる。
理想
作った人は読めるし編集できる
他の人は読めないし編集もできない
となっているのが理想ですね。
図にするとこんな感じ。
実際のlinux
これを実現するために、linuxでは
全てのファイル・ディレクトリに「所有者」という属性を持たせています。
そして、
所有者がファイルを触る時と、
所有者以外の他人がファイルを触る時、
それぞれの時に可能な操作(読み、書き、実行)が
設定できるようになってます。
上の例だと、
所有者はそのファイルに対して読み、書き、実行ができますが、
所有者以外の人は何も出来ない、という設定ですね。
もう少し実際の表示に近づけるとこんな感じです。
rはread, wはwrite, xはexecuteの略です。わかりやすいですね。
実際はowner以外にも、groupという概念があります。
これを使うと、
- 開発者グループの人はこのファイルを読めるようにしたい
といった設定が可能です。
この「ファイル・ディレクトリに対してできること」のことを、
パーミッションと言います。
コマンドラインで確認してみる
それでは、このfileAについて、
所有者、グループ、パーミッションを確認してみましょう。
$ ls -al -rwxr-----. 1 A dev 0 Dec 22 16:56 fileA
なにかでてきましたね。
先ほどの図と比べてみましょう。
色分けしたとおりです。
なお、このパーミッションを変えたいときは、
chmod
ファイルの所有者・所有グループを変更したいときは、
chown chgrp
などのコマンドを使います。
結局Permission deniedとは何なのか
「ファイルに設定されているパーミッション以外の操作をしようとした時」
に出るエラーです。
先ほどの例なら、所有者でも所有グループでもない人が、
そのファイルを読もうとしたり書こうとした時に発生します。
これを知っておけば、
エラーが起きた時に
「ああ、今のユーザでは出来ない操作なんだな」
「ユーザを変えよう」
「パーミッションを変えよう」
「ファイルの所有者・グループを変えよう」
などの把握・対処ができると思います。