Ubuntu でファイルを扱っていると、必ずぶつかるのが「Permission denied」というエラーです。シェルスクリプトを書いたのに実行できない、SSH の鍵ファイルが読めないと怒られる——そのすべての原因はファイルのパーミッション設定にあります。
解決に使うコマンドが chmod です。結論から言うと、スクリプトに実行権限を付けるには chmod 755 ファイル名、SSH 秘密鍵を安全にするには chmod 600 ファイル名 を実行するだけです。
本記事では実際に Ubuntu 24.04 LTS(Docker 公式イメージ)で chmod を動かした実行結果を交えながら、数値指定・記号指定・再帰的変更まで体系的に解説します。
この記事のポイント
- パーミッションは「所有者 / グループ / その他」の3層で管理される
chmod 755でスクリプトを実行可能にできる(Ubuntu 24.04 実測済み)- 記号指定(
u+xなど)で現在の権限を維持したまま部分的に変更できる - SSH 秘密鍵は必ず
chmod 600、.sshディレクトリはchmod 700 chmod -Rでディレクトリも 644 にするとcdできなくなる落とし穴がある
目次
Linuxのパーミッションとは
Linux では、すべてのファイルやディレクトリに「誰が何をできるか」を定めたアクセス権限(パーミッション)が設定されています。Windowsと大きく異なる部分で、Ubuntu を使い始めると最初に戸惑うポイントです。
パーミッションは以下の3つの対象ごとに管理されます:
- u(user):ファイルの所有者
- g(group):ファイルのグループ
- o(other):それ以外の全員
それぞれに対して、次の3種類の権限が独立して設定できます:
- r(read):読み取り。ファイルの内容を見る。ディレクトリの場合は
lsで一覧表示できる - w(write):書き込み。ファイルの内容を変更する。ディレクトリの場合はファイルの作成・削除ができる
- x(execute):実行。スクリプトやプログラムを実行する。ディレクトリの場合は
cdで入れる
注意
ディレクトリへの x(実行)権限は「ディレクトリに入れるかどうか」を意味します。chmod 644 でディレクトリの x を消すと cd できなくなります。これは後述の「chmod -R の落とし穴」に直結する重要なポイントです。
パーミッション表示の読み方(rwxと数値)
ls -la を実行すると、ファイル一覧の先頭に -rw-r--r-- のような文字列が表示されます。これがパーミッション表記です。
-rw-r–r– 1 root root 23 Jun 13 09:28 /tmp/testscript.sh
この表示は左から順に次のように読みます:
-:ファイルの種別(-は通常ファイル、dはディレクトリ、lはシンボリックリンク)rw-:所有者(u)の権限:読み取り・書き込み可能、実行不可r--:グループ(g)の権限:読み取りのみr--:その他(o)の権限:読み取りのみ
数値(8進数)との対応
chmod では権限を3桁の数値で指定できます。r=4、w=2、x=1 として足し算します:
| 数値 | 記号 | 意味 | よく使う場面 |
|---|---|---|---|
| 755 | rwxr-xr-x |
所有者:全権限 / 他:読み取り・実行 | シェルスクリプト、ディレクトリ |
| 644 | rw-r--r-- |
所有者:読み書き / 他:読み取りのみ | 設定ファイル、テキストファイル |
| 700 | rwx------ |
所有者のみ全権限 | .ssh ディレクトリ |
| 600 | rw------- |
所有者のみ読み書き | SSH 秘密鍵 |
| 777 | rwxrwxrwx |
全員に全権限 | 正直、使う場面はほぼない(危険) |
chmod 数値指定の使い方
最もよく使うのが数値指定です。書式は chmod [数値] [ファイル名] です。実際に Ubuntu 24.04 LTS のコンテナで動かした結果を見てみましょう。
$ ls -la /tmp/testscript.sh
-rw-r–r– 1 root root 23 Jun 13 09:28 /tmp/testscript.sh
↑ 作成直後のデフォルトは 644
$ chmod 755 /tmp/testscript.sh
$ ls -la /tmp/testscript.sh
-rwxr-xr-x 1 root root 23 Jun 13 09:28 /tmp/testscript.sh
$ chmod 600 /tmp/testscript.sh
$ ls -la /tmp/testscript.sh
-rw——- 1 root root 23 Jun 13 09:28 /tmp/testscript.sh
$ chmod 000 /tmp/testscript.sh
$ ls -la /tmp/testscript.sh
———- 1 root root 23 Jun 13 09:28 /tmp/testscript.sh

これは Ubuntu 24.04 LTS(coreutils 9.4-3ubuntu6.2)の Docker 公式イメージで実際に実行した結果です。touch で作ったファイルはデフォルトで 644(-rw-r--r--)になります。chmod 755 を実行すると -rwxr-xr-x に変わり、実行権限が付きました。
スクリプトが実行できないときは、以下の2ステップで確認します:
bash: ./hello.sh: Permission denied
↑ 実行権限がない状態(実際のエラーメッセージ)
$ chmod +x hello.sh
$ ./hello.sh
Hello from LinuxLab!
Script executed at: 2026-06-13 09:29:14
Ubuntu 24.04 の Docker コンテナで実際に確認しました。Permission denied が出た直後に chmod +x を実行するだけでスクリプトが動きます。
chmod 記号指定の使い方
数値指定が「全部を上書き設定する」のに対して、記号指定は現在の権限を保ちながら部分的に変更できます。特定の権限だけ追加・削除したいときに便利です。
書式は chmod [対象][操作][権限] [ファイル名] です:
- 対象:
u(所有者)、g(グループ)、o(その他)、a(全員) - 操作:
+(追加)、-(削除)、=(指定値に設定) - 権限:
r、w、x
$ ls -la /tmp/myfile.txt
-rw-r–r– 1 root root 0 /tmp/myfile.txt ← 初期: 644
$ chmod u+x /tmp/myfile.txt # 所有者に実行権限を追加
-rwxr–r– 1 root root 0 /tmp/myfile.txt
$ chmod o-r /tmp/myfile.txt # その他から読み取りを削除
-rwxr—– 1 root root 0 /tmp/myfile.txt
$ chmod u=rwx,g=rx,o=r /tmp/myfile.txt # 複数同時設定
-rwxr-xr– 1 root root 0 /tmp/myfile.txt

Ubuntu 24.04 LTS(coreutils 9.4)で実際に実行した結果です。u+x で 644 から -rwxr--r-- に変わり、所有者の実行権限が追加されました。コンマ区切りで u=rwx,g=rx,o=r のように複数を同時指定することもできます。
よく使うパーミッション値一覧
実際の作業では、以下の4パターンが9割をカバーします:
| コマンド | パーミッション | 対象 | 理由 |
|---|---|---|---|
chmod 755 |
rwxr-xr-x |
シェルスクリプト、実行ファイル、ディレクトリ | 所有者は全権限。他ユーザーも実行できる |
chmod 644 |
rw-r--r-- |
設定ファイル、ソースコード、テキスト | 全員が読める、書けるのは所有者のみ |
chmod 700 |
rwx------ |
.ssh ディレクトリ、プライベートなフォルダ |
所有者しかアクセスできない(SSH 必須) |
chmod 600 |
rw------- |
SSH 秘密鍵、パスワードファイル | 所有者だけが読み書き(SSH 必須) |
chmod -R(再帰的変更)と注意点
ディレクトリ以下のファイルすべてに同じ権限を設定したいときは -R オプションを使います。ただし、よくある落とし穴があります。
$ chmod -R 644 /tmp/myproject/
drw-r–r– 4 root root 4096 myproject/ ← x がない = cd できない!
drw-r–r– 2 root root 4096 myproject/src/ ← 入れない!
# ✅ 正しい: ファイルとディレクトリを分けて設定
$ find /tmp/myproject -type d -exec chmod 755 {} \;
$ find /tmp/myproject -type f -exec chmod 644 {} \;
$ ls -laR /tmp/myproject/
drwxr-xr-x 4 root root 4096 myproject/ ← 755 (OK)
-rw-r–r– 1 root root 0 myproject/README.md ← 644 (OK)

Ubuntu 24.04 のコンテナで実際に確認しました。chmod -R 644 を実行するとディレクトリが drw-r--r--(644)になり、実行ビット(x)が消えてしまいます。ディレクトリの x は「cd で入れるか」を意味するので、これを消すとアクセス不能になります。
注意:chmod -R を使うときのルール
- ディレクトリには必ず x(実行)ビットが必要。
chmod -R 644は使わない - ファイルとディレクトリを分けるには
find -type f / -type dを使う - 一般的なWebファイルの設定:ファイル 644、ディレクトリ 755
SSH鍵とパーミッション(実践編)
VPS を借りて SSH で接続するときに、パーミッションが正しくないと「Permission denied (publickey)」エラーが出ます。Ubuntu 24.04 の openssh-client 9.6p1-3ubuntu13.16 で実際に確認した、正しいパーミッション設定を紹介します。
Generating public/private ed25519 key pair.
Your public key has been saved in ~/.ssh/id_ed25519.pub
$ ls -la ~/.ssh/
drwxr-xr-x 2 root root 4096 . ← 700 に変える必要あり
-rw——- 1 root root 399 id_ed25519 ← 600 は OK
-rw-r–r– 1 root root 95 id_ed25519.pub ← 644 は OK
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/id_ed25519
$ chmod 644 ~/.ssh/id_ed25519.pub
$ ls -la ~/.ssh/
drwx—— 2 sshuser sshuser 4096 . ← OK
-rw——- 1 sshuser sshuser 399 id_ed25519 ← OK
-rw-r–r– 1 sshuser sshuser 95 id_ed25519.pub ← OK

Ubuntu 24.04 LTS の Docker コンテナ(openssh-client 9.6p1-3ubuntu13.16)で実際に確認した結果です。SSH 接続が「Permission denied」になるときは、まず以下を確認してください:
| 対象 | 必要なパーミッション | コマンド | 理由 |
|---|---|---|---|
~/.ssh/ ディレクトリ |
700 (drwx------) |
chmod 700 ~/.ssh |
所有者以外からアクセス禁止(SSH の要件) |
SSH 秘密鍵 (id_ed25519) |
600 (-rw-------) |
chmod 600 ~/.ssh/id_ed25519 |
秘密鍵は所有者だけが読める必要あり |
SSH 公開鍵 (id_ed25519.pub) |
644 (-rw-r--r--) |
chmod 644 ~/.ssh/id_ed25519.pub |
公開鍵は読まれても問題ない |
authorized_keys |
600 (-rw-------) |
chmod 600 ~/.ssh/authorized_keys |
秘密鍵と同様に所有者だけ読み書き |
Ubuntu 22.04 と 24.04 の違い
coreutils(chmod が含まれるパッケージ)のバージョンが変わっていますが、基本的な chmod の動作に互換性の差異はありません。

ii coreutils 9.4-3ubuntu6.2 arm64 GNU core utilities
$ chmod –version | head -1
chmod (GNU coreutils) 9.4
Copyright (C) 2023 Free Software Foundation, Inc.
↑ Ubuntu 24.04 LTS の実測値(22.04 では coreutils 8.32)
Ubuntu 24.04 では coreutils 9.4(GPL 2023年版)、Ubuntu 22.04 では 8.32 です。umask のデフォルト(0022)も、新規ファイルのデフォルトパーミッション(644)も両バージョンで変わりません。どちらの Ubuntu で作業しても同じように chmod を使えます。
よくあるエラーと解決策
①「Permission denied」— root 権限が必要なファイルへの操作
chmod: changing permissions of ‘/etc/passwd’: Operation not permitted
$ sudo chmod 644 /etc/passwd # sudo が必要
システムファイル(/etc/ 配下など)は root 権限が必要です。sudo を付けて実行してください。ただし /etc/passwd など重要なファイルを誤って変更すると OS が起動しなくなるリスクがあります。sudo で chmod を使うときは対象ファイルをよく確認してください。
②「No such file or directory」— ファイルが存在しない
chmod: cannot access ‘/tmp/nonexistent_file.txt’: No such file or directory
ファイルパスのスペルミスや、ファイルがまだ存在しないケースです。ls -la [ファイルパス] で確認してから chmod を実行してください。
③「invalid mode」— 無効な数値を指定した
chmod: invalid mode: ‘999’
Try ‘chmod –help’ for more information.
8 進数の各桁は 0〜7 の範囲です。8 や 9 を使った 999 などは無効です。r=4、w=2、x=1 の合計なので最大は 777 です。Ubuntu 24.04 の実際のエラーメッセージ「chmod: invalid mode: '999'」を確認しました。
まとめ
Ubuntu の chmod コマンドについて、Docker コンテナ(ubuntu:24.04 / coreutils 9.4-3ubuntu6.2)で実際に動かした結果をもとに解説しました。
- chmod は3桁の数値(例:
755)か記号(例:u+x)でパーミッションを設定する - シェルスクリプトには
chmod 755、設定ファイルにはchmod 644が基本 - SSH 秘密鍵は
chmod 600、.sshディレクトリはchmod 700が必須 chmod -R 644はディレクトリの x ビットも消えるので、find -type f/dで分けて設定する- Ubuntu 22.04(coreutils 8.32)と 24.04(coreutils 9.4)で chmod の基本動作に互換性の差異はない
次のステップとして、VPS でサーバーを運用する場合は SSH 設定も理解しておくと役立ちます。
関連記事
- Ubuntu で SSH 鍵認証を設定する完全手順
- Ubuntu の chown コマンド:ファイルの所有者を変更する方法
- VPS 比較 2026:Vultr・DigitalOcean・ConoHa を実測ベンチで選ぶ
本格的に VPS でサーバーを運用したいなら、東京リージョンがあり月 $5 から始められる Vultr が学習用途にも使いやすいです。



コメント