Quantcast
Channel: mattintosh note
Viewing all articles
Browse latest Browse all 880

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

$
0
0

という話。

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

パートナー会社のエンジニアさんからトラブルシュートで色々質疑応答していてディレクトリもファイルも 777になってるのが問題だねって話になったんだけど「chmod -R 644すればいいんですね!」って言われたのでちょっと待てや、と。

ある程度 Unix/Linuxを知っている人ならディレクトリから実行権限を外すとどうなるかはわかると思う。そう、中が見れなくなるのである。(ディレクトリの場合、xが示すものは executable bit ではなく searchable bit なので。root なら見れる)

で、チャットでイチから説明するのも手間だなと思ってネットの記事を探して Qiita に「書いている人はちゃんと理解してなさそうだけど引用されている部分は合ってる」感じの記事があったのでとりあえずリンクを注釈付きで教えた。

そのあとコメント欄まで目を通してみたんだけど、他人の記事のコメントに自己解説残して間違ってると思われる人がいた。

例えばディレクトリを 755、ファイルを 644 にするなら

find /path/to/dir -type d -execchmod755{} +
find /path/to/dir -type f -execchmod644{} +

または

find /path/to/dir -type d -execchmod755{} \;
find /path/to/dir -type f -execchmod644{} \;

で、いいと思う。(+\;の違いはマニュアルに書いてある。+に対応してない find もあった気がする。xargs使ったほうがいいよという人はそれでどうぞ)

これを

chmod-Ra=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               -execchmod755{} +
❷ find /path/to/dir -type f    -perm +111-execchmod755{} +
❸ find /path/to/dir -type f \! -perm +111-execchmod644{} +

なお、❷と❸の順番を間違えるとすべてのファイルから実行権限が削除されるため、もともと実行権限が付いていたファイルが -perm +111の条件に一致しなくなりすべてのファイルが 644になる。


どの方法を使うかは場合によるわけで、例えば Windowsからもらったファイルとかだと全部 777になっていたりするので一旦ファイルは全部 644にしたいということもあるし、サーバ内のめちゃくちゃになったパーミッションを整理したいが実行ファイルは実行権限付けたままにしたいということもある。

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

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

f:id:mattintosh4:20200918153727p:plain


Viewing all articles
Browse latest Browse all 880

Trending Articles