Linuxの「Permission denied」の直し方|chmod・chownの使い方【初心者向け】

前の記事で、ls -l の -rw-r--r-- を読めるようになりました。今回はいよいよ、その権限(=誰が何をしてよいかの決まり)を直す番です。

私が最初に「Permission denied」で手が止まったのは、自分で書いたシェルスクリプト(=ターミナルに打つコマンドを、順番にファイルに書いておいたもの)を動かそうとしたときでした。ファイルはちゃんとあるのに、./hello.sh と打つと断られる。原因は、実行の権限(x)がついていなかっただけでした。わかってしまえば、1行で直せます。

この記事では、権限を変える chmod と、持ち主を変える chown の使い方を、練習用のディレクトリで試していきます。あわせて、ネットでよく見かける「とりあえず 777」が危ない理由もお話ししますね。

💡
この記事でわかること
  • chmod で権限を変える2つの書き方(u+x と 755)
  • スクリプトが「Permission denied」で動かないときの直し方
  • sudo chown で持ち主を変える方法
  • 「chmod 777」や「-R」を気軽に使ってはいけない理由
🔰
この記事の前提
  • ls -l の権限の文字(rwx)と、644・755 の意味がわかる
  • echo と > でファイルに文字を書ける

まだの方は、前の記事「Linuxのパーミッション入門|ls -l の rwx を読めるようにする【初心者向け】」から読むのがおすすめです。

💡
用語メモ
  • トークン:ログインした状態や、使ってよい範囲を表す文字列。APIキーと同じく、パスワードと同じように人に見せてはいけません
  • .env ファイル:APIキーなどの秘密の設定を、名前=値 の形で書いておくファイル。人に渡したり、Git に入れたりしません
  • 鍵:SSH などでパスワードの代わりに使う、2つで1組のデータ。公開鍵は相手に渡す「錠前」、秘密鍵は自分だけが持つ「鍵」
  • sudo:許可されたユーザーが、コマンドの前につけて、そのコマンドだけを管理者(root)の権限で実行するしくみ。パスワードを聞かれたら、root ではなく自分のパスワードを入れます

用語で迷ったら、連載のまとめ記事の「よく出てくる用語ミニ辞典」でも確かめられます。


結論:「誰に」「何を」「足す・外す」で考える

やりたいこと コマンドの例 意味
自分に実行権限を足す chmod u+x hello.sh 持ち主(u)に x を足す
グループとその他から書き込みを外す chmod go-w memo.txt グループ(g)とその他(o)から w を外す
数字でまとめて決める chmod 644 memo.txt rw-r--r-- にする
自分だけが読み書きできるようにする chmod 600 secret.txt rw------- にする
持ち主を変える sudo chown kaito:kaito file 持ち主とグループを kaito にする

chmod の書き方

準備:練習用のディレクトリを用意する

練習は ~/linux-practice/chmod-test の中で行います。

  • 1
  • 2
  • 3
mkdir -p ~/linux-practice/chmod-test
cd ~/linux-practice/chmod-test
pwd

🖥️
この記事の出力例について

ここから先の出力例は、Debian 13での実行例です(ユーザー名 kaito・パソコン名 demo のダミー環境)。UbuntuやWSL(=Windows の中で Linux を動かせる、Microsoft のしくみ)では、表示が少し違うことがあります。

(例)

  • 1
/home/kaito/linux-practice/chmod-test

スクリプトが「Permission denied」で動かない

まずは、よくあるつまずきを再現してみましょう。画面に1行出すだけの、小さなシェルスクリプトを作ります。

  • 1
  • 2
  • 3
echo 'echo "こんにちは、スクリプトです"' > hello.sh
cat hello.sh
ls -l hello.sh

(例)

  • 1
  • 2
  • 3
  • 4
kaito@demo:~/linux-practice/chmod-test$ cat hello.sh
echo "こんにちは、スクリプトです"
kaito@demo:~/linux-practice/chmod-test$ ls -l hello.sh
-rw-rw-r-- 1 kaito kaito 47 Nov  1 05:25 hello.sh

今回の環境では -rw-rw-r-- と表示されました(前の記事で見たとおり、umask の設定でグループにも w が付く環境です。-rw-r--r-- の環境もあります)。どちらにしても、x はどこにもついていません。

ここで、スクリプトを実行してみます。./ は「今いる場所の」という意味です。

  • 1
./hello.sh

(例)

  • 1
-bash: ./hello.sh: Permission denied

ls -l の結果を見ると、どこにも x がありません。だから「実行してはいけない」と断られたわけです。

chmod u+x で、自分に実行権限を足す
  • 1
  • 2
  • 3
chmod u+x hello.sh
ls -l hello.sh
./hello.sh

(例)

  • 1
  • 2
  • 3
  • 4
kaito@demo:~/linux-practice/chmod-test$ ls -l hello.sh
-rwxrw-r-- 1 kaito kaito 47 Nov  1 05:25 hello.sh
kaito@demo:~/linux-practice/chmod-test$ ./hello.sh
こんにちは、スクリプトです

持ち主の3文字が rw- から rwx に変わり、スクリプトが動きました(今回の環境ではグループの3文字が rw- なので、全体は -rwxrw-r-- です)。

Debian 13での実行画面

chmod の書き方は「誰に」「足すか外すか」「何を」の組み合わせです。

部品 書き方 意味
誰に u 持ち主(user)
g グループ(group)
o その他の人(others)
a 全員(all)
どうする + 足す
- 外す
= その形にそろえる
何を r・w・x 読む・書く・実行

💡
「chmod +x」とだけ書かれていたら

手順書では chmod +x hello.sh のように、「誰に」を省いた書き方もよく見かけます。この場合は、多くの環境で全員に x がつきます。自分だけでよいなら u+x と書いておくと、意味がはっきりして安心です。


数字で決める:chmod 644 と chmod 600

前の記事で覚えた数字でも、権限を決められます。数字の場合は、足し引きではなく「この形にする」という意味になります。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
echo "メモです" > memo.txt
chmod 644 memo.txt
ls -l memo.txt
echo "見られたくないメモ(練習用のダミー)" > private.txt
chmod 600 private.txt
ls -l private.txt

(例)

  • 1
  • 2
  • 3
  • 4
kaito@demo:~/linux-practice/chmod-test$ ls -l memo.txt
-rw-r--r-- 1 kaito kaito 13 Nov  1 05:25 memo.txt
kaito@demo:~/linux-practice/chmod-test$ ls -l private.txt
-rw------- 1 kaito kaito 55 Nov  1 05:25 private.txt

数字で指定すると、umask の設定に関係なく、その形にそろいます。今回の環境でも、memo.txt は -rw-r--r--、private.txt は -rw------- になりました。

数字 文字 使いどころ
644 rw-r--r-- ふつうのファイル
600 rw------- 自分だけが読み書きする設定ファイルや鍵
755 rwxr-xr-x ディレクトリ、みんなが実行してよいスクリプト
700 rwx------ 自分だけが入れるディレクトリ、自分だけのスクリプト

💡
APIキーなどを書いたファイルは 600 に

あとで自動化のスクリプトを動かすとき、APIキー(=API を使うときに必要な、合言葉のような文字列)などを書いた設定ファイル(.env など)を作ることがあります。そうしたファイルは chmod 600 にして、自分以外は読めないようにしておくのが基本です。


持ち主を変える:sudo chown

chown(チェンジ・オーナー)は、ファイルの持ち主を変えるコマンドです。持ち主を変えるのは管理者の仕事なので、ふつうは sudo(管理者の権限を借りるコマンド)と一緒に使います。sudo のくわしいしくみは、この Lv2 の別の記事で扱います。

⚠️
この節は、パスワードを聞かれます

sudo を使うと、自分のユーザーのパスワードを聞かれます(WSL なら、最初に Ubuntu・Debian を入れたときに決めたパスワードです)。入力しても画面には何も表示されませんが、そのまま打って Enter で大丈夫です。対象は、必ず練習用のファイルだけにしてください。

わざと持ち主を root にしてみる
  • 1
  • 2
  • 3
  • 4
cd ~/linux-practice/chmod-test
echo "持ち主の練習" > owner.txt
sudo chown root:root owner.txt
ls -l owner.txt

(例)

  • 1
  • 2
  • 3
  • 4
kaito@demo:~/linux-practice/chmod-test$ sudo chown root:root owner.txt
[sudo] password for kaito:
kaito@demo:~/linux-practice/chmod-test$ ls -l owner.txt
-rw-rw-r-- 1 root root 19 Nov  1 05:25 owner.txt

[sudo] password for kaito: と出たら、自分のパスワードを入力して Enter です(入力しても何も表示されません)。一度パスワードを入れると、しばらく(初期設定では15分)は続けて sudo を使っても聞かれません。今回も、聞かれたのはこの1回目だけでした。

chown 持ち主:グループ ファイル の順に書きます。持ち主が root になったので、kaito はこのファイルを書き換えられなくなりました。

前の記事の読み方で確かめてみましょう。-rw-rw-r-- 1 root root の kaito は、持ち主(root)でもグループ(root)でもないので、その他の人の3文字 r-- で判断されます。読むことはできても、書くことはできない、というわけです。権限の文字は変わっていないのに、持ち主が変わるだけで「自分がどの区分か」が変わる、というのがポイントです。

  • 1
echo "追記してみる" >> owner.txt

(例)

  • 1
-bash: owner.txt: Permission denied

持ち主を自分に戻す
  • 1
  • 2
  • 3
  • 4
sudo chown kaito:kaito owner.txt
ls -l owner.txt
echo "追記できました" >> owner.txt
cat owner.txt

(例)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
kaito@demo:~/linux-practice/chmod-test$ sudo chown kaito:kaito owner.txt
kaito@demo:~/linux-practice/chmod-test$ ls -l owner.txt
-rw-rw-r-- 1 kaito kaito 19 Nov  1 05:25 owner.txt
kaito@demo:~/linux-practice/chmod-test$ echo "追記できました" >> owner.txt
kaito@demo:~/linux-practice/chmod-test$ cat owner.txt
持ち主の練習
追記できました

owner.txt は2行になりました。持ち主が root のときの「追記してみる」は断られたので、ファイルには入っていません。

Debian 13での実行画面

メッセージが日本語で出る環境では

日本語の設定(ロケール)になっている環境では、同じエラーが日本語で表示されます。今回の Debian 13 で日本語の設定にして試すと、次のようになりました(記事で作った hello.sh を実行権限を付ける前に実行したときと、持ち主を root にした owner.txt に追記したときのエラーです)。

(例)

  • 1
  • 2
  • 3
  • 4
kaito@demo:~/linux-practice/chmod-test$ ./hello.sh
-bash: ./hello.sh: 許可がありません
kaito@demo:~/linux-practice/chmod-test$ echo "追記してみる" >> owner.txt
-bash: owner.txt: 許可がありません

Debian 13での実行画面(日本語の設定で、スクリプトを実行したときと owner.txt に追記したとき)

kaito の部分は、ご自分のユーザー名に読みかえてください。自分のユーザー名は whoami、グループは id で確かめられます。

🤖 詰まったらAIに聞こう:Permission denied を直したい

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
Linuxの初心者です。「Permission denied」が出て困っています。
できるだけ安全な直し方(権限を広げすぎない方法)を、理由つきで教えてください。
chmod 777 や、ディレクトリ全体への -R は使わない方法でお願いします。

【使っている環境】WSLのUbuntu など
【自分のユーザー名(whoami の結果)】ここに貼る
【実行したコマンド】ここに貼る
【表示されたメッセージ】ここに貼る
【対象の ls -l(ディレクトリなら ls -ld)の結果】ここに貼る
【やりたいこと】例:自分で書いたスクリプトを実行したい

やってはいけない直し方

ネットで「Permission denied」を検索すると、いろいろな直し方が出てきます。中には、その場は動くけれど、あとで困るものもあります。ここで紹介するものは、この記事では実行しません。読むだけにしてください。

🚫
実行しないでください:危ない直し方の例
  • 「chmod 777」:全員に、読む・書く・実行のすべてを許す設定です。自分以外のユーザーやプログラムからも書き換えられるようになり、サーバー(=ほかのパソコンやアプリにサービスを提供するコンピューター)では乗っ取りのきっかけにもなります。「とりあえず 777」は使わないでください。
  • 「chmod -R」「chown -R」をシステムのディレクトリに使う:-R は「中身まで全部」という意味です。/ や /etc、/usr などに使うと、システムに必要なファイルの権限がまとめて書き換わり、sudo やログインができなくなることがあります。元に戻すのはとても大変です。
  • 何でも「sudo」をつけて実行する:権限のエラーを sudo で押し切ると、root が持ち主のファイルが増えて、あとで自分のユーザーで書き換えられなくなります。

権限のエラーが出たら、「誰が」「何を」できないのかを ls -l で確かめて、必要な人に、必要な権限だけを足す。これがいちばん安全な直し方です。

🔒
AIに貼る前に:秘密情報やパスワードは貼らない

sudo で聞かれるパスワードは、AI にも、チャットにも、絶対に貼らないでください。また、権限を直したいファイルが設定ファイルの場合、中身にAPIキーやトークンが書かれていることがあります。中身を貼るときは「***」に置き換えてからにしましょう。


Permission denied が出たときの3ステップ

ここまでの内容を、実際にエラーが出たときの順番に並べると、こうなります。

  1. ls -l ファイル名(ディレクトリなら ls -ld)で状態を読む:持ち主・グループ・権限の文字を確かめる
  2. 自分がどの区分か決める:whoami の結果が持ち主なら持ち主の3文字、グループに入っていればグループの3文字、どちらでもなければその他の人の3文字を見る
  3. 足りない1文字だけを足す:実行できないなら chmod u+x、持ち主が違うなら sudo chown で自分に戻す。777 にはしない

よくある質問

Q. chmod u+x をしなくても、スクリプトを動かす方法はありますか?

あります。bash hello.sh のように、bash にファイルを読ませて動かす方法です。この場合、ファイルに必要なのは「読む(r)」だけなので、x がなくても動きます。何度も使うスクリプトなら、chmod u+x をしておいて ./hello.sh で動かすほうが手軽です。

Q. WSL で、Windows 側のフォルダ(/mnt/c の中)で chmod しても、権限が変わりません。

Windows のファイルは Linux とは別のしくみで権限を管理しているため、WSL の設定によっては chmod が反映されません。練習やスクリプトは、Linux 側のホーム(~)の中に置くのがおすすめです。

Q. 新しく作ったファイルが、最初から -rw-rw-r-- になるのはなぜですか?

新しいファイルの権限は、umask という設定で決まります。今回の Debian 13 の環境では、グループにも w が付く設定でした。気になるときは、この記事のように chmod 644 などの数字で、ほしい形にそろえれば大丈夫です。


まとめ

  • chmod は「誰に(u・g・o・a)」「足す・外す(+・-・=)」「何を(r・w・x)」で書く
  • スクリプトが動かないときは chmod u+x ファイル名
  • 数字なら 644(ふつう)、600(自分だけ)、755(実行・ディレクトリ)
  • 持ち主を変えるのは sudo chown 持ち主:グループ ファイル
  • 「chmod 777」と、システムへの「-R」は使わない。必要な人に必要な権限だけ

次の記事では、今回ちらっと出てきた ユーザー・グループ・sudo のしくみと、「root で作業しない」理由を見ていきます。


次に読む記事


関連する記事