パーミッションとchmodのコマンドの意味を調べてみた。

夜分におそれいりますよ。信夫です。

さて前回の記事ではnpm installのエラーに対して何をすればよいかを調べてみました。

chmodで権限を付与すればインストールできそうなことはわかったのよ。でもさ正直こっから具体的に何をすれば問題が解決するのかわかってない。だもんでとりあえずはググるところからだね。

とりあえずchmodではコマンドを使うみたいだからそのコマンドを知りたいのと、そのコマンドをどう使うかを知りたいから、それを調べてみよう。

chmodで付与できる権限は3種類

調べてみたところ、chmodで付与できる権限というのはファイルとディレクトリに対して、それぞれ3種類あるらしい。

 ファイルディレクトリ
r:読み込み指定したファイルの内容を表示出来るファイル一覧を表示できる
w:書き込みファイルの上書きと削除ディレクトリ内に
新規ファイル作成可能(削除も)
x:実行実行ファイルの実行(プログラム、CGIなど)そのディレクトリに移動すること(カレントディレクトリにすること)ができる

今回は書き込みの権限が無いっていうエラーだった。ほんでたしか対象はディレクトリになっていた気がする。なのでディレクトリに対して書き込みの権限を付与することになるのかなと。おお、なんとなく理解が繋がった気がする。こういう時気持ちいいよね。

そして、それぞれの権限は数字で表すこともあるみたい。というかそっちを理解していないと訳わからなくなりそう。このあたりは後半で詳しく書いていきますが、一旦その数字というのは以下。

記号数字
読めるr4
書けるw2
実行できるx1
何も出来ない0

chmodで権限付与できるの対象者は4種類

そして権限を与えられる対象は4種類あるみたい。

chmodで権限付与できる4種類の対象者

u:ユーザー(所有者)
g:グループ
o:その他
a:すべて

うん。この段階ではまだわからないね。ユーザーとかはなんとなくイメージできるけど、も少し調べましょ。

とりあえず現在の権限の状況を調べてみる

ここまで調べた時点でふと「そいえば今の状況はどうなってるんだろう」と思いまして、今の権限の付与状況を確認してみることにしました。

どうやって調べよかなって思って、とりあえず関連性のありそうなキーワードで合せ技で調べてみようと思いました。今回は例えば「chmod 権限 状況」とかで。そしたら最高にわかりやすいQiita先生が出てきましたよ。

調べてみると「ls -l」っていうLinuxコマンドでわかるらしい。これはカレントディレクトリ内のファイルやディレクトリの情報を確認するコマンドらしいよ。カレントディレクトリ。今いるディレクトリのことだった気がする。

おっしゃ。とりあえずさっそくやってみよ。iterm2でコマンドをたたいてみる。

失敗。「−」の前にスペースが必要らしい。

やっちゃった。「ls-l」じゃなくて本当は「ls -l」

こういうの、最初ビビるよね。「あれ、動かない」ってなるけど、冷静に自分が打ったコードを見るのは大切だね。ん?これはコード?コマンド?コマンドか。

では改めて正しいコマンドでやってみる。

ほーん。なるほどね

とりあえず何もわからないということがわかったな!今回も!

でも出てきた。これが今の権限の状況らしい。

なるほどなるほどーと思ってさらに調べてみると、ここで前回見た言葉がここでもまた出てきた。「パーミッション」である。

パーミッションとはファイルやディレクトリへの「アクセス権」のこと

パーミッションのことを調べてみたところ、各フォルダやファイルの権限情報のことをパーミッションというらしい。言葉の使い方としては「ファイルのパーミッションを見てみるか」とかって使われるんだって。

ここからは相当知ったかぶりも入りますけど、MacのOSはUNIXっていうOSをベースに作られているらしいんですよ。でそのUNIXのシステム自体は「1つのシステムを複数のユーザーで使うこと」が前提に作られているんだって。

そうなった時に自分以外の人が好き勝手にファイルをいじったりフォルダ変えたり出来ないようにするための仕組みが「パーミッション」なんだって。

それでその権限の種類がさっき書いた「r:読み込む、w:書き込む、x:実行する」の3つで、それを「u:ユーザー(所有者)、g:グループ、o:その他、a:すべて」に付与できるらしいよ。

今回権限を変えたいのは「node_modules」のフォルダ

前々回の記事でエラーになっていたのが「/usr/local/lib/node_modules」に書き込みの権限がないよってことでした。その時のエラーが以下ね。

npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules

その際の前々回の記事はこちら

なのでnode_modulesのフォルダに権限を与えれば良いんだよね。多分。

そしたらまずはこのnode_modulesの権限がどうなっているかを確認したほうが良さそう。ここでもう1回、自分のiterm2を見てみた。「ls -l」って打って出てきた上の画像の中にこんなのがあった。

drwxr-xr-x  88 shinobudaisuke  staff   2816  6 18 00:14 node_modules

おそらくこれが、node_modulesの権限の状態だよね。うん。

イマイチどころか頭から爪先までいっこもわからん。かろうじて、左端の文字列はおそらく権限の付与状態を記載しているのかなって想像できるくらい。なのでこれをもうちょっと調べてみます。

パーミッションの読み方

パーミッションの読み方を調べてみましたよ。まとめると「drwxr-xr-x」などの文字列は「ディレクトリかどうか」+「自分の権限」+「グループの権限」+「他人の権限」が合計10文字で表現されているみたい。

わかりやすくまとめるとこうです。

ディレクトリ 自分 グループ その他
読み 書き 実行 読み 書き 実行 読み 書き 実行
d r w x r w x r w x

ちなみに、パーミッションの左端が「d」ではなく「−」だったら、それはファイルを表しているそうです。

さっきのnode_modulesのパーミッションをもう一度見てみると「drwxr-xr-x」と書かれているので、これは以下を表してました。

node_modulesのパーミッションからわかること

node_modulesがディレクトリであること
・自分にはw、r、x、すべての権限がついてる。
・グループやその他のユーザーにはwの権限がない。

なるほどー確かに自分以外ではw(書き込み)の権限が無いんだね。

でも、そもそも自分以外(グループやその他)って誰のことを指しているんだろうね。今回のcreate−react−appをnpm instalしたいのって僕(自分)で、指示を出しているのも自分なんだけど、なんでダメなんだろうね。誰が指示を出そうと、ディレクトリ自体に権限が必要ってこと?じゃあそのディレクトリは「グループ」なのか「その他」なのか?

これはもうちょっと詳しく調べたいけど、先に進む方が懸命な気もする。

ほんで、さっきちらっと書いた「権限を数字で表現する」ということが、これから理解しておく必要がありそうです。なぜなら、権限を変更する時にはその数字で書かないといけない(っぽい)からです。

パーミッションの権限を数字で表す

さっきと同じ表ですが、パーミッションの権限を数字で表すとこうなっている。

記号数字
読めるr4
書けるw2
実行できるx1
何も出来ない0

で、パーミッションの内容を数字で表す時には権限の対象ごとに表現するらしい。なので「自分」「グループ」「その他」の3種類の数字になるんだけど、その時の権限の付与状況は、各権限の数字の足し算になるんだって。

ちょっとわかりづらいと思うのでまとめると例えば今のnode_modulesの権限の状況は「drwxr-xr-x」だから、それぞれ持ってる権限を数字にして、それを「自分」「グループ」「その他」ごとに足してみると・・・

 

ディレクトリ 自分 グループ その他
読み 書き 実行 読み 書き 実行 読み 書き 実行
d 4 2 1 4 2 1 4 2 1

赤い文字は既に付与されている権限で、青い文字は付与されていない権限です。そうなると現在のnode_modulesのパーミッションは「755」ですね。

くわしく書くと「(4+2+1)、(4+1)、(4+1)」ということらしいです。

そして今回は書き込みの権限も付与するわけなので、node_modulesのパーミッションを777(読み、書き、実行のすべての権限を付与)する必要がありそうです。

おー、わかったような、わからないような。

さっきの、コマンドの指示出ししているのは自分なのに、なんでそのとおり動かないんだろうっていう疑問はあるけども。でもとりあえずは理解できた。

次回は実際にchmodでコマンドを打って、node_modulesのパーミッションを変更していきたいと思います。