〇 ファイルやディレクトリーを安全に扱う、パーミッションを変更するLinuxコマンド。
いまのLinuxは、マウスの操作だけでも十分に使いこなせるでしょう。けれども、コマンドの操作を覚えれば、Linuxがもっと使いやすく、面白くなります。Linuxコマンドの使い方を、基礎から分かりやすく解説します。今回と次回で、ファイルやディレクトリーを安全に扱うためのパーミッションを中心に紹介します。
LinuxなどUNIX由来のOSでは、ファイルやディレクトリーに「パーミッション」と呼ぶアクセス権限を設定して管理しています。最近では「ACL」や「SELinux」といったより高度なアクセス制御の仕組みが利用できますが、基本は今回紹介するパーミッションです。
パーミッションではユーザーを「所有者」「所有グループ」「その他のユーザー」に分類し、それぞれに「読み出し可能(r)」「書き換え可能(w)」「実行可能(x)」といったアクセス権限を設定します。ファイルの所有者、所有グループ、およびパーミッションは、「ls」コマンドに「-l」オプションを付けて実行すると表示されます(図1)。読み出しが許可されていれば「r」(Read)、書き換えが許可されていれば「w」(Write)、実行が許可されていれば「x」(eXecute)と表示されます。
本連載の2024年6月公開分で説明したように、ファイルを作成した時点では作成したユーザーが「所有者」となり、所有者のプライマリグループが「所有グループ」となります。Ubuntuの場合、ユーザーのプライベートグループ*1がプライマリグループとなります。
ファイルのパーミッション。
パーミッションは、ファイルとディレクトリーで少し意味合いが異なります(表1)。ファイルの場合、「読み出し可能」と「書き換え可能」はそれぞれファイルの読み出しと書き換えができることを意味します。例えばユーザーのパスワードを暗号化して格納したファイル「/etc/shadow」の所有者は「root」であり、rootと所有グループ「shadow」だけに読み出しが許可されています(図2)。同ファイルを一般ユーザーが参照しようとしても、次のようにエラーが表示されて参照できません。
「実行可能」とはファイルが実行できることを意味します。Linuxコマンドの多くは実行可能形式のコマンドです。一例としてlsコマンドのパーミッションを確認してみましょう。最初に「which」コマンドで保存先を調べてから確認します。
所有者、所有グループ、その他のユーザーに実行「x」が許可されていることが分かります。このため、lsコマンドは任意のユーザーが実行できます。
ディレクトリーのパーミッション。
UNIX系OSでは、ディレクトリーは「その下のファイルの一覧表が保存されたファイル」のイメージで捉えるとよいでしょう。ディレクトリーが「読み出し可能」とは、一覧表を読み出せる、つまりlsコマンドで一覧表示できることを意味します。「書き換え可能」は一覧表が書き換えられる、つまりその下にファイルを作成・削除できる、「実行可能」は、その下に移動できることを意味します。
実行が許可されていないと、「cd」コマンドでその下のディレクトリーに移動したり、「find」コマンドでその下のファイルを検索したりできません。例えばrootユーザーのホームディレクトリーは「/root」ですが、rootユーザー以外には読み込み、書き換え、実行が許可されていません。
このため一般ユーザーが/rootを参照したり移動したりしても実行されません。
パーミッションを変更する。
既存のファイルやディレクトリーのパーミッションを変更するには「chmod」コマンドを使います。
chmod。
変更できるのはファイルの所有者か、root権限を持っている場合です。次の書式で実行します。
パーミッションは、記号または数字(3桁の8進数)で指定します。記号については表2に示した三つの変更内容を、ユーザー、オペレータ、アクセス権限の順につなげて指定します。例えば「その他のユーザー」に対して書き換え権限を追加するには「o+w」と指定してchmodコマンドを実行します。具体例としてUbuntuで「touch」コマンドを使って空のファイルを作成し、パーミッションを確認してみましょう。
パーミッションは「rw-rw-r--」となります。このファイルに、その他のユーザーの書き換え権限を追加するには次のようにchmodコマンドを実行します。
ユーザーの「u」「g」「o」は複数指定しても構いません。すべてのユーザーの書き換え権限を削除するには、次のように「ugo-w」と指定します。「ugo」の代わりに「a」と指定しても削除できます。
オペレータの「=」には注意が必要です。「+」と「-」は指定したユーザーの既存の設定に新たなアクセス権限を追加、削除しますが、「=」は既存の設定をクリアして新たな権限を設定します(図3)。
書き換え許可がなくても削除で。きることに注意。
ファイルのパーミッションの注意点に、書き換え権限がなくてもファイルを削除できることがあります。実際に次のように所有者の書き換え権限を削除してから「rm」コマンドを実行すると、「~を削除しますか?」と聞かれ、「y⏎」で削除できてしまいます。
実は、ファイルを削除できるかどうかは、そのファイルが保存されているディレクトリーの書き換え権限に依存するのです。その理由は、ディレクトリーがファイルの一覧を格納した特別なファイルだからです。同じ理由で、ファイルの移動もファイルの書き換え権限とは関係なく、そのファイルが保存されているディレクトリーの書き換え権限に依存します。
パーミッションの設定には優先順位がある。
パーミッションの設定は「所有者」「グループ」「その他のユーザー」の優先順位で判断されます。例えば「その他のユーザー」の読み込みが許可されていても、すべてのユーザーが読み込みを許可されるわけではありません。所有者に読み込みが許可されていないときは、所有者自身もファイルを表示できません。
パーミッションを3桁の8進数で設定する方法。
パーミッションは3桁の8進数となる数字でも設定できます。指定方法は、ユーザーごとに「読み込み可能(r)」「書き換え可能(w)」「実行可能(x)」を、許可されている場合は「1」、許可されていない場合は「0」として接続し、これを2進数とみなして8進数に変換します。さらに変換後の8進数を、所有者、所有グループ、その他のユーザーの順につなげます(図4)。次にパーミッションを「600」(rw-------)に設定する例を示します。
複数ファイルのパーミッションをまとめて設定。
続いて、複数のファイルのパーミッションをまとめて設定する方法を紹介します。例えばあるディレクトリー直下の拡張子「.txt」のファイルのパーミッションをまとめて変更したいときは、シェルのワイルドカード「*」を使用します。
指定したディレクトリー内にあるすべてのファイルとディレクトリーのパーミッションをまとめて設定したいときは、chmodコマンドに「-R」オプションを付け、引数にディレクトリーを指定して実行します。例えば「test」ディレクトリー以下を丸ごと設定したければ、次のように実行します。
この場合、ファイルだけでなくディレクトリーのパーミッションも変更されます。ファイルだけを変更したいときは、本連載の2023年11月公開分で解説した「find」コマンドを組み合わせます。「-type f」オプションを指定して検索結果をファイルに絞り込みます。次の実行例では、testディレクトリー以下のすべてのファイルの書き込み権限を、すべてのユーザーに対して削除します。
ディレクトリーだけを変更したいときは「-type d」オプションを指定します。