こんにちは。AWSの勉強するに当たりLinuxも必然的にさわるので学んでいるねこだくさんです。
Linuxを触っているとファイルやディレクトリを実行する際にpermission deniedと怒られることがあります。
権限足りてねーよって意味ですが、その際の解決方法と実行ファイルってなんぞ?ということを勉強してみました。
前回学んだこと
前回はパスの通し方について学びました。

実行ファイルとは
Exacutable File(実行可能ファイル)は内容がプログラムであるファイルのことです。
実行ファイルを開くことでプログラムが実行されます。
Windowsの場合拡張子が.exeとなっているファイルなどを指します。
ファイル権限とは
Linuxではファイルやディレクトリを実行できるかどうかといったことをユーザー単位・権限で管理しています。
これをファイル・ディレクトリの権限と呼んでいます。Permission(ファイル属性)として表現します。
Permissionとな?
所有権として自分・グループ・他人の3つのがあり、権限として読める(Readable)・書ける(Writable)・実行できる(eXecutable)の3つがあります。
所有権
| 所有者 | 意味 |
|---|---|
| Owner | 所有者・本人 |
| Group | 同じサーバーに所属するユーザー |
| Other | それ以外 |
権限
| 権限 | 数字 | 文字 |
|---|---|---|
| 読み取り | 4 | r |
| 書き込み | 2 | w |
| 実行 | 1 | x |
めんどくさいので数字の組み合わせで表現してます。
Permission確認
ls -lコマンドを使用します。設定されている場合llでも確認可能です。
仮想環境Envaderで実施してみます。
$ ls -l
total 1900
-rwxr-xr-x 1 envader envader 1941911 9月 28 2021 run1
-rwxr-xr-x
一番左がファイルの種類を表し、以降3桁ごとにユーザー、グループ、その他の権限を表しています。
数字で表すと755となります。
つまりこのrun1というファイルの実行権限は
- ユーザーは読み取り・書き込み・実行が
- グループは読み取り・実行
- その他のユーザーは読み取り・実行
となります。
Permission変更
個のファイルに対し実行権限は不要だよという場合chmodコマンドを使用し実行権限を変更することができます。
chmod 644 run1
a(全員)から実行権限を取り除く以下の指定方法でも同じ結果となります。
chmod a-x run1
$ ll
total 1900
-rw-r--r-- 1 envader envader 1941911 9月 28 2021 run1
コード参考:実行ファイルについて
【2026-08-15 追記】Groupの説明が違いました
ここから下は2026年8月のterralienが後から足した追記です。当時の本文は直していません。所有権の表に1箇所まちがいがあり、しかもこれを信じたまま権限設定をすると、意図せず他人に見せる事故につながる種類のまちがいだったので訂正します。
訂正: Groupは「同じサーバーのユーザー」ではありません
本文の表は「Group / 同じサーバーに所属するユーザー」としていますが、それだとOther(それ以外)との違いが無くなってしまいます。正しくはそのファイルに設定されている所有グループに属しているユーザーです。
| 区分 | 誰のことか |
|---|---|
| Owner (u) | そのファイルの所有者に設定されている1人 |
| Group (g) | そのファイルの所有グループに入っているユーザー(サーバー全員ではない) |
| Other (o) | 上のどちらでもない全員。ここが実質「同じサーバーの他のユーザー」 |
ls -lの出力には所有者と所有グループが並んで出ています。本文の例だとenvader envaderの部分で、左が所有者・右が所有グループです。
$ ls -l
-rwxr-xr-x 1 envader envader 1941911 9月 28 2021 run1
# ↑所有者 ↑所有グループ
$ groups # 自分がどのグループに入っているか
envader sudo
$ id # 数値のIDつきで見る
uid=1000(envader) gid=1000(envader) groups=1000(envader),27(sudo)
ここを取り違えると何が起きるか。「グループにだけ見せたい」つもりで640にしたのに、実際は自分しか入っていないグループだった——という無害な失敗ならまだいいのですが、逆方向がまずいです。
「同じサーバーの人にだけ見せるつもり」でchmod 644や755にしたなら、それは全員に読ませています。 644の最後の4はGroupではなくOtherです。設定ファイルにパスワードやAPIキーが入っているなら600(自分だけ)が既定で、共有したいときだけ所有グループを設定して640にする、という順番になります。
chmod 600 secret.env # 自分だけ読み書き
sudo chgrp web-team secret.env # 所有グループをweb-teamにして
chmod 640 secret.env # そのチームだけ読める
もうひとつ: ディレクトリのx(実行)は意味が違います
本文は実行ファイルの話として権限を説明していますが、ディレクトリに付いているxは「実行」ではなく「中に入れる・中のファイルにアクセスできる」という意味です。ここもrwxの表だけ読むと分からない部分でした。
| 権限 | ファイルの場合 | ディレクトリの場合 |
|---|---|---|
| r | 中身を読める | lsで名前の一覧が取れる |
| w | 中身を書き換えられる | 中にファイルを作れる・消せる |
| x | プログラムとして実行できる | そのディレクトリを通り抜けられる(cdやパス指定でのアクセス) |
だからディレクトリをchmod 644にすると、lsで名前は見えるのに中のファイルは一切開けない、という不思議な状態になります。ディレクトリが755だらけなのはこのためです。ファイルの中身を消す権限は、ファイル側ではなく置いてあるディレクトリのwという点も、慣れるまで直感に反するところでした。
【2026-08-15 追記ぶんの出典】inode(7) - Linux manual page(ファイルモードとowner/group/otherの定義)/path_resolution(7) - Linux manual page(ディレクトリのx=探索権限であること)
学んだこと
- 実行ファイルってのは選択することで実行できるプログラムのファイル
- 実行ファイル等を実行するに当たり権限の変更が必要な場合
chmodコマンドを使用する
猫たちはそのへんで転がっています。

自分で熊チョップ食らうポジションに行って解せぬ表情の猫
参考資料

