chmod - アクセス権限を変更する

スポンサーリンク

chmodコマンドはファイルのアクセス権限を変更するコマンドです。

アクセス権限を変更することで、権限がないユーザがファイルの削除、書き換え、読み込み等を防ぐことができます。

スポンサーリンク

アクセス権限について

アクセス権限は主に3つの種類の権限に分かれます。それらの権限は、
1.読み込み(read)、
2.書き込み(write)、
3.実行・検索(execution・search)
になります。これらの権限はファイルかディレクトリかによって、動作が異なります。

また、アクセス権限は3つの種類のユーザに対して行われます。それらのユーザは
1.所有者(user)、
2.グループ(group)、
3.グループでないユーザ(others)
になります。例えば、lsコマンドでアクセス権限を確認してみます。

ここで表示されている一番左の列に表示されるrwxの文字がアクセス権限の有無を表しています。

それぞれのアクセス権限を赤い文字で説明すると対応する部分は以下のようになります。
-rwxrwxrwx :所有者(user)
-rwxrwxrwx :グループ(group)
-rwxrwxrwx :グループでないユーザ(others)

つまり、ここでは、file.txtにはすべてのユーザに対して、ファイルの読み込み、書き込み、実行の権限があることになります。

 

 

 

読み込み権限

・ファイルの場合はファイルを読み込むことができるかどうかの権限になります。
・ディレクトリの場合はディレクトリの内容をリストすることができるかどうかの権限になります。

読み込み権限がないとき、ファイルの場合は、catコマンド等でファイルを開くことができません。

読み込み権限の有無の違いの例(ファイル)

 

ディレクトリの場合は、lsコマンド等で読み込み権限がないディレクトリの内容を表示することができません。しかし、ディレクトリの読み込み権限がない時でもそのディレクトリに移動したり、そのディレクトリの内容のファイルを開くことはできます。

読み込み権限の有無の違いの例(ディレクトリ)

 

 

 

書き込み権限

・ファイルの場合は内容の変更を行うことができるかどうかの権限になります。
・ディレクトリの場合はそのディレクトリの内容にあるファイルの作成や削除をすることができるかどうかの権限になります。

書き込み権限がないとき、ファイルの場合、内容の変更を行うことが出来ません。

書き込み権限の有無の違いの例(ファイル)

 

ディレクトリの場合、そのディレクトリにファイルの作成や削除を行うことができません。

書き込み権限の有無の違いの例(ディレクトリ)

 

 

 

実行(検索)権限

・ファイルの場合は、実行権限になります。この実行権限はファイルをプログラムとして実行することができるかどうかの権限になります。
・ディレクトリの場合は、検索権限になります。この検索権限の意味はそのディレクトリ内のファイルにアクセスできるかどうかの権限になります。

実行権限がないとき、ファイルの場合、プログラムとして実行することができません。

実行権限の有無の違いの例(ファイル)

 

ディレクトリの場合は、この実行(検索)権限がないとき、そのディレクトリに移動したり、そのディレクトリの内容のファイルを開くことができません。しかし、lsコマンド等でそのディレクトリの内容のファイル名を表示させることは可能になります。

実行権限の有無の違いの例(ディレクトリ)

 

 

 

特別なアクセス権限

上記の読み込み、書き込み、実行権限の他に特別なアクセス権限があります。特別なアクセス権限はset-user-ID bit(setuid bit) 、set-group-ID bit(setgid bit)、スティッキービット(または制限付き削除フラグ)があります。

set-user-ID bit

set-user-ID bitは、ファイルを実行するとき、プロセスの実効ユーザをそのファイルの所有者にすることができます。実効ユーザはファイルのアクセス権限で検査されるユーザになります。基本的にはファイルを実行したユーザと実効ユーザは同じなります。つまり、set-user-ID bitは実行したユーザと実効ユーザを別にすることができる権限になります。

set-user-ID bitがついたファイルは、ユーザの実行権限がxの文字ではなく、sの文字で表示されます。

set-user-ID bitの表示例

 

このsetuid_catというファイルはcatコマンドのプログラムをコピーし、所有者をrootにし、set-user-ID bitを付与したものになります。このプログラムを用いれば、rootでしか表示できないファイルを表示することができます。

set-user-ID bitがあるプログラムの実行例

この実行例で、file.txtはrootしかアクセス権限がありません。通常のcatコマンドでは実効ユーザはubuntuというユーザになります。しかし、アクセス権限がないためfile.txtというファイルを表示することができません。一方でsetuid_catはrootという所有者でさらにset-user-ID bitが付けられているため、rootという実効ユーザとして実行されます。そのため、file.txtを表示することができます。

 

 

 

set-group-ID bit

set-group-ID bitは、ファイルを実行するとき、プロセスの実効グループをそのファイルのグループにすることができます。実効グループはファイルのアクセス権限で検査されるグループになります。

set-group-ID bitがついたファイルは、グループの実行権限がxの文字ではなく、sの文字で表示されます。

set-group-ID bitの表示例

set-group-ID bitは、set-user-ID bitの実効ユーザを実効グループにしたものになります。

また、ほとんどのシステムでは、set-group-ID bitをディレクトリに付与すると、そのディレクトリの内で作られたファイルには、そのディレクトリと同じグループが設定されます。

set-group-ID bitでファイル作成時に同じグループが設定される例

 

 

 

スティッキービット(制限付き削除フラグ)

スティッキービット(制限付き削除フラグ)はディレクトリの内容のファイルを、root権限を除いて、そのファイルの所有者もしくはディレクトリの所有者しか削除または名前の変更ができません。

スティッキービットはグループ以外のユーザの実行権限がxではなく、tもじくはTの文字で表示されます。実行権限がある場合はtの文字が、実行権限がない場合はTの文字で表示されます。

スティッキービットの表示例

 

スティッキービットは、ディレクトリの権限に書き込み権限があり、他のユーザがファイルを削除できるようになっている場合でも、他のユーザはそのディレクトリ内のファイルを削除できません。

スティッキービットのファイル削除が制限される例

 

 

 

chmodコマンドの構文

chmodコマンドの構文

 

modeはアクセス権限の指定になります。アクセス権限の指定方法については、次に記述します。

 

 

 

アクセス権限の指定方法

アクセス権限の指定方法は2つあります。

  1. シンボル形式
  2. 数字形式

シンボル形式は

のような形式になります。シンボル形式の特徴としては、記述量がほとんどの場合に多くなりやすいですが、どのアクセス権限が指定されているかがわかりやすいです。

 

数字形式は

のような形式です。数字形式の特徴としては、ユーザに対するそれぞれのアクセス権限について許可するかしないかの3ビットで表し、8進数のような形式でアクセス権限を指定します。記述量が少なく、一度覚えると便利な形式になります。

 

 

 

シンボル形式

シンボル形式は以下の構文で記述できます。

 

"ugoa"のそれぞれの記号はアクセス権限をどのユーザに対して付与するかになります。
"-+="のそれぞれの記号は権限を削除、追加、代入の操作を行う演算子についてになります。
"rwxXst"のそれぞれの記号はアクセス権限についてになります。

ユーザに対する記号

記号 対応するユーザ
u 所有者(user)
g グループ(group)
o グループでないユーザ(others)
a 全てのユーザ(all)、ugoと同じ

 

演算子の記号

記号 意味
+ 指定した権限を追加
- 指定した権限を削除
= 指定した権限に変更

 

アクセス権限に関する記号

記号
r 読み込み(read)
w 書き込み(write)
x 実行(execution)
その他の記号
s uを指定しているときにset-user-ID(SUID)
gを指定しているときにset-group-ID(SGID)
t スティッキービット(制限付き削除フラグ)
X 条件付きで、実行権限を付与
・ファイルの場合、既に実行権限がある場合に実行権限を付与
・ディレクトリの場合、実行権限を付与

 

シンボル形式で複数の記述を行う際は、カンマで区切って記述します。

sやtのような特殊なアクセス権限は、u+s、g+s、a+s、o+t(または+t)のように使用することができます。

 

既存のアクセス権限を別のユーザに対して使用することもできます。これはrwxのようなアクセス権限の代わりにugoのようなユーザを指定することで使用できます。

既存のアクセス権限の使用例

 

 

 

数字形式

数字形式はアクセス権限を755のように指定することができます。これはシンボル形式の「u=rwx,go=rx」と同じになり、基本的にシンボル形式より記述が短くなります。

数字形式は、所有者、グループ、グループでないユーザに対してそれぞれ3ビットを割り振った8進数のような記述を行います。

数字形式の対応表

数字 ファイルのグループではないユーザ
1 実行と検索
2 書き込み
4 読み込み
ファイルのグループ
10 実行と検索
20 書き込み
40 読み込み
ファイルの所有者
100 実行と検索
200 書き込み
400 読み込み
Special mode bits
1000 スティッキービット(制限付き削除フラグ)
2000 set-group-ID(SGID)
4000 set-user-ID(SUID)

 

例えば、ユーザの読み込み(400)とユーザの書き込み(200)を行う場合は、600で記述ができ、これは表の数字の和として表現できます。また、0はシンボル形式の「a=」と同じで全てのユーザに対するアクセス権限がなくなります。

 

 

 

chmodコマンドの利用例

アクセス権限の変更
(オプションなし)

chmodコマンドはアクセス権限を変更することができます。ここでは、ファイルに対して自分だけファイルの読み込み、書き込み、実行の権限にします。

コマンド例

または

 

コマンド例実行前

 

実行結果

 

 

 

再帰的に変更
(-Rオプション)

-Rオプションはディレクトリとそのディレクトリの内容のアクセス権限を再帰的に変更します。

コマンド例

または

コマンド例実行前

実行結果

 

 

 

処理内容の情報を表示
(-vオプション)

-vオプションは、冗長モード(詳細な情報を表示するモード)で、アクセス権限を変更するかしないかの情報を表示します。

コマンド例と実行結果

 

 

 

変更したときにメッセージを表示
(-cオプション)

-cオプションはアクセス権限が変更されたときに、どのようなアクセス権限に変更されたかのメッセージを表示します。

コマンド例と実行結果

 

 

 

エラーメッセージを表示しない
(-fオプション)

-fオプションは、変更できないときのエラーメッセージを表示しません。コマンド例では、他ユーザのファイルのアクセス権限を変更しようとして、エラーメッセージを表示しています。また、whoamiコマンドは、自分のログインしているユーザを確認するコマンドになります。

コマンド例と実行結果

 

 

 

参照のファイルと同じアクセス権限に変更
(--referenceオプション)

--referenceオプションは、このオプションでファイルを指定して、そのファイルと同じアクセス権限にファイルのアクセス権限を変更します。

コマンド例

コマンド例実行前

実行結果

 

 

 

参考

GNU Coreutils: chmod invocation