はじめに
この実験では、Linuxにおけるファイル権限の世界を深く掘り下げます。chown、touch、chmodという3つの重要なコマンドについて学びます。これらのツールは、Linuxシステム上のファイルやディレクトリへのアクセスを管理するために不可欠です。この実験を終える頃には、ファイルの作成、所有権の変更、およびファイル権限の変更についてしっかりと理解できているはずです。これらのコマンドを理解することで、システム上のファイルに対して誰が読み取り、書き込み、実行できるかを制御できるようになります。
新しいファイルの作成
まずは touch コマンドを使って新しいファイルを作成することから始めましょう。この多機能なコマンドは、新しい空のファイルを作成したり、既存のファイルのタイムスタンプを更新したりすることができます。ファイルを「触れる(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
この出力を分解してみましょう:
-rw-rw-r--はファイル権限を表します(詳細はステップ4で説明します)。最初の文字はファイルの種類を示します(-は通常のファイル、dはディレクトリなど)。残りの文字は、所有者、グループ、その他のユーザーに対する読み取り、書き込み、実行権限を表します。- 最初の
labexはファイルの現在の所有者です。これはファイルを所有しているユーザー名です。 - 2番目の
labexはファイルの現在のグループです。グループとは、権限を共有できるユーザーの集まりです。 0はファイルのサイズ(バイト単位)です。ファイルは空なので、サイズはゼロです。Jul 29 15:11は最終更新日時です。example.txtはファイル名です。
それでは、ファイルの所有権を root ユーザーに変更してみましょう。root はLinuxシステムにおける管理者アカウントであり、特別な権限を持っています。
sudo chown root:root example.txt
このコマンドの動作は以下の通りです:
sudoはルート権限でコマンドを実行します。パスワードの入力を求められる場合があります。chownはシステムセキュリティに影響を与える強力なコマンドであるため、昇格された権限が必要です。sudoなしでは「Permission denied(権限拒否)」エラーが発生します。chownは所有権を変更するためのコマンドです。root:rootは新しい所有者とグループを指定します(両方ともrootに設定)。構文は所有者:グループです。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オプションは、必要に応じて親ディレクトリを作成するようにmkdirに指示します。-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を作成し、テキストを書き込みます。
現在の所有権を確認しましょう:
ls -lR new-dir
ls -lR は new-dir の中身を再帰的にリスト表示します。-R オプション(再帰的)により、ls は 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.txt と file2.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は権限の数値表現です:- 最初の桁(
7)は所有者の権限を表します。 - 2番目の桁(
0)はグループの権限を表します。 - 3番目の桁(
0)はその他の権限を表します。
- 最初の桁(
各桁は0から7までの数字で、読み取り(4)、書き込み(2)、実行(1)の権限値を加算して計算されます:
4: 読み取り権限2: 書き込み権限1: 実行権限0: 権限なし
したがって、7(最初の桁)は所有者に読み取り(4)、書き込み(2)、実行(1)の権限を与えます:4+2+1=7
0(2番目の桁)はグループに権限を与えません(0+0+0=0)。
0(3番目の桁)はその他に権限を与えません(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 オプションは、中身ではなくディレクトリ自体をリスト表示するように ls に指示します。-d がないと、ls は 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 の中身をリスト表示して中のファイルにアクセスできるようになりましたが、新しいファイルの作成や既存ファイルの変更は所有者のみが行えます。
権限のシンボリック表記の使用
数値表記は簡潔ですが、特定の権限だけを変更したい場合には、シンボリック表記の方が直感的な場合があります。シンボリック表記は、ユーザー、グループ、その他を表す文字と、権限を追加または削除するための演算子を使用します。
このステップでは、小さなシェルスクリプトを作成し、それに実行権限を追加します。
まず、中身のある新しいスクリプトファイルを作成しましょう:
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(権限拒否)」エラーが表示されるはずです。./ の部分は、現在のディレクトリにあるスクリプトを実行するようにシェルに指示しています。
それでは、シンボリック表記 を使って所有者に実行権限を追加しましょう:
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のファイル権限を管理するための重要なコマンドを学びました:
touchを使って新しいファイルを作成し、既存のファイルを更新しました。chownを使ってファイルやディレクトリの所有権を変更する方法を学びました。これにはディレクトリ構造全体に対する再帰的な変更も含まれます。chmodを数値表記とシンボリック表記の両方で使用し、ファイルやディレクトリの権限を変更する練習をしました。所有者、グループ、その他の権限レベルの違いを理解しました。- スクリプトを実行するために実行権限が必要であるなど、権限がなぜ重要なのかという実践的な例を確認しました。
chmodにおける数値表記とシンボリック表記の違い、およびそれぞれがいつ適しているかを明確にしました。
これらのコマンドは、Linuxシステムにおいてセキュリティを維持し、アクセスを制御するために不可欠です。特に sudo を使用して権限を変更する際は、常に注意してください。誤った変更はシステムのセキュリティや機能に重大な影響を与える可能性があります。コマンドを実行する前に必ず再確認し、自分が行っている変更の意味を理解するようにしてください。



