今回はLinuxコマンドであるchmodコマンドについて解説します
ファイルやディレクトリのパーミッション(権限)を変更するコマンドです
シェルスクリプトの「Permission denied」の解決やSSH鍵の設定など、サーバー構築で必ず使うのでぜひ覚えて帰ってくださいね!
※注 本文の△は半角スペースに置き換えてください。わかりやすくするために△で記述してます
chmodコマンドとは??
chmodコマンドは、ファイルやディレクトリのパーミッション(誰が・何をしてよいか)を変更するコマンドです
「change mode」の略から名付けられています
パーミッションを変更できるのは、そのファイルの所有者かrootユーザーだけです
chmod△644△/etc/hosts
実行結果:
chmod: changing permissions of ‘/etc/hosts’: Operation not permitted
この記事の実行結果は、GNU coreutils 9.4(Ubuntu 24.04)のchmodを一般ユーザー(user)で実行して確認しています
以降の例は、ホームディレクトリに作ったchmod-testディレクトリの中で、記事の順番どおりに実行しています
この環境のumaskは0002なので、新しく作ったファイルは-rw-rw-r–、ディレクトリはdrwxrwxr-xから始まります
mkdir△chmod-test
cd△chmod-test
umask
実行結果:
0002
mkdir△-p△dir1△d2△proj/src
printf△’#!/bin/bash\necho△Hello\n’△>△hello.sh
echo△memo△>△memo.txt
echo△secret△>△secret.txt
echo△a△>△d2/a.txt
echo△b△>△proj/b.txt
echo△a△>△proj/src/a.txt
echo△s△>△s.txt
echo△t△>△t.txt
echo△w△>△w.txt
chmod△600△s.txt
chmod△666△w.txt
cd△..
ls△-lR△chmod-test
実行結果:
chmod-test:
total 36
drwxrwxr-x 2 user user 4096 Nov 1 12:03 d2
drwxrwxr-x 2 user user 4096 Nov 1 12:03 dir1
-rw-rw-r– 1 user user 23 Nov 1 12:03 hello.sh
-rw-rw-r– 1 user user 5 Nov 1 12:03 memo.txt
drwxrwxr-x 3 user user 4096 Nov 1 12:03 proj
-rw——- 1 user user 2 Nov 1 12:03 s.txt
-rw-rw-r– 1 user user 7 Nov 1 12:03 secret.txt
-rw-rw-r– 1 user user 2 Nov 1 12:03 t.txt
-rw-rw-rw- 1 user user 2 Nov 1 12:03 w.txt
chmod-test/d2:
total 4
-rw-rw-r– 1 user user 2 Nov 1 12:03 a.txt
chmod-test/dir1:
total 0
chmod-test/proj:
total 8
-rw-rw-r– 1 user user 2 Nov 1 12:03 b.txt
drwxrwxr-x 2 user user 4096 Nov 1 12:03 src
chmod-test/proj/src:
total 4
-rw-rw-r– 1 user user 2 Nov 1 12:03 a.txt
cd△chmod-test
cat△hello.sh
実行結果:
#!/bin/bash
echo Hello
パーミッションの読み方
今のパーミッションはls -lで確認できます
ls△-l
実行結果:
total 36
drwxrwxr-x 2 user user 4096 Nov 1 12:03 d2
drwxrwxr-x 2 user user 4096 Nov 1 12:03 dir1
-rw-rw-r– 1 user user 23 Nov 1 12:03 hello.sh
-rw-rw-r– 1 user user 5 Nov 1 12:03 memo.txt
drwxrwxr-x 3 user user 4096 Nov 1 12:03 proj
-rw——- 1 user user 2 Nov 1 12:03 s.txt
-rw-rw-r– 1 user user 7 Nov 1 12:03 secret.txt
-rw-rw-r– 1 user user 2 Nov 1 12:03 t.txt
-rw-rw-rw- 1 user user 2 Nov 1 12:03 w.txt
左端の-rw-rw-r–の部分がパーミッションです
1文字目は種類(-はファイル、dはディレクトリ)で、残りの9文字を3文字ずつ「所有者(u)・グループ(g)・その他(o)」の順に読みます
r(read)は読み取り、w(write)は書き込み、x(execute)は実行で、付いていない権限は-になります
つまり-rw-rw-r–は「所有者とグループは読み書きOK、その他は読み取りだけOK」という意味です
ディレクトリの場合は意味が少し変わる
ディレクトリでは、rはファイル名一覧を見られる、wはファイルの作成・削除ができる(実際にはxも必要)、xはディレクトリに入れる・中のファイルにアクセスできる、という意味になります
特に大事なのがxで、rがあってもxがないと中のファイルを読めません
chmod△644△d2
ls△-l△d2
実行結果:
ls: cannot access ‘d2/a.txt’: Permission denied
total 0
-????????? ? ? ? ? ? a.txt
cat△d2/a.txt
実行結果:
cat: d2/a.txt: Permission denied
# xを付け直すと中のファイルを読めるようになる
chmod△755△d2
ls△-l△d2
実行結果:
total 4
-rw-rw-r– 1 user user 2 Nov 1 12:03 a.txt
cat△d2/a.txt
実行結果:
a
ディレクトリには基本的にxを付けると覚えておきましょう
chmodコマンドの主なオプション
chmodコマンドには便利なオプションがあります
| オプション | 意味 |
|---|---|
| -R (–recursive) | ディレクトリ配下をまとめて変更するオプション |
| -v (–verbose) | 処理したファイルの変更内容を表示するオプション |
| -c (–changes) | 実際に変更があったときだけ内容を表示するオプション |
| –reference | 他のファイルと同じパーミッションにするオプション(GNU版chmodのオプション) |
-R (–recursive)
ディレクトリ配下をまとめて変更するオプション
影響範囲が広いので、対象ディレクトリを必ず確認してから実行しましょう
chmod△-R△g-w△proj
ls△-lR△proj
実行結果:
proj:
total 8
-rw-r–r– 1 user user 2 Nov 1 12:03 b.txt
drwxr-xr-x 2 user user 4096 Nov 1 12:03 src
proj/src:
total 4
-rw-r–r– 1 user user 2 Nov 1 12:03 a.txt
# proj配下のファイルとディレクトリすべてから、グループの書き込み権限が外れました
-v (–verbose)
処理したファイルの変更内容を表示するオプション
変更前と変更後のパーミッションが数値と記号の両方で表示されます
chmod△-v△u+x△hello.sh
実行結果:
mode of ‘hello.sh’ changed from 0664 (rw-rw-r–) to 0764 (rwxrw-r–)
-c (–changes)
実際に変更があったときだけ内容を表示するオプション
-Rと組み合わせてchmod -Rcのようにすると、何が変わったかを記録に残せて安心です
chmod△-c△u+x△hello.sh
# すでにu+xが付いているので何も表示されません
chmod△-c△u-x△hello.sh
実行結果:
mode of ‘hello.sh’ changed from 0764 (rwxrw-r–) to 0664 (rw-rw-r–)
# 実際に変わったときだけ表示されます
–reference
他のファイルと同じパーミッションにするオプション(GNU版chmodのオプション)
「既存の設定ファイルと同じ権限にしたい」というときに便利です
ls△-l△s.txt
実行結果:
-rw——- 1 user user 2 Nov 1 12:03 s.txt
chmod△–reference=s.txt△t.txt
ls△-l△t.txt
実行結果:
-rw——- 1 user user 2 Nov 1 12:03 t.txt
基本的な使い方
chmodコマンドの基本的な構文は「chmod△オプション△モード△ファイル名」となります
モードの指定方法には、記号で指定する方法と数値で指定する方法の2種類があります
記号で指定する方法
「誰に」「どうする」「どの権限を」を組み合わせて書きます
誰には u(所有者)・g(グループ)・o(その他)・a(全員)、どうするは +(追加)・-(削除)・=(その権限ちょうどにする)、権限は r・w・x です
# シェルスクリプトに実行権限を付ける
./hello.sh
実行結果:
bash: ./hello.sh: Permission denied
chmod△u+x△hello.sh
ls△-l△hello.sh
実行結果:
-rwxrw-r– 1 user user 23 Nov 1 12:03 hello.sh
./hello.sh
実行結果:
Hello
# 所有者に実行権限が追加されて実行できるようになりました
# グループとその他から読み書きの権限を外す
chmod△go-rw△secret.txt
ls△-l△secret.txt
実行結果:
-rw——- 1 user user 7 Nov 1 12:03 secret.txt
# カンマで区切ってまとめて指定する
chmod△u=rwx,g=rx,o=△hello.sh
ls△-l△hello.sh
実行結果:
-rwxr-x— 1 user user 23 Nov 1 12:03 hello.sh
# o=のように何も書かなければ権限なしになります
chmod +x hello.shのように「誰に」を省略すると、umask(新規ファイルの権限を決める設定)で禁止されていない範囲で全員に付きます
一般的なumask 022の環境では、所有者・グループ・その他の全員にxが付いて-rwxr-xr-xになります
この記事の環境(umask 0002)で-rw-rw-r–のファイルに実行すると、-rwxrwxr-xになります
数値で指定する方法
各権限を r=4、w=2、x=1 の数字に置き換えて足し算し、「所有者・グループ・その他」の順に3桁並べます
rwxは7、r-xは5、rw-は6、r–は4、—は0です
例えば755は「所有者rwx、グループr-x、その他r-x」です
chmod△755△hello.sh
ls△-l△hello.sh
実行結果:
-rwxr-xr-x 1 user user 23 Nov 1 12:03 hello.sh
chmod△600△secret.txt
ls△-l△secret.txt
実行結果:
-rw——- 1 user user 7 Nov 1 12:03 secret.txt
# 今のパーミッションを数値で確認する
stat△-c△”%a△%A△%n”△hello.sh△secret.txt
実行結果:
755 -rwxr-xr-x hello.sh
600 -rw——- secret.txt
記号指定は「実行権限だけ足したい」など一部だけ変えたいとき、数値指定は「この設定にしたい」と最終形をまるごと指定したいときに便利です
数値指定は今の権限を全部上書きするので、変更前にls -lで確認するクセをつけましょう
chmodコマンドの実用的な活用例
実際の現場でよく使われるchmodコマンドの活用例をご紹介します
ディレクトリにだけ実行権限を付ける(大文字のX)
-Rで+xをすると普通のファイルにまで実行権限が付いてしまいます
大文字のXを使うと、ディレクトリ(と、もともと誰かに実行権限があるファイル)にだけxを付けられます
# 事前準備:違いがわかるように「その他」の権限をいったんすべて外しておく
chmod△-R△o=△proj
ls△-lR△proj
実行結果:
proj:
total 8
-rw-r—– 1 user user 2 Nov 1 12:03 b.txt
drwxr-x— 2 user user 4096 Nov 1 12:03 src
proj/src:
total 4
-rw-r—– 1 user user 2 Nov 1 12:03 a.txt
chmod△-R△o+rX△proj
ls△-lR△proj
実行結果:
proj:
total 8
-rw-r–r– 1 user user 2 Nov 1 12:03 b.txt
drwxr-xr-x 2 user user 4096 Nov 1 12:03 src
proj/src:
total 4
-rw-r–r– 1 user user 2 Nov 1 12:03 a.txt
# ファイルにはrだけ、ディレクトリにはrとxが付きます
Web公開ディレクトリの権限を整えるときなどに重宝します
よく使うパーミッションの定番
# 644(rw-r–r–)
# 一般的なファイル、設定ファイル、HTMLなど
# 755(rwxr-xr-x)
# ディレクトリ、実行するスクリプト
# 600(rw——-)
# SSHの秘密鍵、パスワードを書いたファイルなど本人以外に見せたくないもの
# 700(rwx——)
# ~/.sshディレクトリなど本人専用のディレクトリ
特にSSHの秘密鍵は、パーミッションが緩すぎるとsshコマンドが「UNPROTECTED PRIVATE KEY FILE!」という警告を出して鍵を使ってくれません
サーバー構築でハマりやすいポイントなので、chmod 600 ~/.ssh/id_ed25519のように設定しておきましょう(ファイル名は環境に合わせてください)
権限が緩すぎるファイルを探す
-Rで権限を変える前に、findコマンドで対象を洗い出しておくのもおすすめです
# 「その他」に書き込み権限が付いたものを探す
find△.△-perm△-o+w
実行結果:
./w.txt
chmodを使うときの注意点
「とりあえず777」は絶対にNG
うまく動かないときにchmod 777で全員に全権限を与えて解決しようとするのは、よくある失敗です
誰でも書き換え・実行できる状態になり、セキュリティ上とても危険です
必要な人に、必要な権限だけを付けるのが原則です
chmod -Rの実行場所には要注意
※sudo chmod -Rをルートディレクトリ(/)やシステムディレクトリに対して実行すると、OSが正常に動かなくなることがあります
元のパーミッションに戻すのは非常に大変です
実行前にpwdで今いる場所、ls -lで対象を確認し、sudoを付けるときは特に慎重に実行しましょう
本番環境で権限を変えるときは、変更前にls -lやstatの結果を残しておくと、問題が起きたときにすぐ戻せます
まとめ
いかがでしたでしょうか
今回はchmodコマンドについてまとめてみました
パーミッションは「所有者・グループ・その他」ごとのr(読み)・w(書き)・x(実行)で、記号指定は一部だけ変えるとき、数値指定は最終形を決めるときに便利です
r=4、w=2、x=1の足し算を覚えれば数値指定はかんたんです
-Rは影響範囲が広いので対象を確認してから実行し、「とりあえず777」は避けましょう
サーバー運用で毎日のように意識するものなので、ぜひマスターしてください!
