君は心理学者なのか?

大学時代に心理学を専攻しなぜかプログラマになった、サイコ(心理学)プログラマかろてんの雑記。

もうPermission deniedなんて怖くない!〜linuxのパーミッションについてかなり丁寧に説明してみる〜

開発中よく目にするエラー

Permission denied.

環境構築中、よくこのエラー見ますよね。

よく見る割に「とりあえずsudoで無理やり対応」という雑な対応が多い気がしたので、

まずはパーミッションについて整理してみようと思いました。

前提

そもそも、linuxはみんなで使うものだった

今でこそ一人一台コンピュータを持つのは当たり前になりましたが、

昔コンピュータはすごく高価だったので、一台のコンピュータを皆で使っていました。

f:id:karoten512:20171223013706p:plain

これだとプライバシーがなくなる

しかしこれだと、こういう問題がおきます。

Aさんが、自分のちょっと言えない秘密を書いたファイルを作成、

保存しました。

f:id:karoten512:20171223013823p:plain

コンピュータはみんなで使うもの。

Aさんのファイルはみんなに共有され、

そしてみんなに書き換えられてしまいました。これは非常にこまる。

理想

  • 作った人は読めるし編集できる

  • 他の人は読めないし編集もできない

となっているのが理想ですね。

f:id:karoten512:20171223014154p:plain

図にするとこんな感じ。

実際のlinux

これを実現するために、linuxでは

全てのファイル・ディレクトリに「所有者」という属性を持たせています。

そして、

所有者がファイルを触る時と、

所有者以外の他人がファイルを触る時、

それぞれの時に可能な操作(読み、書き、実行)が

設定できるようになってます。

f:id:karoten512:20171223014348p:plain

上の例だと、

所有者はそのファイルに対して読み、書き、実行ができますが、

所有者以外の人は何も出来ない、という設定ですね。

もう少し実際の表示に近づけるとこんな感じです。

f:id:karoten512:20171223015102p:plain

rはread, wはwrite, xはexecuteの略です。わかりやすいですね。

実際はowner以外にも、groupという概念があります。

これを使うと、

  • 開発者グループの人はこのファイルを読めるようにしたい

といった設定が可能です。

f:id:karoten512:20171223020439p:plain

この「ファイル・ディレクトリに対してできること」のことを、

パーミッションと言います。

コマンドラインで確認してみる

それでは、このfileAについて、

所有者、グループ、パーミッションを確認してみましょう。

$ ls -al
-rwxr-----. 1 A    dev     0 Dec 22 16:56 fileA

なにかでてきましたね。

先ほどの図と比べてみましょう。

f:id:karoten512:20171223020740p:plain

色分けしたとおりです。

なお、このパーミッションを変えたいときは、

chmod

ファイルの所有者・所有グループを変更したいときは、

chown
chgrp

などのコマンドを使います。

結局Permission deniedとは何なのか

「ファイルに設定されているパーミッション以外の操作をしようとした時」

に出るエラーです。

先ほどの例なら、所有者でも所有グループでもない人が、

そのファイルを読もうとしたり書こうとした時に発生します。

これを知っておけば、

エラーが起きた時に

「ああ、今のユーザでは出来ない操作なんだな」

「ユーザを変えよう」

パーミッションを変えよう」

「ファイルの所有者・グループを変えよう」

などの把握・対処ができると思います。