chmodコマンド
ファイルやディレクトリのアクセス権を変更できるコマンドです。
書式
chmod [オプション] アクセス権 ファイル名
オプション
| オプション | 説明 |
| -v | 詳細を表示する。 |
| -R | 指定したディレクトリ内全てのアクセス権を変更する。 |
| -f | エラ〜メッセージを表示しない。 |
ファイルとディレクトリのアクセス権について
アクセス権はファイルとディレクトリにそれぞれ付与できるので、以下の表で確認します。
| 権限 | ファイル | ディレクトリ |
| r(読み) | ファイルの内容を読みれる。 | ディレクトリ内の内容を参照できる。 |
| w(書き) | ファイルに書き込むことが出来る。 | ディレクトリ内に新規ファイルの作成、ファイルの名前変更・削除ができる。 |
| x(実行) | ファイルを実行できる。 | ディレクトリ内へのファイルアクセス、ディレクトリへの移動ができる。 |
chmodでアクセス権を付与することはよく実施しますが、ディレクトリのアクセス権を意識したことがあまり無かったので、検証してみたいと思います。
検証
※以下検証はCentOS8で検証しています。
まずは土台となる環境を作りました。いろいろとやっていますが、treeコマンドでざっくりとした部分は確認できます。
[root@localhost testuser]# pwd
/home/testuser
[root@localhost testuser]# chmod 777 /home/testuser
[root@localhost testuser]# umask
0022
[root@localhost testuser]# touch moti01 moti02 moti03
[root@localhost testuser]# mkdir /home/testuser/ricecake01
[root@localhost testuser]# cd ricecake01/
[root@localhost ricecake01]# touch Moti01 Moti02 Moti03
[root@localhost ricecake01]# cd ..
[root@localhost testuser]# cp -R /home/testuser/ricecake01/ /home/testuser/ricecake02/
[root@localhost testuser]# cp -R /home/testuser/ricecake01/
[root@localhost testuser]# tree /home/testuser/
/home/testuser/
├── moti01
├── moti02
├── moti03
├── ricecake01
│ ├── Moti01
│ ├── Moti02
│ └── Moti03
├── ricecake02
│ ├── Moti01
│ ├── Moti02
│ └── Moti03
└── ricecake03
├── Moti01
├── Moti02
└── Moti03
検証1
ではでは、chmodコマンドの実行結果を表示させます。
[root@localhost testuser]# chmod 777 -v moti01
'moti01' のモードを 0644 (rw-r--r--) から 0777 (rwxrwxrwx) へ変更しました
どういうわけか、パーミッションとオプションを逆に書いてもできました。
検証2
次にディレクトリ内のファイルについても全てパーミッションを変更してみます。
[root@localhost testuser]# ls -l /home/testuser/ricecake01/
合計 0
-rw-r--r--. 1 root root 0 9月 4 02:22 Moti01
-rw-r--r--. 1 root root 0 9月 4 02:22 Moti02
-rw-r--r--. 1 root root 0 9月 4 02:22 Moti03
[root@localhost testuser]# chmod -R 777 /home/testuser/ricecake01/
[root@localhost testuser]# ls -l /home/testuser/
合計 0
-rwxrwxrwx. 1 root root 0 9月 4 02:03 moti01
-rw-r--r--. 1 root root 0 9月 4 02:03 moti02
-rw-r--r--. 1 root root 0 9月 4 02:03 moti03
drwxrwxrwx. 2 root root 48 9月 4 02:22 ricecake01
drwxr-xr-x. 2 root root 48 9月 4 02:23 ricecake02
drwxr-xr-x. 2 root root 48 9月 4 02:23 ricecake03
[root@localhost testuser]# ls -l /home/testuser/ricecake01/
合計 0
-rwxrwxrwx. 1 root root 0 9月 4 02:22 Moti01
-rwxrwxrwx. 1 root root 0 9月 4 02:22 Moti02
-rwxrwxrwx. 1 root root 0 9月 4 02:22 Moti03
ディレクトリもその配下のファイルについても変更されています。
検証3(ディレクトリの権限による操作制限の検証)
以下のようにディレクトリ内にディレクトリ を作成しました。
[root@localhost testuser]# tree /home/testuser/
/home/testuser/
├── ricecake01
│ ├── Moti01
│ ├── Moti02
│ └── Moti03
├── ricecake02
│ ├── Moti01
│ ├── Moti02
│ └── Moti03
├── ricecake03
│ ├── Moti01
│ ├── Moti02
│ └── Moti03
├── ricecake04
│ ├── Moti01
│ ├── Moti02
│ └── Moti03
├── ricecake05
│ ├── Moti01
│ ├── Moti02
│ └── Moti03
├── ricecake06
│ ├── Moti01
│ ├── Moti02
│ └── Moti03
└── ricecake07
├── Moti01
├── Moti02
└── Moti03
7 directories, 21 files
[root@localhost testuser]# chmod 701 /home/testuser/ricecake01
[root@localhost testuser]# chmod 702 /home/testuser/ricecake02
[root@localhost testuser]# chmod 703 /home/testuser/ricecake03
[root@localhost testuser]# chmod 704 /home/testuser/ricecake04
[root@localhost testuser]# chmod 705 /home/testuser/ricecake05
[root@localhost testuser]# chmod 706 /home/testuser/ricecake06
[root@localhost testuser]# chmod 707 /home/testuser/ricecake07
[root@localhost testuser]# ls -l
合計 0
drwx-----x. 2 root root 48 9月 4 02:23 ricecake01
drwx----w-. 2 root root 48 9月 4 02:23 ricecake02
drwx----wx. 2 root root 48 9月 4 02:23 ricecake03
drwx---r--. 2 root root 48 9月 4 02:23 ricecake04
drwx---r-x. 2 root root 48 9月 4 02:23 ricecake05
drwx---rw-. 2 root root 48 9月 4 02:23 ricecake06
drwx---rwx. 2 root root 48 9月 4 02:23 ricecake07
[root@localhost testuser]# ls -l ricecake01/
合計 0
-rwxrwxrwx. 1 root root 0 9月 4 02:23 Moti01
-rwxrwxrwx. 1 root root 0 9月 4 02:23 Moti02
-rwxrwxrwx. 1 root root 0 9月 4 02:23 Moti03
※他のディレクトリも、ディレクトリ内のファイルは全てパーミッションを777にしています。
では、localhostでログインしてみます。
[localhost@localhost ~]$ cd /home/
[localhost@localhost home]$ ls
localhost testuser
[localhost@localhost home]$ cd testuser/
では、検証開始。
アクセス権:701
ユーザーにとってのディレクトリへのアクセス権「–x」での動作確認。
[localhost@localhost testuser]$ cd ricecake01
[localhost@localhost ricecake01]$ ls
ls: ディレクトリ '.' を開くことが出来ません: 許可がありません
[localhost@localhost ricecake01]$ find .
.
find: ‘.’: 許可がありません
[localhost@localhost testuser]$ touch ricecake01/Moti04
touch: 'ricecake01/Moti04' に touch できません: 許可がありません
ディレクトリで移動はできても、それ以上は何もできないですね。
アクセス権:702
ユーザーにとってのディレクトリへのアクセス権「-w-」での動作確認。
[localhost@localhost testuser]$ cd ricecake02
-bash: cd: ricecake02: 許可がありません
[localhost@localhost testuser]$ ls ricecake02
ls: ディレクトリ 'ricecake02' を開くことが出来ません: 許可がありません
[localhost@localhost testuser]$ vi /home/testuser/ricecake02/Moti01 //ファイルは開ません。
[localhost@localhost testuser]$ echo "Moti" >> /home/testuser/ricecake02/Moti01
-bash: /home/testuser/ricecake02/Moti01: 許可がありません
[localhost@localhost testuser]$ touch ricecake02/Moti04
touch: 'ricecake02/Moti04' に touch できません: 許可がありません
書き込み権限さえあれば内部のファイルへ書き込みができると思いましたが、どうやらそうでもないようです。
アクセス権:703
ユーザーにとってのディレクトリへのアクセス権「-wx」での動作確認。
[localhost@localhost testuser]$ cd ricecake03
[localhost@localhost ricecake03]$ ls
ls: ディレクトリ '.' を開くことが出来ません: 許可がありません
[localhost@localhost ricecake03]$ echo "Moti" >> /home/testuser/ricecake03/Moti01
[localhost@localhost ricecake03]$ cat /home/testuser/ricecake03/Moti01
Moti
[localhost@localhost testuser]$ touch ricecake03/Moti04
書き込みができました。ファイルを作成したのにlsで見れないのは残念。
アクセス権:704
ユーザーにとってのディレクトリへのアクセス権「r–」での動作確認。
[localhost@localhost testuser]$ cd ricecake04/
-bash: cd: ricecake04/: 許可がありません
[localhost@localhost testuser]$ ls ricecake04/
ls: 'ricecake04/Moti01' にアクセスできません: 許可がありません
ls: 'ricecake04/Moti02' にアクセスできません: 許可がありません
ls: 'ricecake04/Moti03' にアクセスできません: 許可がありません
Moti01 Moti02 Moti03
[localhost@localhost testuser]$ ls -l ricecake04
ls: 'ricecake04/Moti01' にアクセスできません: 許可がありません
ls: 'ricecake04/Moti02' にアクセスできません: 許可がありません
ls: 'ricecake04/Moti03' にアクセスできません: 許可がありません
合計 0
-????????? ? ? ? ? ? Moti01
-????????? ? ? ? ? ? Moti02
-????????? ? ? ? ? ? Moti03
[localhost@localhost testuser]$ echo "Moti" >> /home/testuser/ricecake04/Moti01
-bash: /home/testuser/ricecake04/Moti01: 許可がありません
[localhost@localhost testuser]$ cat ricecake04/Moti01
cat: ricecake04/Moti01: 許可がありません
かろうじてファイル名が分かる程度でした。
アクセス権:705
ユーザーにとってのディレクトリへのアクセス権「r-x」での動作確認。
[localhost@localhost testuser]$ cd ricecake05
[localhost@localhost ricecake05]$ ls -l
合計 0
-rwxrwxrwx. 1 root root 0 9月 4 02:23 Moti01
-rwxrwxrwx. 1 root root 0 9月 4 02:23 Moti02
-rwxrwxrwx. 1 root root 0 9月 4 02:23 Moti03
[localhost@localhost ricecake05]$ echo "Moti" >> /home/testuser/ricecake05/Moti01
[localhost@localhost ricecake05]$ touch Moti04
touch: 'Moti04' に touch できません: 許可がありません
想定通り、書き込みだけができないようです。
アクセス権:706
ユーザーにとってのディレクトリへのアクセス権「rw-」での動作確認。
[localhost@localhost testuser]$ cd ricecake06
-bash: cd: ricecake06: 許可がありません
[localhost@localhost testuser]$ ls -l ricecake06
ls: 'ricecake06/Moti01' にアクセスできません: 許可がありません
ls: 'ricecake06/Moti02' にアクセスできません: 許可がありません
ls: 'ricecake06/Moti03' にアクセスできません: 許可がありません
合計 0
-????????? ? ? ? ? ? Moti01
-????????? ? ? ? ? ? Moti02
-????????? ? ? ? ? ? Moti03
[localhost@localhost testuser]$ touch ricecake06/Moti04
touch: 'ricecake06/Moti04' に touch できません: 許可がありません
[localhost@localhost testuser]$ echo "Moti" >> /home/testuser/ricecake06/Moti01
-bash: /home/testuser/ricecake06/Moti01: 許可がありません
実行権がかなりの鍵を握っているみたいですね。かろうじてファイル名だけ分かりますが、それ以外は何もできないに等しいです。個人的には一番意外でした。
アクセス権:707
ユーザーにとってのディレクトリへのアクセス権「rwx」での動作確認。
[localhost@localhost testuser]$ cd ricecake07
[localhost@localhost ricecake07]$ ls
Moti01 Moti02 Moti03
[localhost@localhost ricecake07]$ ll
合計 0
-rwxrwxrwx. 1 root root 0 9月 4 02:23 Moti01
-rwxrwxrwx. 1 root root 0 9月 4 02:23 Moti02
-rwxrwxrwx. 1 root root 0 9月 4 02:23 Moti03
[localhost@localhost ricecake07]$ touch Moti04
[localhost@localhost ricecake07]$ ll
合計 0
-rwxrwxrwx. 1 root root 0 9月 4 02:23 Moti01
-rwxrwxrwx. 1 root root 0 9月 4 02:23 Moti02
-rwxrwxrwx. 1 root root 0 9月 4 02:23 Moti03
-rw-rw-r--. 1 localhost localhost 0 9月 4 03:05 Moti04
当然ですが、フルコントロールでした。
以上で検証終了です。時間はそこそこかかりましたが、結構楽しめましたね。ところどころ予想外の結果になってくれたので、やったかいがありました。
