Linux システムでは、各ファイルには、ユーザーがそのファイルとどのように対話できるかを決定する一連の権限があります。これらの権限の 1 つは「実行ビット」であり、ファイルをプログラムとして実行できるかどうかを決定する上で重要な役割を果たします。この記事では、実行ビットの概念、その動作、Linux でのファイル管理とプログラム実行にとってなぜ重要なのかについて説明します。また、簡単なコマンド ライン コマンドを使用してこれらの権限を管理する方法も学習します。
概要
- 実行ビットは、ファイルをプログラムまたはスクリプトとして実行する権限が付与されるかどうかを決定します。
- ディレクトリの実行ビットを設定すると、そのアクセス可能性が決定され、ファイルへのエントリとアクセスが可能になります。
- Linux ユーザーにとって、stat や chmod などのコマンドを使用してファイル権限を理解し、操作することは不可欠です。
Linux の基本的なファイル権限システムはシンプルで堅牢であり、50 年以上も存続してきたのも不思議ではありません。しかし、実装部分は混乱を招く要素であり、詳細に理解する価値があります。
実行ビットとは何ですか? また、それが何であるかを知るにはどうすればよいですか?
Linux システム上のすべてのファイルには、読み取り、書き込み、実行など、ファイルに対して何ができるかを制御する一連の権限があります。ユーザーには 3 つのレベルがあり、それぞれに独自の権限セットがあります。ファイル所有者 (ユーザー)、ファイルを所有するグループのメンバー、その他全員 (その他) です。これら 3 つのアクションと 3 種類のユーザーにより、ファイルごとに合計 9 つの権限が与えられます。
助言
Unix および Linux オペレーティング システムでは、フォルダーもファイルであることに注意してください。他のファイルと同じ権限データを持ちますが、権限の意味は若干異なります。
読み取り権限と書き込み権限は非常に簡単ですが、「実行ビット」はもう少し神秘的で魔法のようです。しかし、一度理解してしまえば、非常に簡単で、必要なときに特に役立ちます。
ls や stat などのツールを使用してファイルの権限を確認できます。システム上のファイルに対して ls -l を実行すると、次のような結果が表示されます。
ここにはファイルに関する多くの情報がありますが、権限は先頭の一連の文字だけです。この場合、「rwxr-xr-x」は、ファイルの所有者だけがファイルに書き込むことができ、他のユーザーはファイルを読み取り、実行できることを意味します。 「実行ビット」という用語を耳にすることがあると思いますが、実際にはファイルごとに 3 つの実行ビットがあります。
実行ビットはファイルに対して何を行いますか?
実行ビットの主な目的は、ファイルをプログラムまたはスクリプトとして実行できるかどうかを制御することです。コマンドラインにファイル名を入力すると、ユーザー インターフェイスはそのファイル名を実行しようとします。ドキュメントや画像などのデータ ファイルを実行しようとすると、権限エラーが発生します。
これは、そのようなファイルに実行ビットが設定されていないためです。ただし、実行ビットは魔法ではありません。 chmod スティックをイメージ ファイルに移動して実行可能プログラムに変換することはできません。
特定の種類のファイルのみ実行できます。一般的に、Linux で直接実行できるファイルには 2 種類あります。
- バイナリ実行ファイル: これは、ソース コードからコンパイルされ、特定のアーキテクチャ用にパッケージ化されたファイルであり、マシン コード命令を使用してタスクを実行します。このようなプログラムは、ソースからコンパイルしたり、ダウンロードしたり、パッケージ マネージャーを使用してインストールしたりできます。
- テキストファイル: これは、別のプログラムによって実行され、解釈される、人間が読める言語で記述されたテキスト ファイルです。 Perl や PHP などのスクリプト言語で書かれたスクリプトまたはプログラムである可能性があります。
パスを入力してテキストファイルを直接実行すると、シェルはコード行に基づいて使用するインタープリターを決定します。たとえば、Python スクリプトは次の行で始まる場合があります。
#!/usr/bin/python
これは、実行ビットが権限に関するものであり、それ以上のものではないという事実を強調しています。これは、実際に実行することが意味があるかどうかではなく、ファイルをプログラムとして実行することを許可するかどうかをインターフェイスが決定できるようにするものです。
実行ビットは実行を確実に防止する方法ではないことを理解することが重要です。次のインターフェース テキストを例に挙げます。
#!/bin/sh
echo "pretend this script does something dangerous like rm -rf / ..."
実行権限を削除すれば安全になると思われるかもしれません。
ただし、次の状況を考えてみましょう。
災害!スクリプトが現在実行されている理由:
誰でも /bin/sh プログラムを実行できます。
sh プログラムは、実行ビットをチェックせずに、引数として渡されたファイル名を実行しようとします。
したがって、プログラムの実行には 2 つの別個の側面が関係します。ファイルの権限によって、パスを入力して実行できるかどうかが決まります。ファイルの内容によって、実行時に実際に何かが行われるかどうかが決まります。結局のところ、実行ビットは、誤ってファイルを実行することを防ぐための安全メカニズムです。
実行ビットはディレクトリに対して何を行いますか?
実行ビットは、ディレクトリに設定された場合、まったく異なる動作をします。結局のところ、ガイドはプログラムにはなり得ないので、それを実装しても意味がありません。代わりに、実行ビットは、ディレクトリに入ってそのファイルにアクセスできるかどうかを決定します。
ディレクトリに実行ビットを設定すると、cd コマンドを使用してそのディレクトリに入り、ls コマンドを使用してその内容の詳細を表示できます。
ただし、この権限を削除すると、このディレクトリにアクセスしたり、その中のファイルの詳細を表示したりできなくなります。
ls コマンドは依然として長いリストを表示しますが、ほとんどのデータが疑問符に置き換えられ、読み取れないことが示されることに注意してください。ディレクトリ内のファイルの実際の名前はそのディレクトリの一部として保存されるため、読み取り権限によってそれらへのアクセスが許可されます。ただし、ファイル サイズや変更日などのその他のデータには、ディレクトリの実行権限がないとアクセスできません。
コマンドにエイリアスがある場合、混乱を招くエラーが発生する可能性があります。たとえば、私の Ubuntu システムでは、ls コマンドは ls –color にエイリアスされており、特定のファイル データを使用して出力に色を付けます。実行可能でないディレクトリでは、次のエラーが発生します。
ただし、このオプションがない場合、ファイル名のみを表示する必要があるため、ls コマンドはこのようなディレクトリで正常に機能します。
実行ビットをどのように使用および変更すればよいですか?
ファイルの権限のみに焦点を当てる必要がある場合は、stat コマンドを使用すると、ls コマンドよりも正確な結果を得ることができます。 stat の -c オプションを使用すると、必要なメタデータを正確に抽出するための形式を指定できます。たとえば、ファイル名の横にファイルの権限のみを表示するには、次の形式を使用します。
stat -c "%a %n"
通知
GNU Linux バージョンではなく BSD バージョンの stat を使用する macOS では、このコマンドを変更する必要があります。
stat -f "%Sp %N"
権限文字列だけが必要な場合は、「%n」を省略できます。例:
stat -c "%a"
これはスクリプト作成に役立つかもしれません。たとえば、次の 1 行を使用して、ディレクトリ内のすべてのファイルのさまざまな権限設定に関する概要情報を取得できます。
stat -c "%a" ~/home/projects/all/*/* | sort | uniq -c | sort
chmod コマンドを使用してファイルの権限を変更できます。 chmod コマンドは非常に強力なツールであるため、その構文全体は非常に複雑です。ただし、基本的な文字ベースのアクションと略語 (u=ユーザー/所有者、g=グループ、o=その他、a=すべて) を覚えておけば、簡単に使用できます。
ファイルを誰でも実行できるようにするには、次のコマンドを使用します。
chmod a+x file
すべてのユーザーから実行権限を削除するには、次のように入力します。
chmod a-x file
Linux の実行ビットはファイル管理システムの重要な部分であり、ファイルをプログラムとして実行できるかどうかを決定します。これらの権限を理解し、適切に管理することで、システムのセキュリティと効率を向上させることができます。この記事で紹介したコマンドを試して、ご経験を共有してください。権限の管理で何か課題に直面しましたか?他に追加すべきヒントはありますか?メリットを広めるために、この記事を他の人と共有することを忘れないでください。












