こんにちは、Bash玄(ばっしゅげん)です。
Linuxサーバーの構築や日々の運用保守、シェルスクリプトの自動化を進めていると、誰もが一度は次のような権限トラブルに直面します。
- 作成したシェルスクリプトを実行しようとしたら
-bash: ./deploy.sh: Permission deniedと怒られて動かない - Webサーバー(Nginx / Apache)を立ち上げたのに
403 Forbiddenが画面に出てサイトが表示されない - SSHでサーバーにログインしようとしたら
Permissions 0644 for '~/.ssh/id_rsa' are too openと警告され接続拒絶された
そんなとき、エラーメッセージの意味を調べず 「動かないからとりあえず chmod 777」 に設定して急場をしのいでいませんか?確かに chmod 777 を実行すれば動くようにはなりますが、本番サーバーでは重大な情報漏洩やマルウェア感染、サーバー乗っ取りを招く極めて危険な禁忌の操作です。
本記事の目的は、現場エンジニアの 「脳死777からの卒業」 です。Linuxにおけるアクセス権限(パーミッション)の基本構造から、「755」や「644」という数字が何を意味しているのかという8進数の計算ロジック、日常のスクリプト実行で多用する chmod +x などの記号モード、そして初心者が必ずハマる -R(再帰的変更)オプションの罠と find コマンドを連携させたプロの安全な分離設定テクニックまで、実例を交えて完全解説します。
【結論】今すぐ使える定番chmodコマンド集
まずは「今すぐトラブルを解決したい」「よく使うコマンドを手元に置いておきたい」という方のために、現場で毎日のように使われる鉄板の chmod コマンドを3つ厳選してまとめました。
シェルスクリプトを実行可能にする(chmod +x script.sh)
エディタで新しく作成したシェルスクリプト(.sh)は、デフォルトでは実行権限が付与されていません。そのため、そのまま実行しようとすると Permission denied エラーになります。これを実行可能にするコマンドが chmod +x です。
# 1. 最短で実行権限を付与する(全員に実行権限を付与)
chmod +x deploy.sh
# 2. 【現場推奨】自分(所有者)だけに実行権限を付与する(最小権限の原則)
chmod u+x deploy.sh
# スクリプトを実行する
./deploy.sh
実務においては、セキュリティ(最小権限の原則)を考慮し、実行権限を自分だけに限定する chmod u+x を使う習慣をつけておくとより安全です。
Web公開ファイルの標準設定(ファイルは644、ディレクトリは755)
Webサーバー(Nginx / Apache)でWebサイトやHTML・画像を一般公開する場合の業界標準設定は、 「ディレクトリは755、ファイルは644」 です。
# 公開ディレクトリの設定(所有者は読み書き実行、他者は閲覧・通過可能)
chmod 755 /var/www/html/public
# 公開ファイルの設定(所有者は読み書き可能、他者は閲覧のみ)
chmod 644 /var/www/html/public/index.html
ディレクトリに 755 を与えることでWebサーバープロセスや外部アクセスがディレクトリ内を通過(cd)できるようになり、ファイルに 644 を与えることで不正な改ざんを防ぎつつ安全にWebページを配信できます。通常の静的ファイルに不要な実行権限(x)を与えないことが重要な防御策になります。
SSH秘密鍵のパーミッション保護(chmod 600 / 400)
SSH接続で使用する秘密鍵ファイル(id_ed25519 や id_rsa、クラウドの .pem)は、パーミッションが緩すぎるとOpenSSHクライアントが警告を出し、接続を強制切断します。
# SSH秘密鍵を所有者のみ読み書き可能にする(一般的な秘密鍵設定)
chmod 600 ~/.ssh/id_ed25519
# AWS EC2などのpemキーを読み取り専用で保護する(誤編集・誤削除防止)
chmod 400 ~/.ssh/my-aws-key.pem
# SSH設定ディレクトリ自体も他者のアクセスを遮断する
chmod 700 ~/.ssh
秘密鍵は 600(所有者のみ読み書き可)または 400(所有者のみ読み取り可)に設定するのが絶対の鉄則です。.ssh ディレクトリ本体も 700 に制限しておきましょう。
Linuxのパーミッション(アクセス権限)の仕組みと確認方法
chmod コマンドを自在に使いこなすためには、まずLinuxがどのようにファイルやディレクトリのアクセス権限を管理しているのか、その仕組みを正しく把握しておく必要があります。
ls -l コマンドで権限を確認する(-rwxr-xr-x の読み解き方)
ターミナルで ls -l コマンドを実行すると、ファイルの詳細情報が一覧表示されます。その一番左側に表示されている10文字の文字列がパーミッション情報です。
-rwxr-xr-x 1 webuser developers 4096 Sep 6 12:00 deploy.sh ┬───┬───┬───┐ │ │ │ └─ ③ その他(Others)の権限 : r-x(読み取り・実行) │ │ └───── ② グループ(Group)の権限 : r-x(読み取り・実行) │ └───────── ① 所有者(User)の権限 : rwx(読み取り・書き込み・実行) │ └───────────── 先頭1文字:ファイル種別(- 通常ファイル, d ディレクトリ, l リンク)
この10文字は、 「先頭1文字(ファイル種別)」 と 「続く9文字(3文字×3組の権限区分)」 に明確に分解できます。
- 先頭1文字(ファイル種別) :ハイフン
-はテキストやスクリプトなどの「通常ファイル」、dは「ディレクトリ(フォルダ)」、lは「シンボリックリンク(ショートカット)」を表します。 - 続く9文字(権限区分) :3文字ずつ区切られ、左から順に「所有者」「所有グループ」「その他」に対する権限を表しています。
「誰に」権限を与えるか:所有者(u)・グループ(g)・その他(o)・全員(a)
Linuxは複数人が同時に利用することを前提としたマルチユーザーOSです。そのため、アクセスする対象者を以下の4つの区分に分類して権限を定めています。
| 区分 | 対象者 | 記号 | 実務における役割と意味 |
|---|---|---|---|
| 第1群(1〜3文字目) | 所有者(User) | u | ファイルを作成した本人(オーナー)。最も強い操作権限を持ちます。 |
| 第2群(4〜6文字目) | 所有グループ(Group) | g | ファイルに所属するグループのメンバー全員。プロジェクトチーム内での共同作業用。 |
| 第3群(7〜9文字目) | その他(Others) | o | 所有者でもなく、指定グループにも属さない第三者(システム上の一般ユーザー)。 |
| 全体指定 | 全員(All) | a | 上記3つ(u + g + o)のすべて。記号モードで対象を省略した際の初期値。 |
「何を」許可するか:読み取り(r=4)・書き込み(w=2)・実行(x=1)
各ユーザー区分に対して設定できる基本権限は以下の3種類です。ここで重要なのは、 「ファイルに対する権限」と「ディレクトリに対する権限」で意味が大きく異なる という点です。
| 記号 | 権限名 | 8進数値 | 通常ファイルに対する意味 | ディレクトリに対する意味 |
|---|---|---|---|---|
r | 読み取り(Read) | 4 | ファイル内容の閲覧・コピー(cat, less, cp) | 配下のファイル一覧の取得(ls) |
w | 書き込み(Write) | 2 | ファイル内容の編集・上書き・保存(vim, echo >) | 配下のファイル新規作成・削除・名前変更(touch, rm, mv) |
x | 実行(eXecute) | 1 | プログラムやスクリプトとして実行(./script.sh) | ディレクトリの中に入り通過する権利(cd) |
- | 権限なし | 0 | 該当の操作を一切許可しない | 該当の操作を一切許可しない |
特にディレクトリにおける x 権限は「実行」ではなく 「ディレクトリの中に入る権利(通過権)」 であるという点をしっかり頭に入れておきましょう。この違いが後ほど解説する大きなトラブル回避の鍵になります。
chmodコマンドの2つの指定方法(数値モード vs 記号モード)
chmod(change mode)コマンドには、アクセス権限を指定する方法として 「数値モード(8進数指定)」 と 「記号モード(シンボリック指定)」 の2通りが存在します。それぞれの仕組みと特徴を理解しましょう。
1. 数値モード(8進数):rwxの数値を足し算して一括指定する
数値モードは、chmod 755 sample.sh のように3桁(または4桁)の数字で権限を指定する方法です。この数字は丸暗記するものではなく、 「4・2・1 の足し算」 で計算します。
各権限には2進数のビットフラグに対応した数値が割り当てられています。
r(読み取り) = 4 (2の2乗)w(書き込み) = 2 (2の1乗)x(実行) = 1 (2の0乗)-(権限なし) = 0
これらを足し合わせることで、0から7までの数値で1つのグループの権限を完全に表現できます。
| 数値 | 計算ロジック(足し算) | 記号表記 | 許可されるアクセス操作 |
|---|---|---|---|
| 7 | 4 (r) + 2 (w) + 1 (x) | rwx | 読み取り + 書き込み + 実行(フルアクセス権限) |
| 6 | 4 (r) + 2 (w) + 0 (-) | rw- | 読み取り + 書き込み(一般ファイルの作成・編集) |
| 5 | 4 (r) + 0 (-) + 1 (x) | r-x | 読み取り + 実行(スクリプト実行、ディレクトリ通過) |
| 4 | 4 (r) + 0 (-) + 0 (-) | r-- | 読み取り専用(リードオンリー) |
| 3 | 0 (-) + 2 (w) + 1 (x) | -wx | 書き込み + 実行(極めて特殊なドロップボックス等) |
| 2 | 0 (-) + 2 (w) + 0 (-) | -w- | 書き込み専用(ログ追記専用など) |
| 1 | 0 (-) + 0 (-) + 1 (x) | --x | 実行・通過のみ(内部の探索のみ許可) |
| 0 | 0 (-) + 0 (-) + 0 (-) | --- | 完全アクセス拒否(権限なし) |
この1桁の計算を「所有者」「グループ」「その他」の順に3つ並べたものがパーミッション数値です。
- 755 の場合 :所有者=7 (4+2+1:
rwx)、グループ=5 (4+0+1:r-x)、その他=5 (4+0+1:r-x) ⇒-rwxr-xr-x - 644 の場合 :所有者=6 (4+2+0:
rw-)、グループ=4 (4+0+0:r--)、その他=4 (4+0+0:r--) ⇒-rw-r--r-- - 600 の場合 :所有者=6 (4+2+0:
rw-)、グループ=0 (0+0+0:---)、その他=0 (0+0+0:---) ⇒-rw-------
2. 記号モード:対象者と演算子(+, -, =)で部分的に変更する
記号モードは、アルファベット記号を組み合わせて「誰の」「どの権限を」「どう変更するか」を直感的に指定する方法です。
構文:chmod [対象] [演算子] [権限] ファイル名 実例:chmod u + x script.sh
記号モードは以下の3つの要素で構成されます。
| 要素 | 記号 | 名称・意味 | 解説 |
|---|---|---|---|
| ① 対象(誰に) | u | User | ファイルの所有者本人のみ。 |
g | Group | ファイルが属するグループメンバー。 | |
o | Others | 所有者でもグループでもない第三者。 | |
a | All | 全員(u + g + o)。省略時のデフォルト。 | |
| ② 演算子(どうする) | + | 追加付与 | 現在の権限を維持したまま、指定した権限を足す。 |
- | 剥奪削除 | 現在の権限から、指定した権限のみを取り消す。 | |
= | 完全固定 | 指定した権限に完全に上書き設定する(未指定は剥奪)。 | |
| ③ 権限(何を) | r | Read | 読み取り権限。 |
w | Write | 書き込み権限。 | |
x | eXecute | 実行権限。 | |
X | 特殊実行権限 | ディレクトリ、または既に実行権限があるファイルのみにxを付与。 |
実務でよく使われる記号モードの具体例を確認してみましょう。
# 1. 所有者に実行権限を追加する
chmod u+x build.sh
# 2. グループに書き込み権限を追加する(チーム開発用)
chmod g+w /var/project/shared
# 3. その他(第三者)からすべての権限を剥奪する(機密保護)
chmod o-rwx secret.json
# 4. カンマ区切りで複数の権限を同時に設定する
# 所有者はrwx、グループはrx、その他はアクセス不可(空)
chmod u=rwx,g=rx,o= deploy.sh
# 5. 全員から書き込み権限を奪って読み取り専用にする
chmod a-w config.yml
数値モードと記号モードの使い分け基準
数値モードと記号モードにはそれぞれの強みがあります。実務では以下の基準で使い分けるのが鉄則です。
| 指定方式 | 主なメリット | 適している実務シーン |
|---|---|---|
| 数値モード(8進数) | 3桁の数字で「所有者・グループ・他者」の権限を一度に確定できる | ・新規ファイルやディレクトリの初期権限設定 ・Webサーバーの公開設定(644/755) ・Ansible、Dockerfile、構築スクリプトなどの自動化コード |
| 記号モード(記号) | 既存の権限状態を崩さずに、特定の権限だけをピンポイントで追加・削除できる | ・スクリプト作成後に実行権限だけを足したいとき(chmod +x)・第三者の権限だけを安全に剥奪したいとき( chmod o-w)・ターミナルで手動でサッと微調整したいとき |
よく使われるパーミッション数値の意味と使い分け一覧表
Linuxの実務で登場するパーミッション数値は限られています。以下のマトリクス早見表をブックマークしておけば、権限設計で迷うことはありません。
| 数値 | 記号表記 | 推奨される主な対象 | 実務における設計理由 |
|---|---|---|---|
| 755 | rwxr-xr-x | シェルスクリプト、Web公開ディレクトリ、公開コマンド | 所有者は自由に変更・実行可能。他者は閲覧と実行・通過が可能。公開ディレクトリや共有プログラムの標準。 |
| 644 | rw-r--r-- | HTML・CSS・画像、設定ファイル、ドキュメント | 所有者のみ編集可能で、他者は閲覧のみ。改ざんを防止しつつ安全に公開するファイルの標準。 |
| 700 | rwx------ | SSH設定ディレクトリ(~/.ssh)、個人作業フォルダ | 所有者本人のみが出入り・操作可能。他者のアクセスを一切許さない機密管理用。 |
| 600 | rw------- | SSH秘密鍵(id_rsa)、環境変数ファイル(.env) | 所有者本人のみが読み書き可能。他者からの閲覧を完全拒否。秘密鍵の必須権限。 |
| 400 | r-------- | AWS秘密鍵(.pem)、バックアップアーカイブ | 所有者本人も読み取り専用。誤った編集や誤削除(rm)を物理的に防ぐセーフティ設定。 |
| 750 / 640 | rwxr-x--- / rw-r----- | 社内プロジェクトディレクトリ、システムログファイル | 特定グループ内のエンジニア間のみで共有し、一般ユーザーには存在すら秘匿したい設定。 |
| 775 / 664 | rwxrwxr-x / rw-rw-r-- | チーム共有ディレクトリ、Gitリポジトリ公開領域 | グループメンバー全員がファイルの追加・編集・削除を行えるようにするチーム開発設定。 |
| 777 | rwxrwxrwx | 【原則使用禁止】 一時検証環境の特定パイプ等 | 誰でも読み書き・削除・実行が可能。セキュリティ上の重大な穴となる危険設定。 |
755(所有者フル・他者は読取実行:プログラム・公開ディレクトリ)
755 は、所有者が全権限(読み取り r、書き込み w、実行 x)を持ち、グループおよびその他には「読み取り r」と「実行 x」のみを許可する設定です。
システム全体で共有するコマンド群(/usr/local/bin)や、Webサーバーのドキュメントルート(/var/www/html)など、 「第三者に中身を書き換えられたくはないが、プログラムとして動かしてほしい・中を通過して配下のファイルを読み込んでほしい」 というケースで採用されます。
644(所有者読書・他者は読取のみ:一般的な設定ファイル・Web公開ファイル)
644 は、所有者が読み書き(rw-)でき、グループおよびその他は読み取りのみ(r--)許可する設定です。実行権限(x)は誰にも与えられていません。
Webサイトに配置するHTML・CSS・JavaScript・画像ファイルや、Linuxシステムの設定ファイル(/etc/hosts など)の標準パーミッションです。第三者からの不正なファイル改ざんやスクリプトとしての不正実行を完全に防ぎます。
700 / 600(所有者のみアクセス:秘密鍵・環境変数ファイル)
700(ディレクトリ用)と 600(ファイル用)は、グループおよびその他の権限をすべてゼロ(---)にして、所有者本人以外を完全にシャットアウトする設定です。
データベースのパスワードやAPIシークレットが記載された .env ファイル、SSL証明書の秘密鍵ファイル、そして ~/.ssh ディレクトリ配下のファイルは、必ずこの設定で保護しなければなりません。マルチユーザー環境のサーバーでは、権限が 644 のままだと同じサーバーにログインできる別ユーザーに秘密情報が丸見えになってしまいます。
【警告】なぜ chmod 777 を安易に設定してはいけないのか?(重大なセキュリティリスク)
開発中やトラブルシューティング時、権限エラーが出た際に「よくわからないから chmod 777 にしてしまえ」と設定してしまうケースが後を絶ちません。しかし、 777(rwxrwxrwx)は 「サーバー上のすべてのユーザー・プロセスに対して、ファイルの改ざん・削除・任意プログラムの実行を無条件で許可する」 という極めて危険な状態を意味します。
もしWeb公開ディレクトリやアップロード用フォルダを 777 にしてしまうと、以下のような重大事故が発生します。
- Webシェル(バックドア)の設置とサーバー乗っ取り :Webアプリケーションのわずかな脆弱性を突かれ、悪意あるPHPスクリプト等をアップロード・実行されてサーバー全体を遠隔操作されます。
- データ改ざんや踏み台化 :既存のファイルが書き換えられ、フィッシング詐欺サイトへのリダイレクトや他社サーバーへのDDoS攻撃の踏み台に利用されます。
- バグによる全データ喪失 :自作スクリプトのバグや誤操作が発生した際、権限の防波堤が一切存在しないため、システム領域を含む全ファイルが巻き添えで削除・破壊されます。
現場における鉄則は、 「権限エラーが出たときは chmod で権限を広げるのではなく、chown で適切な所有者・グループに合わせる」 ことです。後述する chown との正しい切り分けを徹底しましょう。
ディレクトリとファイルにおける「実行権限(x)」の決定的な違い
パーミッションを学ぶ上で、初心者が最も混乱し、かつ実務で致命的な事故につながりやすいのが 「実行権限(x)」の役割の違い です。ファイルに対する x と、ディレクトリに対する x は、全く異なる意味を持っています。
ファイルの実行権限=「プログラムやスクリプトとして実行できる」
ファイルに対する x 権限は直感的です。Linuxのカーネルに対して、 「このファイルをメモリにロードしてプロセスとして実行してよい」 という許可を与えるフラグです。
# 実行権限がないファイル(-rw-r--r--)
./sample.sh
# 出力結果: -bash: ./sample.sh: Permission denied
# chmod +x で実行権限を付与(-rwxr-xr-x)
chmod +x sample.sh
./sample.sh
# 出力結果: 正常に実行完了
なお、bash sample.sh や python3 script.py のようにインタプリタの引数として直接ファイルを渡す場合は、インタプリタ自身がファイルを「読み取る(r)」だけなので実行権限(x)がなくても動いてしまいます。しかし、./sample.sh のようにスクリプト自身をコマンドとして直接実行するためには、必ず x 権限が必要です。
ディレクトリの実行権限=「ディレクトリの中に入ることができる(cdできる・配下のファイルにアクセスできる)」
一方、ディレクトリに対する x 権限は「プログラムの起動」ではありません。 「そのディレクトリの中に入り、通過して配下のファイルやサブディレクトリを探索する権利(Search / Traverse Bit)」 を意味します。
この仕様を理解するために、ディレクトリの r(読み取り)と x(実行)の組み合わせによる挙動の違いを比較してみましょう。
| ディレクトリの権限 | cd で中に入れるか | ls でファイル名一覧が見えるか | 配下のファイルを開けるか(cat等) |
|---|---|---|---|
| r-x(読み取り+実行) | ○ 入れる | ○ 見える | ○ 開ける (ファイル自身の権限による) |
| r–(読み取りのみ / xなし) | × 入れない | △ ファイル名一覧のみ表示 | × 一切開けない(属性取得も不可) |
| –x(実行のみ / rなし) | ○ 入れる | × 一覧は見えない | ○ ファイル名を知っていれば開ける |
| —(権限なし) | × 入れない | × 見えない | × 一切アクセス不可 |
特に注目すべきは「r--(xなし)」の状態です。ディレクトリから x 権限を奪ってしまうと、cd コマンドで中に入ることができなくなるだけでなく、配下にあるファイルを開くことも一切できなくなります。
# 実験:ディレクトリから実行権限(x)を剥奪してみる
chmod 644 my_folder
# 1. cd で中に入ろうとすると拒否される
cd my_folder
# 出力結果: -bash: cd: my_folder: Permission denied
# 2. ls を実行するとファイル名は出るが、属性情報が全て「?」になり中身を読めない
ls -l my_folder
# 出力結果:
# ls: cannot access 'my_folder/app.py': Permission denied
# -????????? ? ? ? ? ? app.py
# 3. 中のファイルを直接読もうとしても弾かれる
cat my_folder/app.py
# 出力結果: cat: my_folder/app.py: Permission denied
このように、ディレクトリの x 権限はすべてのアクセスの大前提となる 「関所」 の役割を果たしています。この本質を理解していないと、次章で解説する「初心者の大惨事」を引き起こすことになります。
実務で役立つ応用テクニックとオプション
多数のファイルやディレクトリを一括でまとめて変更したい場合、chmod のオプションや他コマンドとの組み合わせが不可欠です。しかし、そこには初心者を待ち受ける危険な罠があります。
-R オプションによるディレクトリ配下の再帰的一括変更
-R(大文字、--recursive)オプションを使用すると、指定したディレクトリだけでなく、その配下に存在するすべてのサブディレクトリとファイルを再帰的に一括変更できます。
# 指定ディレクトリ配下をすべてまとめて変更する構文
chmod -R 755 /path/to/directory
コマンド1行で階層下の全オブジェクトに権限を適用できるため大変便利ですが、この -R を不用意に実行すると取り返しのつかない事故につながります。
【初心者の大惨事】chmod -R 644 を実行するとディレクトリに入れなくなる理由
インフラ現場で新人が起こすトラブルの定番ナンバーワンが、 「Webルート配下で chmod -R 644 を実行してサイトを落とす事故」 です。
この事故は、「公開ファイルに実行権限を付けたくないから、安全のために全ファイルを 644 にしよう」という善意から起こります。しかし、 chmod -R 644 を実行した瞬間、ファイルだけでなく 配下のすべてのディレクトリからも実行権限(x)が一斉に剥奪されます 。
前章で解説した通り、ディレクトリの x 権限は「中に入る権利(通過権)」です。ディレクトリの x が奪われた結果:
- エンジニア自身が
cdコマンドでサブディレクトリ内に移動できなくなる - Webサーバー(Nginx / Apache)がディレクトリを走査できなくなり、全ページが即座に
403 Forbiddenで完全ダウンする - FTPやデプロイツールからのアクセスもすべて拒絶される
さらに厄介なことに、ディレクトリに入れないため、復旧しようと焦って階層下でコマンドを打とうとしても権限エラーで阻まれてしまいます。「ファイルは644にしたいけれど、ディレクトリは755のまま保ちたい」。この要求を満たすためにはどうすればよいでしょうか?
【プロの解決策】findコマンドで「ディレクトリは755、ファイルは644」に一括分離設定する
この惨事を未然に防ぎ、ディレクトリとファイルを完璧に分離して一括設定する現場のベストプラクティスが、 「find コマンドと chmod の連携ワンライナー」 です。
# 1. ディレクトリ(-type d)のみを検索して 755 に一括変更(コピペ推奨)
find . -type d -exec chmod 755 {} +
# 2. 通常ファイル(-type f)のみを検索して 644 に一括変更(コピペ推奨)
find . -type f -exec chmod 644 {} +
この2行を実行するだけで、対象ディレクトリの階層構造がどれほど深く複雑であっても、 「ディレクトリはすべて 755」「ファイルはすべて 644」 という理想的なセキュリティ設計が一瞬で完成します。
ここで重要なプロのこだわりが、末尾の {} + です。初心者はよく {} ; と書きがちですが、; は見つかったファイル1件ごとに chmod プロセスを個別に起動するため、数万ファイルある環境では処理に何分もかかってしまいます。一方、 {} + は引数をまとめて一度に渡すため、 数十万件のファイルがあっても数秒で超高速に完了 します。
【プロの代替テクニック:大文字「X」を使ったスマート一撃コマンド】
実は find コマンドを使わなくても、chmod 単体で大文字の X(条件付き実行権限)を活用することで、同様の安全な一括変更が可能です。
# ディレクトリには x を付け、通常ファイルには x を付けないスマートワンライナー
chmod -R u=rwX,go=rX /var/www/html
大文字の X は、「対象がディレクトリである場合」または「既に誰かに実行権限が付いているファイル」にのみ x を適用し、通常のテキストファイルには x を付与しないという非常に賢い仕様を持っています。こちらも知っておくとインフラ現場で重宝します。
よくあるエラーと対処法
chmod コマンドの実行時に遭遇しやすいエラーと、その根本原因および正しい切り分け手順を解説します。
Operation not permitted(権限不足)とsudoの利用
chmod を実行した際に最も多く発生するエラーが chmod: changing permissions of '...': Operation not permitted です。
# 一般ユーザーで他人のファイルを変更しようとした場合
chmod 644 /etc/nginx/nginx.conf
# 出力結果: chmod: changing permissions of '/etc/nginx/nginx.conf': Operation not permitted
このエラーが出る理由は単純明快です。Linuxでは、 「ファイルのパーミッションを変更できるのは、そのファイルの所有者(Owner)か、システム管理者(root)のみ」 と決められているからです。たとえグループ権限等でファイルへの「書き込み権限(w)」を持っていたとしても、所有者でない限り chmod で権限を変更することはできません。
# 対処法1: 管理者権限(sudo)を付与して実行する
sudo chmod 644 /etc/nginx/nginx.conf
# 対処法2: 自分の所有物であるべきファイルなら、chown で所有権を自分に移してから変更する
sudo chown $(whoami):$(whoami) project.conf
chmod 644 project.conf
なお、sudo を使っても変更できない場合は、ファイルシステムが読み取り専用(Read-only file system)でマウントされているか、chattr +i コマンドでイミュータブル(変更不可)属性が付与されている可能性があります。mount | grep " / " や lsattr ファイル名 で状態を確認してください。
chmod と chown の違い(権限を変更するchmod、所有者を変更するchown)
Linux初心者が混同しやすい2大コマンドが chmod と chown です。それぞれの役割と違いを明確に整理しましょう。
| コマンド | 正式名称 | 変更する対象 | 主な構文・実行例 |
|---|---|---|---|
chmod | change mode | ファイルやディレクトリの アクセス権限(r, w, x) | chmod 755 script.shchmod +x deploy.sh |
chown | change owner | ファイルやディレクトリの 所有者(ユーザー)と所有グループ | chown nginx:nginx file.txtchown -R www-data:www-data /var/www |
実務で「Webサーバーに画像をアップロードしようとしたら権限エラーになった」「WordPressのプラグイン更新が失敗した」という場合、真っ先に疑うべきは chmod ではなく chown です。
ファイルのパーミッションが適切な 644 や 755 になっていても、所有者が root や個人ユーザーのままになっていると、Webサーバーの実行ユーザー(www-data や nginx)からは「その他(Others)」として扱われて書き込みが拒絶されます。ここで chmod 777 にして無理やり解決するのではなく、 「chown でWebサーバー実行ユーザーに所有権を正しく渡す」 のがセキュリティを保つプロの鉄則です。
# 悪い例: 動かないからといって全開放してしまう(セキュリティ崩壊)
chmod -R 777 /var/www/html/uploads
# 正しい例: Webサーバー実行ユーザー(例: www-data)に所有権を合わせる
sudo chown -R www-data:www-data /var/www/html/uploads
chmod -R 755 /var/www/html/uploads
まとめ & 関連記事
chmod コマンドは、Linuxサーバーのセキュリティを担保し、トラブルなく安定運用するための最も基本的かつ重要なツールです。最後に実務の要点を3つに整理します。
- 8進数は「4 (r) + 2 (w) + 1 (x)」の足し算 :仕組みさえ理解すれば暗記は不要。実務の鉄板は 「ディレクトリは755」「ファイルは644」「秘密情報は600」 です。
- 「動かないからとりあえず chmod 777」は絶対NG :重大なセキュリティ事故の温床。権限を広げる前に
chownで所有者を合わせるのが現場の鉄則です。 - ディレクトリ配下の一括変更は find 連携を活用 :ディレクトリの
x権限(中に入る権利)を守るため、find . -type d -exec chmod 755 {} +とfind . -type f -exec chmod 644 {} +で安全に切り分けましょう。
あわせて読みたい関連記事
- 【Linuxコマンド一覧・早見表】実務で頻出する主要コマンド・オプション逆引き完全ガイド
ファイル操作からシステム管理、テキスト処理まで、現場で即座に役立つLinux主要コマンドを網羅したピラー記事です。 - chownコマンドの使い方完全ガイド|所有者・グループ変更の基本から実践まで
パーミッション変更と密接に関係する「ファイルの所有権(ユーザー・グループ)」を適切に管理するための必須ガイドです。 - シェルスクリプトとは?書き方の基本・シバン・実行方法から変数・制御構文まで解説
chmod +x で実行権限を与えたスクリプトを、実務で役立つ本格的な自動化スクリプトへと仕上げるための基礎講座です。 - Permission deniedの原因と直し方|6つの切り分け手順
どうしても権限エラーが解決しないときに、原因箇所をピンポイントで切り分けるための現場直伝チェックマニュアルです。 - findコマンドの使い方|ファイル検索・日付やサイズ指定・exec連携の完全ガイド
パーミッションの一括変更で大活躍した find コマンドの高度な検索条件と一括実行テクニックを徹底解説しています。

コメント