【Linuxコマンド】chmodでアクセス権限(パーミッション)を変更

Linuxコマンド「chmod」でファイルやディレクトリのアクセス権限(パーミッション)を変更する方法についてオプションと例題付きでまとめました。

パーミッションの変更(chmodコマンド)

chmodコマンドは、ファイルやディレクトリのアクセス権限(パーミッション)を設定します。

chmod [オプション] [ファイル・ディレクトリ]
記号 意味
u 所有者の権限
g グループの権限
o その他のユーザーの権限
a すべての権限
+ 後に記述した権限を付加する
後に記述した権限を削除する
= 後に記述した権限にする
r 読み込み権限
w 書き込み権限
x 実行権限
s セットID
t スティッキ・ビット
-v コマンド実行結果を表示
-c 変更があった場合のみ、実行結果を表示
-R 再帰的に変更

実行例1

以下のコマンドを実行するとファイル「test.csv」のアクセス権限は以下のようになります。

chmod 755 test.csv
権限の区分 設定値 アクセス権限
所有者権限 7 「読込み」「書込み」「実行」すべて可。
グループ権限 5 「読込み」「実行」のみ可。
その他のユーザーの権限 5 「読込み」「実行」のみ可。

実行例2

# すべてのユーザーに実行権限を付与
chmod +x test.csv
# -rwxr-xr-x      test.csv

#グループに書き込み権限をその他のユーザーにはすべて禁止
chmod g+w,o= test.csv
# -rwxrwx---      test.csv

#ディレクトリとディレクトリ内のファイル全ての権限を(再帰的に)変更
chmod -R 766 test_dir

# 実行結果を表示させながら実行(vオプション)
chmod -vR 755 test_dir

# 結果が変わらない場合は実行結果の表示なし(cオプション)
chmod -cR 755 test_dir

SUID

SUID(Set User ID) が設定されているコマンドやプログラムが実行すると、実行したユーザーではなく「ファイルの所有者の権限」で実行されます。

chmod コマンドでファイルのパーミッションを変更する際、ファイル所有者のアクセス権を設定する引数に「s」もしくは「4000」を指定すると、そのファイルにSUIDが設定されます。

$ chmod u+s file1
$ ls -l
$-rwSr--r-- 1 root root 0 11月 5 02:14 file1

なお、上記のように実行権限がない(ファイル644 など)にSUIDを設定した場合、大文字のSが表示されます。
実行権限を持ったファイルの場合、以下のように小文字のsが表示されます。

$ chmod u+s file1
$ ls -l
drwsr-xr-x 2 root root 4096 11月 5 02:15 file1

アクセス権が 755 のファイルに「4000」を指定してSUIDを設定する場合は以下のコマンドになります。

$ chmod 4755 file1

なお、SUIDが設定されているコマンドは「passwd」「mount」「su」「crontab」など少数です。

SGID

SGID (Set Group ID)が設定されているコマンドやプログラムが実行されると、実行したユーザーやグループでなく、そのファイルの所有グループの権限で実行されます。
chmod コマンドでファイルのパーミッションを変更する際、ファイル所有者のアクセス権を設定する引数に「g」もしくは「2000」を指定すると、そのファイルにSGID が設定されます。

$ chmod g+s file1
$ ls -l
drwsr-sr-x 2 root root 4096 11月 5 12:34 file1
$ chmod 2755  file1
$ ls -l
drwxr-sr-x 2 root root 4096 11月 5 12:34  file1

スティッキービット(stickybit)

テッキービットが設定されているディレクトリは、書き込み許可権限のあるファイルであっても、他のユーザーが所有しているものは削除できなくなります。
また、スティッキービットが設定されているディレクトリ内に作成したファイルやディレクトリは、所有者以外はファイルやディレクトリの名前変更と削除ができなくなります。
「/tmp」ディレクトリなど、他のユーザーに誤って削除されたくない一時ファイルを保護する場合などに使用します。

chmod コマンドでファイルのパーミッションを変更する際、ファイル所有者のアクセス権を設定する引数に「t」もしくは「1000」を指定すると、そのファイルにスティッキービットが設定されます。

$ chmod +t file1
$ ls -l
drwsr-sr-t 2 root root 4096 11月 5 02:14 file1
$ chmod 1755 file1
$ ls -l
drwxr-xr-t 2 root root 4096 11月 5 02:14 file1

スティッキービットの設定を解除(Off)するコマンドは以下のとおりです。

$ chmod -t file1
$ ls -l
drwsr-sr-x 2 root root 4096 11月 5 02:14 file1

利用場面

Linuxでは通常「/tmp」ディレクトリにスティッキービットが設定されています。
「/tmp」ディレクトリは一時的なファイルを格納するディレクトリであり、全てのユーザーが書き込み権限を持つ必要があるためです。
ディレクトリに書き込み権限を設定すると、ディレクトリ内に新規ファイルを作成する権限だけでなく、ディレクトリ内のファイルを削除する権限も与えられます。
そのため「/tmp」ディレクトリのように、「全てのユーザーが新規ファイルを作成できる」かつ「他のユーザに自分のファイルを削除されたくない」という場合に、スティッキービットを設定します。

【使用例】スティッキービットを設定し、自分以外のユーザが所有するファイルを削除不可にする

パーミッション755の「dir」ディレクトリ内で、自分以外のユーザが所有するファイルを削除できないようにしたい場合、以下のコマンドでスティッキービットをディレクトリに設定します。

$ chmod 1755 dir

もしくは

$ chmod o+t dir

スティッキービットを設定するには、chmodコマンドで通常のパーミッションの値に1000を加えた値を設定するか、その他ユーザに「t」という権限を追加します(o+t)。

【使用例】SGIDを設定し、プログラムをどのユーザーが実行しても、プログラムを所有するグループの権限で実行させる

パーミッション755のプログラム「prog」をどのユーザが実行しても、プログラムを所有するグループの権限で実行させるには、以下のいずれかのコマンドでSGIDを設定します。

$ chmod 2755 prog

もしくは

$ chmod g+s prog

SGIDを設定するには、chmodコマンドで通常のパーミッションの値に2000を加えた値を設定するか、グループに「s」という権限を追加します(g+s)。

【使用例】SUIDを設定し、プログラムをどのユーザーが実行しても、プログラムを所有するユーザーの権限で実行させる

パーミッション755のプログラム「prog」をどのユーザーが実行しても、プログラムを所有するユーザーの権限で実行させるには、以下のいずれかのコマンドでSUIDを設定します。

$ chmod 4755 prog

もしくは

$ chmod u+s prog

SGIDを設定するには、chmodコマンドで通常のパーミッションの値に4000を加えた値を設定するか、グループに「u」という権限を追加します(u+s)。

【使用例】ディレクトリのパーミッションを700から500に変更

ディレクトリ「dir」のパーミッションを700から500に変更するには、以下のいずれかのコマンドを実行します。

$ chmod 500 dir

$ chmod u-w dir

$ chmod u=rx dir

700から500へ変更するというのは、所有ユーザーの実行権限が7から5に変わるということです。
つまり、所有ユーザー(u)から書き込み(w)を削除することになるため、「$ chmod u-w dir」や「$ chmod u=rx dir」でもパーミッションを700から500に変更することになります。

【使用例】ディレクトリとその配下にあるファイルのパーミッションを755に設定

ディレクトリ「dir」とその配下にあるファイルのパーミッションを755に設定するには、以下のいずれかのコマンドを実行します。

$ chmod -R u=rwx, go=rx dir

$ chmod -R a=rwx, go-w dir

$ chmod -R 755 dir

パーミッション755は、

所有ユーザ(u) → 読み取り権限(4)、書き込み権限(2)、実行権限(1)がある
所有グループ(g)とその他のユーザ(o) → 読み取り権限(4)と実行権限(1)がある

状態です。これを記号で表すと「u=rwx, go=rx」となるので、「$ chmod -R u=rwx, go=rx dir」でもパーミッションが755となります。
また、「$ chmod -R a=rwx, go-w dir」のように、全てのユーザ(a)に読み取り権限(4)、書き込み権限(2)、実行権限(1)を設定し、その後に所有グループ(g)とその他のユーザ(o)から書き込み権限(2)を削除(go-w)しても755となります。

単に「$ chmod -R 755 dir」としても問題ありません。
なお、「chmod 755 dir」や「chmod u=rwx,go=rx dir」だとディレクトリのみのパーミッション変更となります。

関連ページ

【Linux超入門】システムの基礎とよく使うコマンドなど徹底解説
Linuxシステムの基礎とよく使うコマンドなどについて入門者向けに解説します。

コメント