ファイルの権限

LinuxBeginner

はじめに

この実験では、Linux のファイル権限について学びます。ここでは、chowntouchchmod という 3 つの重要なコマンドを取り上げます。これらのツールは、Linux システム上のファイルやディレクトリへのアクセスを管理するために欠かせません。この実験を終えると、ファイルの作成、ファイルの所有者の変更、ファイル権限の変更ができるようになります。これらのコマンドを理解すると、システム上のファイルを誰が読み取り、書き込み、実行できるかを制御できるようになります。

新しいファイルを作成する

まず、touch コマンドを使って新しいファイルを作成します。このコマンドは、新しい空のファイルを作成したり、既存ファイルのタイムスタンプを更新したりできます。ファイルを新しく作成したり、最終アクセス時刻を更新したりする、簡単な方法だと考えてください。

最初に、正しいディレクトリにいることを確認します。ここでは project ディレクトリを使用します。

cd ~/project

cd は「change directory(ディレクトリを変更する)」を表します。~ はホームディレクトリを表し、/project は移動先のサブディレクトリを指定します。project ディレクトリが存在しない場合、このコマンドは失敗する可能性があります。存在するか不明な場合は、通常は先にディレクトリを作成します。ただし、この実験環境ではディレクトリがすでに存在するはずです。

次に、example.txt という名前の新しいファイルを作成します。

touch example.txt

このコマンドは、現在のディレクトリに example.txt という空のファイルを作成します。ファイルが作成されたことを確認するには、ls コマンドを使います。

ls

ls は「list(一覧表示)」を表します。現在の場所にあるファイルとディレクトリを表示します。出力に example.txt が表示されるはずです。表示されない場合は、touch コマンドを正しく実行したか、現在の場所が ~/project であるかを確認してください。

ファイルの所有権を変更する

ファイルを作成できたので、次は所有権を変更します。chown コマンドを使うと、ファイルのユーザー所有者とグループ所有者を変更できます。所有権によって、ファイルを管理できるユーザーが決まります。

まず、example.txt の現在の所有権を確認します。

ls -l example.txt

ls -l コマンド(詳細形式で一覧表示)は、ファイルの権限、所有者、グループなどの詳細情報を表示します。次のような出力が表示されます。

-rw-rw-r-- 1 labex labex 0 Jul 29 15:11 example.txt

出力の各項目を確認しましょう。

  1. -rw-rw-r-- はファイル権限を表します(詳しくはステップ 4 で説明します)。最初の文字はファイルの種類を示します(通常のファイルは -、ディレクトリは d など)。残りの文字は、所有者、グループ、その他のユーザーに対する読み取り、書き込み、実行権限を表します。
  2. 最初の labex はファイルの現在の所有者です。ファイルを所有するユーザー名を示します。
  3. 2 番目の labex はファイルの現在のグループです。グループは、権限を共有できるユーザーの集合です。
  4. 0 はファイルサイズをバイト単位で示します。ファイルは空なので、サイズは 0 です。
  5. Jul 29 15:11 は最終更新日時です。
  6. example.txt はファイル名です。

次に、ファイルの所有者を root ユーザーに変更します。root は Linux システムの管理者アカウントで、特別な権限を持っています。

sudo chown root:root example.txt

このコマンドの各部分は次の意味です。

  • sudo は、root 権限でコマンドを実行します。パスワードの入力を求められることがあります。chown はシステムのセキュリティに影響する強力なコマンドなので、通常は昇格された権限が必要です。sudo を付けないと、「Permission denied」エラーが表示されます。
  • chown は所有権を変更するコマンドです。
  • root:root は新しい所有者とグループを指定します。ここでは、どちらも root に設定します。構文は owner:group です。
  • example.txt は対象ファイルです。

変更を確認します。

ls -l example.txt

所有者とグループの両方が root に変わっていることを確認できます。

-rw-rw-r-- 1 root root 0 Jul 29 15:11 example.txt

root ではなく labex と表示される場合は、chown コマンドに sudo を付けたか、パスワードを正しく入力したかを確認してください。

ディレクトリの所有権を変更する

chown コマンドでは、ディレクトリ全体とその内容の所有権も変更できます。実際に試してみましょう。これは、すべてのファイルとサブディレクトリを同じ所有者にしたい場合など、複雑なディレクトリ構造を管理するときに特に役立ちます。

まず、いくつかのファイルを含む新しいディレクトリを作成します。

mkdir -p new-dir/subdir
echo "Hello, world" > new-dir/file1.txt
echo "Another file" > new-dir/subdir/file2.txt

各コマンドの意味は次のとおりです。

  • mkdir -p new-dir/subdir は、new-dir ディレクトリと、そのサブディレクトリ subdir を作成します。-p オプションを指定すると、必要に応じて親ディレクトリも作成されます。-p を付けない場合、new-dir が存在しなければ new-dir/subdir の作成に失敗します。
  • echo "Hello, world" > new-dir/file1.txt は、new-dir ディレクトリ内に file1.txt というファイルを作成し、Hello, world という文字列を書き込みます。> はリダイレクトに使う記号で、echo コマンドの出力を指定したファイルに書き込みます。
  • echo "Another file" > new-dir/subdir/file2.txt も同様に、new-dir/subdir ディレクトリ内に file2.txt というファイルを作成し、Another file という文字列を書き込みます。

次に、現在の所有権を確認します。

ls -lR new-dir

ls -lR は、new-dir の内容を再帰的に一覧表示します。-R オプション(recursive)を付けると、new-dir 内のすべてのファイルとサブディレクトリ、およびその内容が表示されます。

次のような出力が表示されます。

new-dir:
total 4
-rw-rw-r-- 1 labex labex 13 Jul 29 09:15 file1.txt
drwxrwxr-x 2 labex labex 23 Jul 29 09:15 subdir

new-dir/subdir:
total 4
-rw-rw-r-- 1 labex labex 13 Jul 29 09:15 file2.txt

この出力から、ディレクトリ new-dir、サブディレクトリ subdir、ファイル file1.txtfile2.txt がすべて labex に所有されていることが分かります。

次に、new-dir とその内容すべての所有権を root ユーザーに変更します。

sudo chown -R root:root new-dir

このコマンドでは、次の点が重要です。

  • -R オプションを指定すると、chown は再帰的に処理を行い、new-dir 内のすべてのファイルとサブディレクトリの所有権を変更します。-R がない場合、所有権が変わるのは new-dir ディレクトリだけで、その中のファイルとサブディレクトリは labex のままです。

変更を確認します。

ls -lR new-dir

次のように表示されます。

new-dir:
total 4
-rw-rw-r-- 1 root root 13 Jul 29 09:15 file1.txt
drwxrwxr-x 2 root root 23 Jul 29 09:15 subdir

new-dir/subdir:
total 4
-rw-rw-r-- 1 root root 13 Jul 29 09:15 file2.txt

ディレクトリとその内容すべての所有権が root に変わっています。このように、-R オプションを使うと、ディレクトリ構造全体の所有権を一括して変更できます。

ファイルの権限を変更する

Linux では、ファイル権限を一連の文字または数字で表します。ここでは、権限の読み方と変更方法を学びます。権限を理解することは、ファイルを保護し、不正アクセスを防ぐために重要です。

まず、example.txt の現在の権限を確認します。

ls -l example.txt

次のような出力が表示されます。

-rw-rw-r-- 1 root root 0 Jul 29 15:11 example.txt

-rw-rw-r-- の部分がファイル権限を表します。ここで、数字表記と記号表記を使います。順に確認しましょう。

  • 最初の文字(-)は、通常のファイルであることを示します。その他の一般的な表示には、ディレクトリを示す d、シンボリックリンクを示す l があります。
  • 次の 3 文字(rw-)は、所有者の権限を表します。読み取りと書き込みはできますが、実行はできません。
    • r は読み取り権限を表します。所有者はファイルを開いて読み取れます。
    • w は書き込み権限を表します。所有者はファイルを変更できます。
    • x は実行権限を表します。所有者はファイルを実行できます(プログラムまたはスクリプトの場合)。- は、その権限がないことを示します。
  • 次の 3 文字(rw-)は、グループの権限を表します。意味は同じですが、ファイルのグループに属するメンバーに適用されます。
  • 最後の 3 文字(r--)は、その他のユーザー(それ以外のすべてのユーザー)の権限を表します。意味は同じですが、所有者でもファイルのグループのメンバーでもないユーザーに適用されます。

次に、chmod コマンドを使って権限を変更します。chmod は「change mode(モードを変更する)」を表し、これらの権限を変更できます。まずは数字表記を使います。

sudo chmod 700 example.txt

このコマンドでは、次のように指定しています。

  • 700 は権限を数字で表したものです。
    • 1 桁目(7)は、所有者の権限を表します。
    • 2 桁目(0)は、グループの権限を表します。
    • 3 桁目(0)は、その他のユーザーの権限を表します。

各桁は 0〜7 の数字で、読み取り(4)、書き込み(2)、実行(1)の値を加算して求めます。

  • 4: 読み取り権限
  • 2: 書き込み権限
  • 1: 実行権限
  • 0: 権限なし

したがって、1 桁目の 7 は、所有者に読み取り(4)、書き込み(2)、実行(1)の権限を与えます。4+2+1=7

2 桁目の 0 は、グループに権限を与えません(0+0+0=0)。

3 桁目の 0 は、その他のユーザーに権限を与えません(0+0+0=0)。

つまり、700 は次の権限を意味します。所有者は読み取り、書き込み、実行が可能です。グループとその他のユーザーには権限がありません。

変更を確認します。

ls -l example.txt

次のように表示されます。

-rwx------ 1 root root 0 Jul 29 15:11 example.txt

所有者には rwx(読み取り、書き込み、実行)権限があり、グループとその他のユーザーには権限がありません。

ディレクトリの権限を変更する

ディレクトリの権限変更は、ファイルの権限変更と同じように行います。新しいディレクトリを作成し、その権限を変更してみましょう。ディレクトリの権限によって、誰がディレクトリの内容を一覧表示できるか、ディレクトリ内に新しいファイルを作成できるか、すでに存在するファイルにアクセスできるかが決まります。

まず、新しいディレクトリを作成し、標準とは異なる権限を設定します。

mkdir ~/test-dir
chmod 700 ~/test-dir

次に、現在の権限を確認します。

ls -ld ~/test-dir

ls -l-d オプションを指定すると、ディレクトリの内容ではなく、ディレクトリ自体が一覧表示されます。-d を指定しない場合、現在は空の test-dir の中にあるファイルやサブディレクトリが表示されます。次のように表示されます。

drwx------ 2 labex labex 4096 Jul 29 15:45 /home/labex/test-dir

先頭の d は、対象がディレクトリであることを示します。rwx------ は、所有者には読み取り、書き込み、実行の権限があり、グループとその他のユーザーには権限がないことを示します。ディレクトリでは、各権限は次の意味を持ちます。

  • 読み取り権限(r)があると、ls を使ってディレクトリの内容を一覧表示できます。
  • 書き込み権限(w)があると、ディレクトリ内に新しいファイルやサブディレクトリを作成できます。
  • 実行権限(x)があると、ディレクトリ内のファイルやサブディレクトリにアクセスできます(つまり、そのディレクトリに cd で移動できます)。

次に、権限を変更します。

chmod -R 755 ~/test-dir

このコマンドでは、次のように指定しています。

  • -R は、すべてのファイルとサブディレクトリに変更を再帰的に適用します(この例ではディレクトリは空です)。現在空であっても、後からファイルを追加する場合に備えて、ディレクトリを扱うときに指定しておくのはよい習慣です。
  • 755 は、所有者に読み取り、書き込み、実行の権限を与え、グループとその他のユーザーには読み取りと実行の権限を与えます。

755 の内訳は次のとおりです。

  • 所有者(7):読み取り(4)+ 書き込み(2)+ 実行(1)= 7
  • グループ(5):読み取り(4)+ 実行(1)= 5
  • その他のユーザー(5):読み取り(4)+ 実行(1)= 5

変更を確認します。

ls -ld ~/test-dir

次のように表示されます。

drwxr-xr-x 2 labex labex 4096 Jul 29 15:45 /home/labex/test-dir

権限が、所有者だけがアクセスできる 700 から、所有者にはすべての権限があり、その他のユーザーには読み取りと実行が許可される 755 に変わったことが分かります。これで、誰でも test-dir の内容を一覧表示し、その中のファイルにアクセスできます。ただし、新しいファイルを作成したり既存ファイルを変更したりできるのは所有者だけです。

権限に記号表記を使う

数字表記は簡潔ですが、特定の権限だけを変更したい場合は、記号表記のほうが直感的です。記号表記では、ユーザー、グループ、その他のユーザーを文字で表し、権限の追加や削除には演算子を使います。

このステップでは、小さな shell script を作成し、そのスクリプトに実行権限を追加します。

まず、内容を含む新しいスクリプトファイルを作成します。

cd ~/project
echo '#!/bin/bash' > script.sh
echo 'echo "Hello, World"' >> script.sh

このコマンドは次の 2 つの処理を行います。

  • 最初の echo コマンドは script.sh を作成し、最初の行として #!/bin/bash を書き込みます。この行は shebang と呼ばれ、Linux に Bash を使ってスクリプトを実行するよう指示します。
  • 2 番目の echo コマンドは、>> を使ってファイルの末尾に新しい行を追加します。追加する内容は echo "Hello, World" で、スクリプトを実行すると Hello, World が表示されます。

次のコマンドを使うと、ファイルに 2 つの行が入っていることを確認できます。

cat script.sh

次のように表示されます。

#!/bin/bash
echo "Hello, World"

次に、初期状態の権限を確認します。

ls -l script.sh

次のような出力が表示されます。

-rw-rw-r-- 1 labex labex 32 Jul 29 16:30 script.sh

初期状態では、スクリプトの権限は、所有者とグループには読み取りと書き込み、その他のユーザーには読み取りだけが許可されています。プログラムとして実行するために必要な実行権限はありません。

スクリプトを実行してみます。

./script.sh

まだスクリプトに実行権限がないため、「Permission denied」というエラーが表示されます。./ は、現在のディレクトリにあるスクリプトを shell で実行することを示します。

次に、記号表記を使って所有者に実行権限を追加します。

chmod u+x script.sh

このコマンドでは、次のように指定しています。

  • u はユーザー(所有者)を表します。その他の指定には、グループを表す g、その他のユーザーを表す o、ユーザー・グループ・その他のユーザーすべてを表す a があります。
  • +x は実行権限を追加します。+ は権限の追加、- は権限の削除を表します。

つまり、u+x は「所有者に実行権限を追加する」という意味です。

変更を確認します。

ls -l script.sh

次のように表示されます。

-rwxrw-r-- 1 labex labex 32 Jul 29 16:30 script.sh

所有者に rwx(読み取り、書き込み、実行)権限が付いています。

もう一度スクリプトを実行します。

./script.sh

今度は、次の出力が表示されます。

Hello, World

この例から、スクリプトに実行権限を追加する必要がある理由と、権限を追加する前後の違いが分かります。記号表記を使うと、権限全体の数字を計算し直さなくても、特定の権限だけを簡単に変更できます。

まとめ

この実験では、ファイル権限を管理するための Linux の重要なコマンドを学びました。

  1. touch を使って新しいファイルを作成し、既存ファイルを更新しました。
  2. chown を使ってファイルとディレクトリの所有権を変更しました。また、ディレクトリ構造全体に対して再帰的に所有権を変更する方法も学びました。
  3. chmod の数字表記と記号表記を使って、ファイルとディレクトリの権限を変更しました。所有者、グループ、その他のユーザーに対する権限レベルの違いも確認しました。
  4. スクリプトを実行するには実行権限が必要であることなど、権限が重要になる具体例を確認しました。
  5. chmod の数字表記と記号表記の違い、およびそれぞれが適している場面を確認しました。

これらのコマンドは、Linux システムのセキュリティを維持し、アクセスを制御するために不可欠です。権限を変更するとき、特に sudo を使うときは、常に注意してください。誤った変更は、システムのセキュリティや機能に重大な影響を与える可能性があります。コマンドを実行する前に必ず内容を再確認し、変更によって生じる影響を理解してから実行してください。