ファイルとディレクトリのパーミッションの違い
昨日sudoでユーザーごとの権限について学んだわけなんだけども、そのユーザーやグループごとの権限を分ける意味を持たせているのがファイルやディレクトリのパーミッション。各ファイルやディレクトリにはその所有ユーザーと所有グループが設定されていて、所有者、所有グループ、その他のユーザーという3つのグループに分けられる。そしてファイルをどの程度いじくれるのか、つまり権限をその3グループそれぞれに割り当てることができる。
で、そもそもその権限のグループ分けはどうなっているのかというと、読み込み権限、書き込み権限、実行権限の3つに分けられる。が、見出しのとおりファイルに対する読み書き実行とディレクトリに対する読み書き実行では若干意味が違ってくる。ので覚書。
ファイルに対する操作
読み:これはわかんないことはないと思うけど、そのファイルを読みこむことができるかどうかを示す。
書き:そのファイルの内容を書き換えて、上書き保存できることを意味する。
実行:そのファイルを実行できるかどうか。lsなどのunixコマンドの実体はファイル。なのでそれらのファイル(コマンド)のために実行権限が与えられている必要がある。
ちなみに、
ruby test.rb
というようにコマンドラインでrubyスクリプト(別にperlとかでもいいんだけど)を動かす場合、このtest.rbのパーミッションはどうしたらいいのか?実行権限はrubyコマンドを叩くユーザーでの実行権限を与えなければならないのか?
test.rbに対する実行権限はいらない。読み込みのパーミッションだけ与えられていれば十分。なぜかというと、結局このtest.rbというスクリプトの実行者はrubyコマンドだから。rubyという実行ファイル(コマンド)がtest.rbを読み込んでパースするため、rubyコマンド実行者に対する読み込み権限のみ与えられていればOK。
さらにちなみに、シェルスクリプトの場合
. test.sh
というように実行する場合は、スクリプトに実行権限与えないで読み込み権限だけあれば十分なんだけど、
./test.sh
とする場合は実行権限が必要になる。前者の「.」(ドット)はsourceコマンドのエイリアスなんだけど、このときは実行者はbashなどのログインシェルとなるが、後者の場合はコマンド叩いたユーザー自身が実行者となる。
ディレクトリに対する操作
そもそもlinuxにおけるディレクトリはファイルの一覧が記録されているファイルという位置づけ。
読み:上記の位置づけから、ディレクトリに対する読み込みは、そのディレクトリ内のファイルの一覧を表示させることができるかということになる。具体的にはlsできるかどうかってこと。
書き:結局はファイル一覧に対する操作となるので、書き込みが許可されているということは、そのディレクトリ内にファイルを作成したり、削除したりできるということとなる。ファイル削除についてはファイル自身の権限はなにが与えられていようと関係がない。削除の可否についてはディレクトリの書き込み権限によって変わってくるから。
実行:ディレクトリの中に進めるかどうかを表す。具体的にはcdできるかどうか。