UNIX/コマンド/ファイル管理/chmod の変更点


TITLE:chmod - ファイルのアクセス権の変更
#navi(UNIX/コマンド)

chmod でファイルのアクセス権の変更ができます。
例えば、書き込み権限を自分だけが持つようにして他人がそのファイルを編集できないようにしたり、
逆に他人にも権限を与え共有してみたりする設定などができます。
ファイルのアクセス権限はファイル所有者か、スーパーユーザのみが変更できます。
とりあえずはパーミッション記号の読み方、シンボリックモードを読めば OK かと思われます。
しかし、絶対モードも使えるようになることをお薦めします。理解に手間がかかるかもしれませんが、そちらのほうがよく使われます。

#contentsx

*パーミッション記号の読み方 [#d08e4081]

パーミッション記号の読み方を説明します。現在のパーミッションは ls -l で確認できます。
 % ls -l
 drwxr-xr-x   3 s1080134 student       512 May 14 18:05 GNUstep/
[[ls]] のほうにも書きましたがここにも書いておきます。

左端の文字列 drwxr-xr-x が、ファイルのモード、すなわちファイルの型(type) d と
アクセス権限(permission) rwxr-xr-x を表しています。

ファイルの型には以下のような種類があります。
|-  |通常のファイル|
|d |ディレクトリ|
|l |シンボリックリンク|
|s |ソケット|
|b |ブロックデバイス|
|c |キャラクタデバイス|
|P |名前つきパイプ|
実際よく見るのは - 、d とせいぜい l ぐらいだと思います。

アクセスパーミッションは
 rwx|r-x|r-x
のように3つに区切って読みます。
 ファイルオーナー(s108134)|グループ(student)|その他
のような分け方になります。そして、r,w,x はそれぞれ
|r|読み取り許可。ディレクトリの場合、ディレクトリ内ファイル一覧許可。|
|w|書き込み許可。ディレクトリの場合、ディレクトリ内ファイル作成許可。|
|x|実行許可。ディレクトリの場合、侵入許可|
を意味します。よって先の例
 rwxr-xr-x
では、ファイルオーナーに、読み取り、書き込み、ディレクトリ進入許可すべてがあり、
同じグループの人、その他の人は、読み取り、ディレクトリ進入許可はあるが、書き込み許可がないという意味になります。

*シンボリックモード [#hd7ff386]


パーミッションの指定方法には、絶対モードとシンボリックモードがあります。
シンボリックモードには [who]、[operator]、[permissions] の3つの要素があります。
 % chmod [who][operator][permissions] [filename]
のように指定します。

[who]
|u|所有者|
|g|グループに属するユーザ|
|o|その他のユーザ|
|a|全員(ugo)|
[operator]
|+|アクセス権を付加|
|-|アクセス権を除去|
|=|指定されたアクセス権をそのまま割り当てる|
[permissions]
|r|読み取り許可|
|w|書き込み許可|
|x|実行許可。ディレクトリの場合、侵入許可|
例えば
 % chmod u+x [filename]
のようにして実行します。, (カンマ) で区切って
 % chmod u+x,g-wx,o-rwx [filename]
のように一度に実行することも可能です。
 % chmod +x [filename]
のように [who] を省略すると a+x という意味になります。
 % chmod = [filename]
とすれば a= という意味になり、許可の部分が無指定の = なので、すべての許可が消えることになります。

*絶対モード [#t2302e78]

パーミッションの指定方法には、絶対モードとシンボリックモードがあります。
絶対モードでは 8 進数で指定します。
r = 4, w = 2, x = 1 として論理和を取ります。
例えば
 rwx|r-x|---
は
 4+2+1|4+1|0
となり、
 750
のようになります((論理和は本当は + ではなく bit 演算子の or なのですが、そこまでの説明は省きます。今回の chmod の場合はどちらも同じ結果になるので足し算と考えてもらっても構わないでしょう))。
 % chmod 0750 [filename]
のように指定します。最初の 0 は省略して 750 と指定することも可能です。
この 0 の部分については次で説明します。
*特殊アクセス権 [#rd9ec12e]

先に紹介した以外にも特殊なアクセス権が存在します。
|u+s|4000|user s-bit (setuid)|
|g+s|2000|group s-bit (setgid)|
|o+t|1000|sticky bit|

**user s-bit (setuid) [#x96dd27b]

user s-bit が立っているコマンドはそのファイル所有者の権限で実行 (setuid) 
されます。
例えば passwd コマンドは
 % ls -l `which passwd`
 ---s--x--x    1 root     other        7161 2001-02-09 09:54 /bin/passwd*
のように user の実行許可の場所に s と表示されており、
user s-bit が立っているのがわかります。
passwd コマンドは /etc/passwd という root のみが編集できるファイルを
編集する必要があるため、一般ユーザでもこのコマンドで可能なことの範囲内で、
root 権限を取得して編集できるという仕組みになっています。

**group s-bit (setgid) [#pa4bd2ea]

group s-bit はそれの group 版です。
実行するときはそのファイルのグループ権限で実行 (setgid) されます。

**sticky bit [#wc39c9ac]

sticky bit により、どのユーザでも読み書きできるが、ファイルの削除は作成したユーザのみが可能、という特殊なディレクトリを作ることができるようになります。
例えば /tmp ディレクトリは
 % ls -d /tmp
 drwxrwxrwt   10 root     sys          4259 2003-10-16 16:15 /tmp/
のように最後に t と表示されており、sticky bit が立っているのがわかります。
*おまけ [#m36ddf8d]
上位ディレクトリの侵入パーミッション (x) さえ切ってしまえば、
下位のディレクトリ、ファイルへアクセスも不可能になります。
読み取り許可 (r) はなく、侵入許可 (x) はある場合、
ls などでディレクトリ内を参照することはできませんが、
ディレクトリ内のファイルを直接指定してファイルを参照することはできます。

ディレクトリに含まれるすべてのファイル、サブディレクトリ
のパーミッションをすべて変更したい場合は、-R オプションを使用します。
 % chmod 705 -R [dir]
しかしこれでは、ファイルすべてに実行許可がついてしまったりなど、
あまりありがたくない場合が多いです。
そこで、ファイルのみ、ディレクトリのみと指定したい場合は
find コマンドとの合わせ技を使用します。
 % find . -type f -exec chmod 604 \{\} \;
ファイルのみ。
 % find . -type d -exec chmod 705 \{\} \;
ディレクトリのみ。

さらにおまけですが、-exec を使用するよりも
 % find . -type f -print | xargs chmod 604
のようにしたほうがきっと動作は軽いです。これは find のコツですね。
ただし、ファイル名に空白が含まれている場合はxargsは使えません。

#navi(UNIX/コマンド,,footer)
xrea