Linuxでは、すべてのファイルとディレクトリにパーミッション(権限)が設定されていて、「誰が読めるか・書けるか・実行できるか」が決まっています。「スクリプトを実行したらPermission deniedと言われた」「chmod 755って何の数字?」——こうした疑問は、パーミッションの仕組みが分かれば一気に解決します。権限を変更するコマンドがchmodです。
つまずきやすいのは、755や644という数値の意味と、rwxr-xr-xという表示の読み方です。どちらも「所有者・グループ・その他」の3者に対する「読み・書き・実行」の組み合わせで、仕組みはシンプルです。この記事では、実機のLinux(WSLのDebian)で実際に権限を変えながら、chmodとパーミッションを整理します。
- パーミッションは
ls -lで確認。rwxr-xr-xは所有者/グループ/その他の3組です。 r=読み(4)、w=書き(2)、x=実行(1)。足し算した数字が数値指定です。755=rwxr-xr-x(自分は全部・他は読みと実行)、644=rw-r–r–が定番です。- スクリプトを実行可能にするのは
chmod +x ファイルです。 - 実行権限がないと
Permission deniedになります。 - ディレクトリごと変えるには
-R(再帰)を付けます。
権限を確認するls -lを含む基本はよく使うLinuxコマンドまとめ、特定のファイルを探して一括変更するならfindコマンド(-exec)、出力の絞り込みはgrepコマンドもあわせて参考になります。
パーミッションの読み方(ls -l)
ファイルの権限はls -lで確認できます。先頭に表示される-rwxr-xr-xのような10文字が権限の情報です。最初の1文字がファイル種別、残り9文字が3文字×3組に分かれています。
ls -l run.sh # -rwxr-xr-x 1 user group 25 Jul 2 12:00 run.sh # 先頭10文字の内訳: # - ファイル種別(- はファイル、d はディレクトリ) # rwx 所有者(user)の権限 … 読み・書き・実行すべて可 # r-x グループ(group)の権限 … 読みと実行のみ # r-x その他(others)の権限 … 読みと実行のみ # r = read(読み) / w = write(書き) / x = execute(実行) # - は「その権限が無い」
実機でも、ファイルを作った直後は-rw-r--r--(所有者は読み書き・他は読みのみ)と表示されました。9文字を「所有者」「グループ」「その他」の3文字ずつに区切って読むのがコツです。それぞれr(読み)・w(書き)・x(実行)の3種類で、-はその権限が無いことを表します。この読み方さえ分かれば、rwxr-xr-xが「自分は全部できて、他の人は読みと実行だけ」だと即座に分かります。
数値指定の意味(755・644)
chmod 755の数字は、r=4・w=2・x=1の足し算です。3桁がそれぞれ「所有者・グループ・その他」に対応します。
# r=4 w=2 x=1 を足し算する # 7 = 4+2+1 = rwx(全部) # 6 = 4+2 = rw-(読み書き) # 5 = 4+1 = r-x(読みと実行) # 4 = 4 = r--(読みのみ) # 0 = = ---(権限なし) chmod 755 run.sh # rwxr-xr-x(スクリプト・公開ディレクトリの定番) chmod 644 memo.txt # rw-r--r--(通常のファイルの定番) chmod 600 id_rsa # rw-------(秘密鍵など自分だけ)
実機で確認したところ、chmod 755で-rwxr-xr-x、chmod 644で-rw-r--r--、chmod 600で-rw-------と、指定どおりに変わりました。数値は「所有者・グループ・その他」の順に、r=4・w=2・x=1を足した値を並べたものです。実務でよく使うのは3つで、755(スクリプトや公開ディレクトリ)、644(通常のファイル)、600(秘密鍵や設定など自分専用)です。WordPressなどのWeb公開でも、ディレクトリ755・ファイル644が基本とされます。777(誰でも読み書き実行)は「動かない時の応急処置」として紹介されがちですが、誰でも書き換えられてしまうセキュリティ上の危険な状態なので、安易に使わないでください。
記号での指定(+x・u+x・go-r)
数値のほかに、記号で「今の権限に足す・引く」指定もできます。+x(実行権限を足す)が代表で、「誰に」をu(所有者)・g(グループ)・o(その他)・a(全員)で指定できます。
# 実行権限を足す(スクリプトを実行可能にする定番) chmod +x run.sh # 所有者にだけ実行権限を足す chmod u+x run.sh # グループとその他から読み取り権限を外す chmod go-r secret.txt # 組み合わせ(カンマ区切り) chmod u+x,go-r run.sh
実機でも、chmod u+x,go-rを実行すると-rwx------(所有者に実行を足し、グループ・その他から読みを外した状態)になりました。記号指定は「u/g/o/a(誰に)」+「+/-(足す/外す)」+「r/w/x(何を)」の組み合わせです。数値指定が「全体を一括で設定」なのに対し、記号指定は「今の状態に対して一部だけ変更」できるのが利点です。chmod +xだけは丸暗記でよいほど頻出します。
実行権限がないとPermission denied
パーミッションの効果を実際に見てみます。実行権限(x)が無いスクリプトは、実行しようとするとPermission deniedになります。
# スクリプトを作成(作成直後は rw-r--r-- で x が無い) echo '#!/bin/bash echo hello' > run.sh ./run.sh # bash: ./run.sh: Permission denied ← 実行権限が無い # 実行権限を付けると動く chmod +x run.sh ./run.sh # hello
実機で確認したところ、作成直後のスクリプト(-rw-r--r--・実行権限なし)を./run.shで実行するとPermission deniedになり、chmod +x run.shを実行したあとはhelloと正常に動きました。「ダウンロードしたスクリプトが動かない」「自作のシェルスクリプトが実行できない」というときは、まずls -lでxが付いているかを確認してください。また、読み取り権限の効果も非rootユーザーで確認しました。chmod 600(所有者のみ読み書き)にしたrootのファイルを別のユーザーがcatするとPermission deniedになり、644に変えると読めるようになりました。なお、rootユーザーは読み書きの権限チェックをほぼ受けないため、rootで作業していると権限ミスに気づきにくい点にも注意してください(実行権限だけは、xが1つも無いとrootでも拒否されます)。
ディレクトリの権限と-R(再帰)
ディレクトリの場合、xは「実行」ではなく「中に入れるか(cdできるか)」を意味します。rは一覧表示(ls)、wはファイルの作成・削除です。ディレクトリごとまとめて変更するには-Rを付けます。
# ディレクトリの権限の意味
# r … 中のファイル一覧を見られる(ls)
# w … 中にファイルを作成・削除できる
# x … 中に入れる(cd)・中のファイルにアクセスできる
# ディレクトリ以下すべてを再帰的に変更
chmod -R 700 private_dir
# ファイルとディレクトリを分けて設定したいときは find と組み合わせる
find . -type d -exec chmod 755 {} \; # ディレクトリは755
find . -type f -exec chmod 644 {} \; # ファイルは644
実機でも、chmod -R 700 dを実行すると、サブディレクトリの中のファイルまで-rwx------に変わりました。-Rはディレクトリ以下のすべてに同じ権限を適用します。ただし、ファイルとディレクトリで適切な権限は違う(ディレクトリにはxが必要、ファイルには通常不要)ため、Web公開用などではfindの-typeと-execを組み合わせて「ディレクトリは755・ファイルは644」と分けて設定するのが定番です。
数値とrwxの対応一覧
よく使うパーミッションをまとめます。
| 数値 | 表示 | 用途の目安 |
|---|---|---|
755 |
rwxr-xr-x |
スクリプト・公開ディレクトリ |
644 |
rw-r--r-- |
通常のファイル(HTML・画像など) |
700 |
rwx------ |
自分専用のディレクトリ |
600 |
rw------- |
秘密鍵・パスワード入り設定 |
777 |
rwxrwxrwx |
誰でも全部(危険・原則使わない) |
よくある失敗
スクリプトがPermission deniedで動かない
実行権限がありません。chmod +x スクリプトを実行します。
数値の桁の意味を取り違える
3桁は左から「所有者・グループ・その他」です。754なら他人は読みのみです。
とりあえず777にする
誰でも書き換えられる危険な状態です。755や644など必要最小限にします。
ディレクトリからxを外して入れなくなる
ディレクトリのxは「中に入る」権限です。外すとcdもファイルアクセスもできません。
-Rでファイルにも755を付けてしまう
ファイルに実行権限は通常不要です。find -type f/dで分けて設定します。
よくある質問
rwxr-xr-xです。スクリプトや公開ディレクトリの定番の設定です。ls -lで確認し、chmod +x ファイル名で実行権限を付けてください。実機でも、xの無いスクリプトはPermission deniedになり、chmod +x後に正常に動くことを確認しています。xは「中に入れるか(cdできるか)・中のファイルにアクセスできるか」を表します。rは一覧表示(ls)、wは中のファイルの作成・削除です。ディレクトリからxを外すと、中のファイルにアクセスできなくなるので注意してください。chmod -R 数値 ディレクトリで、中のすべてに再帰的に適用されます。ただしファイルとディレクトリで適切な権限は違うため、find . -type d -exec chmod 755 {} \;とfind . -type f -exec chmod 644 {} \;のように分けて設定するのが確実です。まとめ
- 権限は
ls -lで確認。rwxr-xr-xは所有者/グループ/その他の3組です。 - 数値はr=4・w=2・x=1の足し算。
755・644・600が定番です。 - スクリプトの実行可には
chmod +x。xが無いとPermission deniedです。 - ディレクトリの
xは「中に入る」権限。-Rで再帰変更できます。 777は危険。必要最小限の権限にするのが基本です。
パーミッションは、Linuxのセキュリティの土台です。「r=4・w=2・x=1」「3桁は所有者・グループ・その他」というルールさえ覚えれば、755も644も自分で計算できます。Permission deniedに出会ったら、まずls -lで権限を確認する習慣をつけましょう。
