UNIX/Linux及びシェルにおいてディレクトリやファイル(UNIX/Linuxでは何れもファイルタイプの1つ)のパーミッションモードを設定するコマンドにはumaskとchmodがあり、ディレクトリやファイルの所有権を変更するコマンドとしてユーザー変更にはchown、グループ変更にはchgrpがあります。
umaskはディレクトリやファイルを新規作成する際のデフォルト(既定)の許可モードの設定をする為のコマンドです。
chmod(change modeの略)はモードを変更するという意味合いで既存のディレクトリやファイルの許可モードの設定をする為のコマンドです。
umask値は、8進数3ケタで[r,w,x,-]を設定しますが、その設定値は、パーミッションビットとその増減値において(umask値7の時のファイルを除き)相対的な関係にあります。
また、同じumask値でもディレクトリとファイルではその意味が異なります。
umask | ディレクトリ | ファイル |
---|---|---|
0 | 7 | 6 |
1 | 6 | |
2 | 5 | 4 |
3 | 4 | |
4 | 3 | 2 |
5 | 2 | |
6 | 1 | 0 |
7 | 0 | 0 |
umask値は、新規作成時の既定のパーミッションモードを設定しますが、ファイルの場合、umaskで実行権限を付与することができないことになっているのでファイルについては7がなくディレクトリとファイルの値はちょうど一段ずれた位置と一致し(umask値6と7ではファイルパーミッションモードは0になり)ます[ 2014/01/18 訂正: ]実行パーミッションにあたる1は、あり得ないことからumask値1,3,5,7の時のファイルビットは便宜的にディレクトリのビットと同じとなるようになっています。
例えば umask 022とあれば、umaskを縦方向に0,2,2と見た時それぞれ横方向のビットを見ていくとパーミッションモードはディレクトリが755、ファイルが644、これらの設定状態の意味するところや8進数モードとシンボリックモードの関係についてはファイルパーミッションビットに記述の通りです。
bashの場合、umask値は、一般にbashの各種設定ファイルの内、[/etc/profile]や[/etc/bashrc]に全ユーザー共通のumask値が設定されていると思います。
もちろんホームディレクトリ内で一貫して変更したい場合には[~/.profile]やサブシェルで必ず読み込まれる(事を利用してログイン時に一度だけ読み込まれる[~/.bash_profile]で読み込んでおけばbash起動時に必ず読み込まれることになるので存在すれば読み込むと設定されていることが一般的な)[~/.bashrc]に記述することもできますし、必要があればそのスコープ内で完結するスクリプトなどの中で一時的に設定をすることもできます。
一方、ディレクトリと異なりファイル作成時には実行ビットをセットできないのでシェルスクリプトなど実行権限が必要なファイルを作成した場合には実行前に実行権限を許可しなければなりません。
そんな時に利用されるコマンドがchmodです。
chmodによるモード変更方法には、シンボリックモードと8進数モードがあります。
シンボリックモードでは、下記の組み合わせによりパーミッションモードの設定をします。
userは[u]、groupは[g]、otherは[o]、allは[a]または[ugo]か[省略]
許可は[+]、許可取り消しは[-]、設定は[=]
それぞれの権限はシンボリック値 [r]、[w]、[x]
例えばファイル所有者[u]に実行権限を許可[+]するには
$ chmod u+x hoge
とするのも1つの方法で環境変数PATHにコマンドパスが適切にセットされていれば、shやbashなどシェル含む、awk、sed、perl、python、rubyなどのインタプリタ言語のスクリプトやC言語やJavaなどのコンパイル言語の実行ファイル(ls -Fによる一覧でファイル名末尾に*がついたファイル)に至るまで
$ hoge
または、カレントディレクトリを表す[ ./ ](ドット・スラッシュ)を付加して
$ ./hoge
とすれば実行できます。
groupに読み取り権限を許可[+]するには、
$ chmod g+r foo
全てから書き込み権限の許可を取り消す[-]には
$ chmod ugo-w bar
$ chmod a-w bar
としますが、ちなみに
$ chmod -w bar
とすると全てではなくuserのみ適用されます。
8進数モードでは、
user / group / other の順にそれぞれ0~7の値
で
$ chmod 700 foo.sh
のように設定します。
ファイル所有権の変更には、所有ユーザーと所有グループの変更を行うchown(change own)コマンドと所有グループの変更を行うchgrp(change group)コマンドがあります。
$ chown [option] foo_user file_name
$ chgrp [option] bar_group file_name