chflags

Unixには、chmodでファイルにアクセス権を設定しアクセス制御を行う機能がありますが、BSD系のOSには"ファイルフラグ"というものを設定して更に細かくアクセス制御を行う機能があります。ファイルフラグは4.4 BSDに実装され、それ以降のBSD系OSに入っています。ですから、当然、Mac OS Xにも入っている訳ですね。
 そのファイルフラグを設定するためのコマンドが、このページで紹介するchflagsです。使い方は、「chflags フラグ ファイル名」です。chflagsのmanページによると、下記のフラグの設定および解除が可能だそうです。

フラグの設定 フラグの解除 フラグの内容 必要な権限
arch noarch archived root
opaque noopaque opaque 所有者またはroot
nodump nonodump nodump 所有者またはroot
sappnd nosappnd system append-only root
schg noschg system immutable root
sunlnk nosunlnk system undeletable root
uappnd nouappnd user append-only 所有者またはroot
uchg nouchg user immutable 所有者またはroot
uunlnk nouunlnk user undeletable 所有者またはroot

immutable(変更不可)、immutable(削除不可)は何を意味しているのか分かりますし、nodumpはおそらくバックアップのためのdumpを不可、ということなんだろうと想像はできますが、archived、opaque、append-onlyが果たして何のためにあるフラグなのか、私には分かりません。。。

 とりあえず、uchgを実際に使って、ファイルを変更不可にしてみましょう。~/terminaltestにあるoutput.txtというファイルを実験に使います。

bash(Mac OS X 10.3のデフォルトシェル)
PowerBookG4:~ hiro$ cd terminaltest
PowerBookG4:~/terminaltest hiro$ ls -l
total 8
-rw-r--r--  1 hiro  hiro  992 20 Dec 17:24 output.txt
PowerBookG4:~/terminaltest hiro$ chflags uchg output.txt
tcsh(Mac OS X 10.2.xまでのデフォルトシェル)
[PowerBookG4:~] hiro% cd terminaltest
[PowerBookG4:~/terminaltest] hiro% ls -l
total 8
-rw-r--r--  1 hiro  hiro  992 20 Dec 17:24 output.txt
[PowerBookG4:~/terminaltest] hiro% chflags uchg output.txt

 結果の確認には、lsを使います。ls -loとすることで、ファイル一覧中に設定されているフラグを表示させることができます。

bash(Mac OS X 10.3のデフォルトシェル)
PowerBookG4:~/terminaltest hiro$ ls -lo
total 8
-rw-r--r--  1 hiro  hiro  uchg 992 20 Dec 17:24 output.txt
tcsh(Mac OS X 10.2.xまでのデフォルトシェル)
[PowerBookG4:~/terminaltest] hiro% ls -lo
total 8
-rw-r--r--  1 hiro  hiro  uchg 992 20 Dec 17:24 output.txt

 所有者とグループ名の後に、uchgと表示されていますね。ちなみに、ファイルフラグを複数設定している場合は、ここにカンマで区切られて表示されます。

 では、この状態がFinder上ではどうなっているかと言うと、、、
アイコンに鍵マークがついています
このように、ファイルがロックされた状態になります。Finder上で普通にロックをかけたのと全く同じ状態です。

 解除は、uchgにnoをつけたnouchgです。早速やってみましょう。

bash(Mac OS X 10.3のデフォルトシェル)
PowerBookG4:~/terminaltest hiro$ chflags nouchg output.txt 
PowerBookG4:~/terminaltest hiro$ ls -lo
total 8
-rw-r--r--  1 hiro  hiro  - 992 20 Dec 17:24 output.txt
tcsh(Mac OS X 10.2.xまでのデフォルトシェル)
[PowerBookG4:~/terminaltest] hiro% chflags nouchg output.txt 
[PowerBookG4:~/terminaltest] hiro% ls -lo
total 8
-rw-r--r--  1 hiro  hiro  - 992 20 Dec 17:24 output.txt

 先ほど設定したuchgが消えていますね。


[注]
 schgは安易に設定しない方が良いです。カーネルのセキュリティレベルが1以上で動作している場合(普通にMac OS Xを起動した場合は1です)、schgフラグを消去することは、rootユーザーでもできません。シングルユーザーモードで起動するか、Mac OS 9で起動しないと、どうしようもありません。
 chflagsのmanページにはuunlnkの記載があるのですが、実際に使ってみると、「chflags: invalid flag: uunlnk」と言われてしまい、使用できませんでした。