結論:chmod 755 は「所有者に読み・書き・実行(7)、グループとその他に読み・実行(5)」という意味です。数字は r=4 w=2 x=1 の足し算でできています。 そして Permission denied は、id(自分は誰か)と ls -l(対象は誰のもので、どんな許可が付いているか)の2つを突き合わせれば、ほとんどの場合その場で原因が特定できます。
パーミッションは「3人 × 3つの許可」の表
Linuxのファイルには、誰が・何をしていいかが必ず記録されています。ls -l を実行すると、各行の先頭に -rw-r--r-- のような10文字が出てきます。これがパーミッション(権限)です。
- rw- r-- r--
│ │ │ └ その他の人(other)
│ │ └───── グループ(group)
│ └────────── 所有者(user)
└────────────── 種類(- はファイル、d はディレクトリ)
先頭1文字は種類で、- なら通常のファイル、d ならディレクトリです。残りの9文字を3文字ずつ区切ると、所有者/グループ/その他という3つの立場に対応します。それぞれの3文字は次の意味です。
r(read)… 読めるw(write)… 書き換えられるx(execute)… 実行できる-… その許可が無い
つまり -rw-r--r-- は「ファイルで、所有者は読み書きでき、グループとその他は読むだけ」。-rwxr-xr-x は「所有者は何でも、他の人は読みと実行だけ」という表です。
この「3人」が誰を指すかは、ユーザーとグループの仕組みを知っていると腹落ちします。サーバーは複数人・複数プログラムで共有するものなので、user(あなた)、www-data(Webサーバーが使うユーザー)のように立場が分かれています。この前提は 「ユーザー・グループ・root ― サーバーは複数人で使う」 で図解しています。
実際に ls -l の出力を読んでみるところは 「ls -l ― 権限を読む」 で、ブラウザ内のシミュレートシェルにそのまま打ち込んで確認できます。環境構築もサーバーの契約も不要で、無料・登録不要です。
数字表記(755・644)はどう作られるか
rwx の文字表記と並んで、chmod 755 のような数字(8進数)表記が使われます。これは暗号ではなく、単純な足し算です。
| 許可 | 数字 |
|---|---|
r(読み) | 4 |
w(書き) | 2 |
x(実行) | 1 |
3つの立場それぞれについて、許可したいものを足して1桁にします。それを「所有者・グループ・その他」の順に3桁並べたのが 755 です。
7= 4+2+1 =rwx(所有者は読み書き実行)5= 4+0+1 =r-x(グループは読みと実行)5= 4+0+1 =r-x(その他も読みと実行)
同じ計算で 644 を分解すると、6 = 4+2 = rw-、4 = r--、4 = r-- となり、-rw-r--r-- になります。よく見る2つはこう覚えると実務では十分です。
- 644(rw-r—r—) … 設定ファイル、テキスト、HTMLなど「実行しないファイル」
- 755(rwxr-xr-x) … シェルスクリプト、実行ファイル、そしてディレクトリ
数字を覚えるより、r=4 / w=2 / x=1 の足し算だけ覚えるほうが応用が利きます。chmod +x(実行権だけ足す)と chmod 644(まとめて指定する)の両方の書き方は 「chmod ― 権限を変える」 で、ls -l の表示が変わる瞬間を見ながら試せます。権限を変えて、その場で結果を確認できるので、数字の意味が記憶に残ります。
ディレクトリの x は「実行」ではなく「通り抜け」
ここが初心者のいちばんの混乱ポイントです。ディレクトリにも rwx が付きますが、意味がファイルとは違います。
- ディレクトリの
r… 中のファイル名を一覧できる(lsができる) - ディレクトリの
w… 中にファイルを作る・消す・名前を変えることができる - ディレクトリの
x… そのディレクトリを通り抜けられる(cdで入る、中のファイルにパスでアクセスする)
だからディレクトリは 755 が基本です。x が無いディレクトリは、中身のファイルにいくら r が付いていても辿り着けません。「ファイル自体は読める権限なのに開けない」というときは、途中のディレクトリの x を疑ってください。
逆に、ディレクトリの w は思ったより強力です。ファイルを消せるかどうかはファイル自身の権限ではなく、そのファイルが置かれているディレクトリの w で決まります。読み取り専用のファイルでも、置き場所に書き込み権があれば削除できてしまう——これは知らないと事故のもとです。
Permission denied が出たときの確認手順
エラーメッセージが出たら、闇雲に sudo を付ける前に、次の順で確認します。4ステップで9割は原因が分かります。
1. 自分が誰かを確認する
whoami
id
id は uid=1000(user) gid=1000(user) groups=1000(user),27(sudo) のように、自分のユーザー名と所属グループを教えてくれます。「自分は sudo グループに入っているのか」もここで分かります。
2. 対象の権限と持ち主を確認する
ls -l 対象のファイル
10文字のパーミッションに加えて、所有者名とグループ名が表示されます。ステップ1と見比べて、自分がその3つの立場のどれに当たるかを確定させます。所有者でもグループの一員でもなければ、あなたに適用されるのは一番右のブロック(その他)です。
3. スクリプトなら実行権(x)があるか見る
./script.sh と打って 許可がありません と言われる場合、原因はほぼこれです。作ったばかりのファイルには実行権が付いていません。
chmod +x script.sh
ls -l script.sh
./script.sh
なお sh script.sh なら実行権がなくても動きます。前者はファイル自身をプログラムとして起動しているのに対し、後者は sh というプログラムがファイルを読んでいるだけだからです。この違いは 「シバンと実行権限 ― ./script.sh で動かす」 で、わざとエラーを出してから直す流れとして体験できます。
4. 本当に管理者権限が必要な操作かを考える
/etc 以下の設定ファイルやサービスの操作は、そもそも一般ユーザーには許されていません。この場合だけ sudo を使います。su(root に切り替わってそのまま居座る)と sudo(その1コマンドだけ管理者として実行する)の違いと使い分けは 「su と sudo ― 管理者権限を安全に借りる」 で、プロンプトが $ から # に変わる様子を見ながら確認できます。サーバー運用側の視点では 「sudoと権限 ― 管理者権限を安全に借りる」 でも扱っています。
この4ステップを踏まずに sudo を連打すると、「権限で弾かれた本当の理由」が見えないまま、あとで別の形で問題が再発します。エラーメッセージの読み方全般については エラーメッセージの読み方 もあわせてどうぞ。
chmod 777 を安易に使うべきでない理由
検索すると「とりあえず chmod 777 で動く」という書き込みが見つかります。実際、777 は「全員に読み書き実行を許可」なので、たいていの Permission denied は消えます。しかし、これは鍵を壊してドアを開けっぱなしにする行為です。
具体的に何が問題か。
- 誰でも書き換えられる。同じサーバーを使う他のユーザーや、乗っ取られた別のプロセスが、そのファイルを自由に改ざんできます。実行権まで付いていれば、改ざんされたコードがそのまま実行されます。
- 原因が隠れる。本当の原因が「所有者が違う」「ディレクトリの
xが無い」だった場合、777はそれを覆い隠すだけです。似た問題が別の場所で再発します。 - Webサーバーの公開ディレクトリでは特に危険。外部からアップロードされたファイルに実行権が付く構成は、侵入の足がかりになります。
正しい対処は、必要最小限の権限だけを与えることです(最小権限の原則)。多くの場合は次のどちらかで解決します。
- ファイルの持ち主を正しくする(所有者・グループを変える)
- 用途に合った
644/755を設定する
「動けばいい」で 777 を選ぶ癖がつくと、チーム開発や本番サーバーで確実に指摘されます。逆に、ls -l と id で理由を説明できる人は、それだけで信頼されます。
権限が分かると、自動化まで一直線
パーミッションの理解は、シェルスクリプトの世界への入場券でもあります。「スクリプトを書く → chmod +x する → ./script.sh で動かす → cron に登録して定期実行する」という流れの、最初の関門が権限だからです。
書いたスクリプトを動かす具体的な手順は シェルスクリプトコース の第1章で扱っています。エディタと端末が並んだ2画面構成で、権限を付ける操作もその場で試せます。
次に読む
- Linuxコース — 全24レッスン。第4章「ユーザーと権限」が本記事の内容にあたり、ls -l・chmod・su と sudo をブラウザ内シェルで実際に打てます。
- 「Linuxの地図 ― /etc /var /home /bin とは何か」 — 「どのディレクトリが誰のものか」を掴むと、権限エラーの見当がつくようになります。
- Linuxコマンド一覧|まず覚えるls・cd・mkdir — コマンド操作そのものが不安な人はこちらから。
- サーバーコース — 権限の話は SSH のハードニング(sshd_config)やファイアウォールへ繋がります。
- インフラエンジニア独学ロードマップ — Linux権限を、インフラ学習全体の中に位置づけたい人向け。