Infra Engineer

パーミッションの変更~chmodコマンド~
2022.07.26
Lv1

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

本記事の対象者

LPIC level1習得を目指す初学者の方
コマンドの基本的な用途について、要点を絞って解説します。


今回の内容

今回は、chmodコマンドについて解説します。
パーミッションを変更するコマンドです。
なお、「パーミッションとは何か」ということがまず知りたい方はこちらの記事を参照してください。

・chmodコマンド
・まとめ
・確認問題

chmodコマンド

chmodコマンドは、ファイルパーミッションを変更するコマンドです。

chmod
意味 指定のファイルやディレクトリのパーミッションを変更する。
書式 chmod [オプション] [パーミッション指定] [ファイル or ディレクトリ名]

chmodコマンドの主なオプションと、パーミッション指定のコマンドは以下です。
※「対象」、「操作」、「許可の種別」が何かについては後述します。

オプション 説明
-R 指定したディレクトリ以下にある全ファイルのパーミッションを変更する。
対象 説明
u 所有者
g 所有グループ
o その他ユーザー
a すべてのユーザー
操作 説明
+ パーミッションを追加する
パーミッションを削除する
= パーミッションを指定する
許可の種別 説明
r 読み取り許可
w 書き込み許可
x 実行許可
s SUIDもしくはSGID
t スティッキービット
※SUID、SGID、スティッキービットについてはこちらの記事をご覧ください。

 

[パーミッション指定]の部分は、以下のふたつの指定方法があります。

①記号指定

[対象] [操作] [許可種別]

例) その他のユーザーに書き込み権限を追加する指定

[対象] = o
[操作] = +
[許可種別] = w
[パーミッション指定] = o+w

②数値指定

[変更後のパーミッション数値]

例) 「rwxr-xr–」に変更する。

[パーミッション指定] = 754

 

例①)
「example.sh」の所有者に実行権限を付与。
[root@localhost example]# ls -l
-rw-r--r--. 1 root root 0 6月 18 18:04 example.sh
[root@localhost example]# chmod u+x example.sh
[root@localhost example]# ls -l
-rwxr--r--. 1 root root 0 6月 18 18:04 example.sh

初め「example.sh」のパーミッションは「rw-r–r–」であり、ファイルの所有者に実行権限は与えられていません。
chmodで「u+x」と指定することで、「所有者(u)」に「実行権限(x)」を付与(+)します。
「example.sh」のパーミッションが「rwxr–r–」に変更されていることが確認できます。

 

例②)
「example.sh」の所有ユーザーから書き込み権限を削除。
[root@localhost example]# ls -l
-rwxr--r--. 1 root root  0  6月 18 18:04 example.sh
[root@localhost example]# chmod u-w example.sh
[root@localhost example]# ls -l
-r-xr--r--. 1 root root  0  6月 18 18:04 example.sh

権限の削除も可能です。
chmodで「u-x」と指定することで「所有者(u)」から「書き込み権限(w)」を削除(-)します。
「example.sh」のパーミッションが「r-xr–r–」に変更されていることが確認できます。

 

例③)
「example.sh」にすべてのユーザーからの書き込み権限を付与。
[root@localhost example]# ls -l
-r-xr--r--. 1 root root  0  6月 18 18:04 example.sh
[root@localhost example]# chmod a+w example.sh
[root@localhost example]# ls -l
-rwxrw-rw-. 1 root root  0  6月 18 18:04 example.sh

「すべてのユーザー(a)」に「書き込み権限(w)」を付与(+)してみます。
「所有者」「所有グループ」「その他ユーザー」すべてに対して付与されます。

 

例④)
「example.sh」のパーミッションを「rw-r–r–」に変更。(記号表記)
[root@localhost example]# ls -l
-rwxrw-rw-. 1 root root 0 6月 18 18:04 example.sh
[root@localhost example]# ls -l
-rwxrw-rw-. 1 root root 0 6月 18 18:04 example.sh
[root@localhost example]# chmod u=rw-,g=r--,o=r-- example.sh
[root@localhost example]# ls -l
-rw-r--r--. 1 root root  0  6月 18 18:04 example.sh

「=」を用いると、対象へのパーミッションを直接指定することが出来ます。
また、「,」で区切ることで複数の対象への指定も可能です。

 

例⑤)
「example.sh」のパーミッションを「rw-r–r–」に変更。(数値表記)
[root@localhost example]# ls -l
-rwxrw-rw-. 1 root root 0 6月 18 18:04 example.sh
[root@localhost example]# chmod 644 example.sh
[root@localhost example]# ls -l
-rw-r--r--. 1 root root  0  6月 18 18:04 example.sh

例④と同じことを数値表記でしています。
「rw-r–r–」を数値で表すと「644」です。chmodでこの数値を指定することでパーミッションを変更できます。
記号表記よりも短く指定できていることが分かります。
複数のクラスや複数の権限を操作する場合は数値指定の方が記号指定よりもはやいです。

※パーミッションの数値表記についてはこちらの記事参照

 

例⑥)
「example.sh」にSUID、SGID、スティッキービットを設定。(記号表記)
[root@localhost example]# ls -l
-rwxr-xr-x. 1 root root  0  6月 18 18:04 example.sh
[root@localhost example]# chmod u+s example.sh
[root@localhost example]# ls -l
-rwsr-xr-x. 1 root root  0  6月 18 18:04 example.sh
[root@localhost example]# chmod g+s example.sh
[root@localhost example]# ls -l
-rwsr-sr-x. 1 root root  0  6月 18 18:04 example.sh
[root@localhost example]# chmod o+t example.sh
-rwsr-sr-t. 1 root root  0  6月 18 18:04 example.sh

許可の種別に「s」を指定することでSUIDやSGIDを設定できます。
所有ユーザを対象にすればSUID、所有グループを対象にすればSGIDとなります。
スティッキービットは「t」を指定することで付与できます。

 

例⑦)
「example.sh」にSUID、SGID、スティッキービットを設定。(数値表記)
[root@localhost example]# ls -l
-rwxr-xr-x. 1 root root  0  6月 18 18:04 example.sh
[root@localhost example]# chmod 6755 example.sh  #SUIDとSGID
[root@localhost example]# ls -l
-rwsr-sr-x. 1 root root  0  6月 18 18:04 example.sh
[root@localhost example]# chmod 7755 example.sh  #SUIDとSGIDとスティッキービット
[root@localhost example]# ls -l
-rwsr-sr-t. 1 root root  0  6月 18 18:04 example.sh

例⑥と同じことを数値表記でしています。
SUIDは「4000」、SGIDは「2000」、スティッキービットは「1000」で付与できます。


まとめ

今回は、パーミッションを変更するコマンドについて解説しました。

記号で指定する方法は、現在のパーミッションからの足し引きで設定することができます。
一方で数値で指定する方法は、現在のパーミッションに関わらず、最終の形を指定します。

LPICの試験においては、数値でパーミッションを指定する方法が多く問われます。
数値でのパーミッション表記に慣れておく必要があるでしょう。

また、chmodでパーミッションを変更できるのは、rootかそのファイルディレクトリの所有者のみですので注意しましょう。

最後に確認問題で今回の記事の知識を是非復習してください。


確認問題

問題①

「ls -l」の標準出力が以下である時、「example.sh」のパーミッションを「r-xr-xr–」に変更するコマンドはどれか。(2つ選択)
-rw-r–r–. 1 sak sak 0 6月 21 16:44 example.sh

A) chmod 5,g=r-x,o=r-x example.sh
B) chmod a+x,u-w,o-x example.sh
C) chmod 554 example.sh
D) chmod u+x,g+w example.sh
E) chmod 754,u-w,o-w example.sh

解答
答え:B、C

A) ⇒ 数値表記と記号表記は併用できません。
B) ⇒ 正解です。一度全ユーザーに実行権限を付与し、そこから所有者の書き込み権限、その他ユーザの実行権限を削除しています。
C) ⇒ 正解です。「r-xr-xr–」は数値表記だと「554」です。
D) ⇒ 「rwxr-xr–」になるため不正解です。
E) ⇒ 数値表記と記号表記は併用できません。

問題②

次のコマンドのうち、/foo/example.shにSUIDを設定しているのはどれか。

A) chmod 4755 /foo/example.sh
B) chmod 1755 /foo/example.sh
C) chmod u-s /foo/example.sh
D) chmod 755+s /foo/example.sh
E) chmod 2755 /foo/example.sh

解答
答え:A

A) ⇒ 正解です。SUIDの数値表記は「4000」です。
B) ⇒ スティッキービットの表記です。
C) ⇒ SUIDを削除してしまっています。
D) ⇒ 数値表記と記号表記は併用できません。
E) ⇒ SGIDの表記です。