mattintosh note

どこかのエンジニアモドキの備忘録

(ほんとか?)パーミッションの一括変更ならchmod -Rやで!

という話。

タイトルの個人的な見解ですが、場合による

パートナー会社のエンジニアさんからトラブルシュートで色々質疑応答していてディレクトリもファイルも 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 とは完全に同じ動作ではないけど、これを書いてくれた人の動作説明は正しくて、BSDchmod では 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.

とあるので「ディレクトリまたは実行可能ファイルに実行権限が付く」となる。

この動作としては

  1. a=000 からスタート。
  2. r ですべてのディレクトリおよびファイルが 444 として準備される。
  3. X(大文字)でディレクトリと実行権限付きのファイルが 555 として準備される。それ以外のファイルは 444 のまま。
  4. 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 にしたいということもあるし、サーバ内のめちゃくちゃになったパーミッションを整理したいが実行ファイルは実行権限付けたままにしたいということもある。

セキュリティに厳しい SSHMySQL などの設定ファイルや格納ディレクトリ関連は読み書き権限が必要以上に付いていると使えなくなる可能性もあるので「俺は chmod -R 一発でやるZE!」と安易に済ませるというのも危険だったりする。(恐らく長くサーバの運用とかやってる人はそういうことはしないと思う)

環境によっても微妙な差はあると思うのでまずは使っている環境の findchmod のマニュアルを読みましょう。

f:id:mattintosh4:20200918153727p:plain