chmodコマンドはファイルのアクセス権限を変更するコマンドです。
アクセス権限を変更することで、権限がないユーザがファイルの削除、書き換え、読み込み等を防ぐことができます。
目次
アクセス権限について
アクセス権限は主に3つの種類の権限に分かれます。それらの権限は、
1.読み込み(read)、
2.書き込み(write)、
3.実行・検索(execution・search)
になります。これらの権限はファイルかディレクトリかによって、動作が異なります。
また、アクセス権限は3つの種類のユーザに対して行われます。それらのユーザは
1.所有者(user)、
2.グループ(group)、
3.グループでないユーザ(others)
になります。例えば、lsコマンドでアクセス権限を確認してみます。
1 2 |
$ ls -l file.txt -rwxrwxrwx 1 ubuntu ubuntu 60 11月 11 19:21 file.txt |
ここで表示されている一番左の列に表示されるrwxの文字がアクセス権限の有無を表しています。
それぞれのアクセス権限を赤い文字で説明すると対応する部分は以下のようになります。
-rwxrwxrwx :所有者(user)
-rwxrwxrwx :グループ(group)
-rwxrwxrwx :グループでないユーザ(others)
つまり、ここでは、file.txtにはすべてのユーザに対して、ファイルの読み込み、書き込み、実行の権限があることになります。
読み込み権限
・ファイルの場合はファイルを読み込むことができるかどうかの権限になります。
・ディレクトリの場合はディレクトリの内容をリストすることができるかどうかの権限になります。
読み込み権限がないとき、ファイルの場合は、catコマンド等でファイルを開くことができません。
読み込み権限の有無の違いの例(ファイル)
1 2 3 4 5 6 7 8 9 10 |
$ ls -l file.txt -rwx------ 1 ubuntu ubuntu 60 11月 11 19:21 file.txt $ $ cat file.txt <---file.txt content begin---> <---file.txt content end---> $ $ chmod u-r file.txt $ cat file.txt cat: file.txt: Permission denied |
ディレクトリの場合は、lsコマンド等で読み込み権限がないディレクトリの内容を表示することができません。しかし、ディレクトリの読み込み権限がない時でもそのディレクトリに移動したり、そのディレクトリの内容のファイルを開くことはできます。
読み込み権限の有無の違いの例(ディレクトリ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ ls -lR .: 合計 8 drwx------ 2 ubuntu ubuntu 4096 11月 13 13:18 dir -rwx------ 1 ubuntu ubuntu 60 11月 11 19:21 file.txt ./dir: 合計 4 -rwx------ 1 ubuntu ubuntu 21 11月 13 13:18 dir_file.txt $ $ chmod u-r dir $ ls -lR .: 合計 8 d-wx------ 2 ubuntu ubuntu 4096 11月 13 13:18 dir -rwx------ 1 ubuntu ubuntu 60 11月 11 19:21 file.txt ls: ディレクトリ './dir' を開くことが出来ません: Permission denied $ $ cat dir/dir_file.txt dir_file.txt content |
書き込み権限
・ファイルの場合は内容の変更を行うことができるかどうかの権限になります。
・ディレクトリの場合はそのディレクトリの内容にあるファイルの作成や削除をすることができるかどうかの権限になります。
書き込み権限がないとき、ファイルの場合、内容の変更を行うことが出来ません。
書き込み権限の有無の違いの例(ファイル)
1 2 3 4 5 6 7 |
$ ls -l file.txt -rwx------ 1 ubuntu ubuntu 60 11月 13 13:30 file.txt $ echo "test" >> file.txt $ $ chmod u-w file.txt $ echo "test" >> file.txt bash: file.txt: Permission denied |
ディレクトリの場合、そのディレクトリにファイルの作成や削除を行うことができません。
書き込み権限の有無の違いの例(ディレクトリ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ ls -lR .: 合計 4 drwx------ 2 ubuntu ubuntu 4096 11月 13 13:18 dir -rwx------ 1 ubuntu ubuntu 0 11月 13 13:43 file.txt ./dir: 合計 4 -rwx------ 1 ubuntu ubuntu 21 11月 13 13:18 dir_file.txt $ touch dir/new_file.txt $ $ chmod u-w dir $ touch dir/new_file2.txt touch: 'dir/new_file2.txt' に touch できません: Permission denied $ $ rm -f dir/new_file.txt rm: 'dir/new_file.txt' を削除できません: Permission denied |
実行(検索)権限
・ファイルの場合は、実行権限になります。この実行権限はファイルをプログラムとして実行することができるかどうかの権限になります。
・ディレクトリの場合は、検索権限になります。この検索権限の意味はそのディレクトリ内のファイルにアクセスできるかどうかの権限になります。
実行権限がないとき、ファイルの場合、プログラムとして実行することができません。
実行権限の有無の違いの例(ファイル)
1 2 3 4 5 6 7 8 9 10 11 12 |
$ ls -l file.sh -rwx------ 1 ubuntu ubuntu 32 11月 13 16:49 file.sh $ cat file.sh #!/bin/bash echo "test program" $ $ ./file.sh test program $ $ chmod u-x file.sh $ ./file.sh bash: ./file.sh: Permission denied |
ディレクトリの場合は、この実行(検索)権限がないとき、そのディレクトリに移動したり、そのディレクトリの内容のファイルを開くことができません。しかし、lsコマンド等でそのディレクトリの内容のファイル名を表示させることは可能になります。
実行権限の有無の違いの例(ディレクトリ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
$ ls -lR .: 合計 8 drwx------ 2 ubuntu ubuntu 4096 11月 13 16:46 dir -rwx------ 1 ubuntu ubuntu 32 11月 13 16:49 file.sh ./dir: 合計 4 -rwx------ 1 ubuntu ubuntu 21 11月 13 13:18 dir_file.txt $ $ chmod u-x dir $ cd dir bash: cd: dir: Permission denied $ cat dir/dir_file.txt cat: dir/dir_file.txt: Permission denied $ $ ls -lR .: 合計 8 drw------- 2 ubuntu ubuntu 4096 11月 13 16:46 dir -rwx------ 1 ubuntu ubuntu 32 11月 13 16:49 file.sh ./dir: ls: './dir/dir_file.txt' にアクセスできません: Permission denied 合計 0 -????????? ? ? ? ? ? dir_file.txt |
特別なアクセス権限
上記の読み込み、書き込み、実行権限の他に特別なアクセス権限があります。特別なアクセス権限は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の表示例
1 2 |
$ ls -l setuid_cat -rwsr-xr-x 1 root root 163912 11月 13 18:46 setuid_cat |
このsetuid_catというファイルはcatコマンドのプログラムをコピーし、所有者をrootにし、set-user-ID bitを付与したものになります。このプログラムを用いれば、rootでしか表示できないファイルを表示することができます。
set-user-ID bitがあるプログラムの実行例
1 2 3 4 5 6 7 8 9 10 |
$ whoami ubuntu $ ls -l 合計 168 -rwx------ 1 root root 18 11月 13 18:49 file.txt -rwsr-xr-x 1 root root 163912 11月 13 18:46 setuid_cat $ cat file.txt cat: file.txt: Permission denied $ ./setuid_cat file.txt <---file.txt---> |
この実行例で、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の表示例
1 2 |
$ ls -l setgid_cat -rwxr-sr-x 1 root group 163912 11月 13 18:46 setgid_cat |
set-group-ID bitは、set-user-ID bitの実効ユーザを実効グループにしたものになります。
また、ほとんどのシステムでは、set-group-ID bitをディレクトリに付与すると、そのディレクトリの内で作られたファイルには、そのディレクトリと同じグループが設定されます。
set-group-ID bitでファイル作成時に同じグループが設定される例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ ls -lR .: 合計 4 drwxrwsr-x 2 ubuntu group 4096 11月 14 14:08 dir ./dir: 合計 0 $ $ touch dir/file.txt $ ls -lR .: 合計 4 drwxrwsr-x 2 ubuntu group 4096 11月 14 14:08 dir ./dir: 合計 0 -rw-rw-r-- 1 ubuntu group 0 11月 14 14:08 file.txt |
スティッキービット(制限付き削除フラグ)
スティッキービット(制限付き削除フラグ)はディレクトリの内容のファイルを、root権限を除いて、そのファイルの所有者もしくはディレクトリの所有者しか削除または名前の変更ができません。
スティッキービットはグループ以外のユーザの実行権限がxではなく、tもじくはTの文字で表示されます。実行権限がある場合はtの文字が、実行権限がない場合はTの文字で表示されます。
スティッキービットの表示例
1 2 3 4 5 6 7 8 |
$ ls -l 合計 4 drwxrwxr-t 2 ubuntu ubuntu 4096 11月 14 14:44 dir $ $ chmod o-x dir $ ls -l 合計 4 drwxrwxr-T 2 ubuntu ubuntu 4096 11月 14 14:44 dir |
スティッキービットは、ディレクトリの権限に書き込み権限があり、他のユーザがファイルを削除できるようになっている場合でも、他のユーザはそのディレクトリ内のファイルを削除できません。
スティッキービットのファイル削除が制限される例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
$ whoami owner $ ls -lR .: 合計 4 drwxrwxrwt 2 ubuntu ubuntu 4096 11月 14 14:59 dir ./dir: 合計 0 -rwxrwxrwx 1 ubuntu ubuntu 0 11月 14 14:59 file.txt $ $ rm dir/file.txt rm: 'dir/file.txt' を削除できません: Operation not permitted $ $ exit exit $ $ whoami ubuntu $ ls -lR .: 合計 4 drwxrwxrwt 2 ubuntu ubuntu 4096 11月 14 14:59 dir ./dir: 合計 0 -rwxrwxrwx 1 ubuntu ubuntu 0 11月 14 14:59 file.txt $ rm dir/file.txt $ ls -lR .: 合計 4 drwxrwxrwt 2 ubuntu ubuntu 4096 11月 14 15:01 dir ./dir: 合計 0 |
chmodコマンドの構文
chmodコマンドの構文
1 |
chmod [option]... {mode} file... |
modeはアクセス権限の指定になります。アクセス権限の指定方法については、次に記述します。
アクセス権限の指定方法
アクセス権限の指定方法は2つあります。
- シンボル形式
- 数字形式
シンボル形式は
1 |
chmod u=rwx,og=rx file.txt |
のような形式になります。シンボル形式の特徴としては、記述量がほとんどの場合に多くなりやすいですが、どのアクセス権限が指定されているかがわかりやすいです。
数字形式は
1 |
chmod 755 file.txt |
のような形式です。数字形式の特徴としては、ユーザに対するそれぞれのアクセス権限について許可するかしないかの3ビットで表し、8進数のような形式でアクセス権限を指定します。記述量が少なく、一度覚えると便利な形式になります。
シンボル形式
シンボル形式は以下の構文で記述できます。
1 |
[ugoa...][-+=][rwxXst...][,...] |
"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 | 条件付きで、実行権限を付与 ・ファイルの場合、既に実行権限がある場合に実行権限を付与 ・ディレクトリの場合、実行権限を付与 |
シンボル形式で複数の記述を行う際は、カンマで区切って記述します。
1 |
u=rwx,go=rx |
sやtのような特殊なアクセス権限は、u+s、g+s、a+s、o+t(または+t)のように使用することができます。
既存のアクセス権限を別のユーザに対して使用することもできます。これはrwxのようなアクセス権限の代わりにugoのようなユーザを指定することで使用できます。
既存のアクセス権限の使用例
1 2 3 4 5 |
$ ls -l file.txt -rwx------ 1 ubuntu ubuntu 0 11月 14 17:23 file.txt $ chmod o=u file.txt $ ls -l file.txt -rwx---rwx 1 ubuntu ubuntu 0 11月 14 17:23 file.txt |
数字形式
数字形式はアクセス権限を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コマンドはアクセス権限を変更することができます。ここでは、ファイルに対して自分だけファイルの読み込み、書き込み、実行の権限にします。
コマンド例
1 |
chmod 700 file.txt |
または
1 |
chmod u=rwx,go= file.txt |
コマンド例実行前
1 2 3 |
$ ls -l 合計 4 -rw-r--r-- 1 ubuntu ubuntu 5 11月 5 11:55 file.txt |
実行結果
1 2 3 |
$ ls -l 合計 4 -rwx------ 1 ubuntu ubuntu 5 11月 5 11:55 file.txt |
再帰的に変更
(-Rオプション)
-Rオプションはディレクトリとそのディレクトリの内容のアクセス権限を再帰的に変更します。
コマンド例
1 |
chmod -R 700 . |
または
1 |
chmod -R u=rwx,go= . |
コマンド例実行前
1 2 3 4 5 6 7 |
$ ls -al 合計 8 drwxrwxr-x 2 ubuntu ubuntu 4096 11月 11 13:22 . drwxr-xr-x 81 ubuntu ubuntu 4096 11月 11 13:20 .. -rw-rw-r-- 1 ubuntu ubuntu 0 11月 11 13:22 file.txt -rw-rw-r-- 1 ubuntu ubuntu 0 11月 11 13:22 file1.txt -rw-rw-r-- 1 ubuntu ubuntu 0 11月 11 13:22 file2.txt |
実行結果
1 2 3 4 5 6 7 |
$ ls -al 合計 8 drwx------ 2 ubuntu ubuntu 4096 11月 11 13:22 . drwxr-xr-x 81 ubuntu ubuntu 4096 11月 11 13:20 .. -rwx------ 1 ubuntu ubuntu 0 11月 11 13:22 file.txt -rwx------ 1 ubuntu ubuntu 0 11月 11 13:22 file1.txt -rwx------ 1 ubuntu ubuntu 0 11月 11 13:22 file2.txt |
処理内容の情報を表示
(-vオプション)
-vオプションは、冗長モード(詳細な情報を表示するモード)で、アクセス権限を変更するかしないかの情報を表示します。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ ls -al 合計 8 drwxrwxr-x 2 ubuntu ubuntu 4096 11月 11 14:04 . drwxr-xr-x 81 ubuntu ubuntu 4096 11月 11 13:20 .. -rw-rw-r-- 1 ubuntu ubuntu 0 11月 11 14:04 file.txt -rw-rw-r-- 1 ubuntu ubuntu 0 11月 11 14:04 file1.txt -rw-rw-r-- 1 ubuntu ubuntu 0 11月 11 14:04 file2.txt $ $ chmod -v -R 700 . '.' のモードを 0775 (rwxrwxr-x) から 0700 (rwx------) へ変更しました './file2.txt' のモードを 0664 (rw-rw-r--) から 0700 (rwx------) へ変更しました './file.txt' のモードを 0664 (rw-rw-r--) から 0700 (rwx------) へ変更しました './file1.txt' のモードを 0664 (rw-rw-r--) から 0700 (rwx------) へ変更しました $ $ ls -al 合計 8 drwx------ 2 ubuntu ubuntu 4096 11月 11 14:04 . drwxr-xr-x 81 ubuntu ubuntu 4096 11月 11 13:20 .. -rwx------ 1 ubuntu ubuntu 0 11月 11 14:04 file.txt -rwx------ 1 ubuntu ubuntu 0 11月 11 14:04 file1.txt -rwx------ 1 ubuntu ubuntu 0 11月 11 14:04 file2.txt |
変更したときにメッセージを表示
(-cオプション)
-cオプションはアクセス権限が変更されたときに、どのようなアクセス権限に変更されたかのメッセージを表示します。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ ls -l 合計 4 -rw-rw-r-- 1 ubuntu ubuntu 5 11月 5 11:55 file.txt -rw-rw-r-- 1 ubuntu ubuntu 0 11月 9 20:23 file2.txt $ $ chmod -c 700 file.txt 'file.txt' のモードを 0664 (rw-rw-r--) から 0700 (rwx------) へ変更しました $ ls -l 合計 4 -rwx------ 1 ubuntu ubuntu 5 11月 5 11:55 file.txt -rw-rw-r-- 1 ubuntu ubuntu 0 11月 9 20:23 file2.txt $ $ chmod -c u=rwx,go= file2.txt 'file2.txt' のモードを 0664 (rw-rw-r--) から 0700 (rwx------) へ変更しました $ ls -l 合計 4 -rwx------ 1 ubuntu ubuntu 5 11月 5 11:55 file.txt -rwx------ 1 ubuntu ubuntu 0 11月 9 20:23 file2.txt |
エラーメッセージを表示しない
(-fオプション)
-fオプションは、変更できないときのエラーメッセージを表示しません。コマンド例では、他ユーザのファイルのアクセス権限を変更しようとして、エラーメッセージを表示しています。また、whoamiコマンドは、自分のログインしているユーザを確認するコマンドになります。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ whoami ubuntu $ ls -l 合計 0 -rw-rw-r-- 1 root root 0 11月 9 20:28 file.txt $ $ chmod 700 file.txt chmod: 'file.txt' のパーミッションを変更しています: Operation not permitted $ $ chmod -f 700 file.txt $ $ ls -l 合計 0 -rw-rw-r-- 1 root root 0 11月 9 20:28 file.txt |
参照のファイルと同じアクセス権限に変更
(--referenceオプション)
--referenceオプションは、このオプションでファイルを指定して、そのファイルと同じアクセス権限にファイルのアクセス権限を変更します。
コマンド例
1 |
chmod --reference=ref_file.txt file.txt |
コマンド例実行前
1 2 3 4 |
$ ls -l 合計 0 -rw-rw-r-- 1 ubuntu ubuntu 0 11月 11 14:25 file.txt -rwx------ 1 ubuntu ubuntu 0 11月 11 14:26 ref_file.txt |
実行結果
1 2 3 4 |
$ ls -l 合計 0 -rwx------ 1 ubuntu ubuntu 0 11月 11 14:25 file.txt -rwx------ 1 ubuntu ubuntu 0 11月 11 14:26 ref_file.txt |