権限の変更 chmod
鍵ファイルを置いた瞬間、SSH に門前払いされる
別の PC から ~/.ssh/id_ed25519 をコピーしてくると、Permissions are too open と言われて接続を断られることがあります。鍵の中身は正しいのに、他人からも読める置き方になっているせいで繋がりません。こういうときに権限を書き換えるのが chmod です。
指定のしかたは 2 通りあります。3 桁の数字で丸ごと置き換えるやり方と、記号で 1 つだけ足し引きするやり方です。
数字は「今の状態を捨てて、この形にする」
ターミナル
$ ls -l id_ed25519
-rw-r--r-- 1 user user 411 May 20 12:00 id_ed25519
$ chmod 600 id_ed25519
$ ls -l id_ed25519
-rw------- 1 user user 411 May 20 12:00 id_ed255193 桁は左から所有者、グループ、その他で、各桁は読み 4 と書き 2 と実行 1 の合計でした。600 は「所有者だけ読み書きできて、他の人は何もできない」です。秘密鍵や .env のように自分しか見てはいけないファイルは、この形にします。
数字での指定は、元の状態を一切参照しません。3 桁を書いた瞬間に、9 個の権利が全部その通りに上書きされます。だから確実ですが、意図しないものまで巻き込みます。
記号は「今の状態に足す・引く」
ターミナル
chmod u+x backup.sh # 所有者に実行の権利を足す
chmod g-w config.yml # グループから書き込みの権利を取り上げる
chmod o= secrets.env # その他の人の権利を空にするu が所有者、g がグループ、o がその他、a が全員です。+ が追加、- が削除、= がそのブロックだけの丸ごと指定になります。触っていないブロックはそのまま残るので、1 つだけ直したいときは記号のほうが安全です。
ディレクトリごと変えるときは型で分ける
ターミナル
find /srv/app -type f -exec chmod 640 {} +
find /srv/app -type d -exec chmod 750 {} +chmod -R で配下をまとめて変える手もありますが、ファイルとディレクトリでは必要な権利が違います。ディレクトリには中に入るための x が要るのに、ファイルには要りません。-R で同じ値を配ると、全部のファイルが実行できる状態になるか、全部のディレクトリに入れなくなるかのどちらかです。find で型を分けてから当てると、この取り違えが起きません。
動かないときの逃げ道として
chmod 777が出てくることがありますが、これは「このマシンに入れる全員が、そのファイルを書き換えてよい」という意味です。Web から見えるディレクトリを 777 にすると、外から置かれたスクリプトがそのまま実行できる状態になります。足りない権利がどれなのかをls -lで確かめて、その 1 つだけを足してください。
課題
- chmod で 755 に変更する
- chmod で 644 に再変更する
- stat -c '%a' で権限の数値を確認する