という話。
タイトルの個人的な見解ですが、場合による。
パートナー会社のエンジニアさんからトラブルシュートで色々質疑応答していてディレクトリもファイルも 777
になってるのが問題だねって話になったんだけど「chmod -R 644
すればいいんですね!」って言われたのでちょっと待てや、と。
ある程度 Unix/Linux を知っている人ならディレクトリから実行権限を外すとどうなるかはわかると思う。そう、中が見れなくなるのである。(ディレクトリの場合、x
が示すものは executable bit ではなく searchable bit なので。root なら見れる)
で、チャットでイチから説明するのも手間だなと思ってネットの記事を探して Qiita に「書いている人はちゃんと理解してなさそうだけど引用されている部分は合ってる」感じの記事があったのでとりあえずリンクを注釈付きで教えた。
そのあとコメント欄まで目を通してみたんだけど、他人の記事のコメントに自己解説残して間違ってると思われる人がいた。
例えばディレクトリを 755、ファイルを 644 にするなら
find /path/to/dir -type d -exec chmod 755 {} + find /path/to/dir -type f -exec chmod 644 {} +
または
find /path/to/dir -type d -exec chmod 755 {} \; find /path/to/dir -type f -exec chmod 644 {} \;
で、いいと思う。(+
と \;
の違いはマニュアルに書いてある。+
に対応してない find もあった気がする。xargs
使ったほうがいいよという人はそれでどうぞ)
これを
chmod -R a=rX,u+w /path/to/dir
で代替え出来るよ、と書いてくれている人がいた。上記の find
とは完全に同じ動作ではないけど、これを書いてくれた人の動作説明は正しくて、BSD 版 chmod
では X
はマニュアルに
The execute/search bits if the file is a directory or any of the execute/search bits are set in the original (unmodified) mode. Operations with the perm symbol ``X'' are only meaningful in conjunction with the op symbol ``+'', and are ignored in all other cases.
とあるので「ディレクトリまたは実行可能ファイルに実行権限が付く」となる。
この動作としては
a=
で000
からスタート。r
ですべてのディレクトリおよびファイルが444
として準備される。X
(大文字)でディレクトリと実行権限付きのファイルが555
として準備される。それ以外のファイルは444
のまま。u+w
でディレクトリと実行権限付きのファイルが755
、それ以外のファイルが644
に設定される。
となる。(細かい部分はソースコード見てないのでわからない)
自己解説を間違えて書いていた人は「ディレクトリのみ」としていた。
人によっては大した違いではないと思うかもしれないが、実行ファイルが 7xx
になるか 6xx
になるかの挙動を理解しているかどうかの違いはとても大きい。
ここからは蛇足で、これを find
で行う場合は実行権限付きのファイルを先に抽出して処理する必要があるので下記のようになる。-perm
オプションの引数は要件に応じて決める必要があるが、ここでは a=rX
と同じように「ugo
いずれかに x
が付与されている場合」とする。
❶ find /path/to/dir -type d -exec chmod 755 {} + ❷ find /path/to/dir -type f -perm +111 -exec chmod 755 {} + ❸ find /path/to/dir -type f \! -perm +111 -exec chmod 644 {} +
なお、❷と❸の順番を間違えるとすべてのファイルから実行権限が削除されるため、もともと実行権限が付いていたファイルが -perm +111
の条件に一致しなくなりすべてのファイルが 644
になる。
どの方法を使うかは場合によるわけで、例えば Windows からもらったファイルとかだと全部 777
になっていたりするので一旦ファイルは全部 644
にしたいということもあるし、サーバ内のめちゃくちゃになったパーミッションを整理したいが実行ファイルは実行権限付けたままにしたいということもある。
セキュリティに厳しい SSH や MySQL などの設定ファイルや格納ディレクトリ関連は読み書き権限が必要以上に付いていると使えなくなる可能性もあるので「俺は chmod -R
一発でやるZE!」と安易に済ませるというのも危険だったりする。(恐らく長くサーバの運用とかやってる人はそういうことはしないと思う)
環境によっても微妙な差はあると思うのでまずは使っている環境の find
と chmod
のマニュアルを読みましょう。