はじめに
Linux や Unix を普通に使っている人は、ファイルのパーミッションについて十分知っているかと思います。しかし勘違いしていそうな点が一つあります。それは root ユーザーにとっては、ファイルに読み書き権限がなかったとしても、普通に読み書きできてしまうということです。
「root ユーザーはなんでもできる」という前提で考えれば当たり前じゃないかという話ですが、ファイルのパーミッションだけを知っている人は、おそらく勘違いしてしまうでしょう。
動作確認
一般ユーザーの場合
まず念のために root ユーザー以外の場合の再確認です。読み書き権限がないので当然の結果と言えるでしょう。
$ ls -al
total 8
drwxrwxr-x 3 koichi wheel 96 9 7 17:58 .
drwxrwxrwt 16 root wheel 512 9 7 17:58 ..
---------- 1 koichi wheel 5 9 7 17:58 file.txt
【読み込めない】
$ cat file.txt
cat: file.txt: Permission denied
【書き込めない】
$ echo test > file.txt
bash: file.txt: Permission denied
【ファイル属性のテストでも権限がないことがわかる】
$ [ -r file.txt ] || echo no
no
$ [ -w file.txt ] || echo no
no
$ [ -x file.txt ] || echo no
no
補足ですが、ファイルを削除する場合にファイルの書き込み権限は不要であることに注意してください。ファイルを削除するときに必要な権限は、削除するファイルそのものではなく親ディレクトリへの書き込み権限です。これは「ファイルはディレクトリという名の管理簿に記録されている」と考えれば理解しやすいと思います。
rootユーザーの場合
では次に root ユーザーの場合です。ファイルの所有者も root であることに注意してください。別ユーザーが所有しているファイルの読み書きの話ではありません。もちろん root ユーザーは別ユーザーのファイルも読み書きできます。
# ls -al
total 8
drwxrwxr-x 3 koichi wheel 96 9 7 18:09 .
drwxrwxrwt 16 root wheel 512 9 7 17:58 ..
---------- 1 root wheel 5 9 7 18:09 file.txt
【読み込める】
# cat file.txt
test
【書き込める】
# echo new > file.txt
【読み書き権限があることになっている(実行権限のみ無い)】
# [ -r file.txt ] && echo yes
yes
# [ -w file.txt ] && echo yes
yes
# [ -x file.txt ] || echo no
no
ls
コマンドの結果は file.txt
にパーミッションがありません。しかしファイルは読み込めますし書き込むことができます。test
コマンド([ ... ]
)の結果でも(ls
の出力では権限がないのに)読み書き権限があることになっています。
ただし実行権限のみ無いことになっていることに注意してください。もちろん実行することはできません。これは厳密に「実行」のみができないという意味で、ディレクトリの実行権権限(正確には検索許可)は別です。
# ls -al
total 8
drwxrwxr-x 4 koichi wheel 128 9 7 18:17 .
drwxrwxrwt 16 root wheel 512 9 7 17:58 ..
d--------- 2 root wheel 64 9 7 18:17 dir
---------- 1 root wheel 4 9 7 18:11 file.txt
【ファイルの実行権限はない】
# [ -x file ] || echo no
no
【ディレクトリの実行権限はあることになっている】
# [ -x dir ] && echo ok
ok
これらの実験からわかることは、ls
コマンドの結果のパーミッション出力と実際の権限は必ずしもイコールではないということです。実際パーミッション以外のアクセス制御の仕組み(ACLなど)があるため、パーミッション情報だけですべてが決まるわけではありません。
rootユーザーに読み書き権限が要らない理由
管理者だから・・・というのはその通りですが、具体的な例で言えば管理者はシステムを管理するためにファイルのバックアップとリストアを行います。そのときに読み取り権限がないファイルを読み取りできなければバックアップできませんし、書き込み権限がないファイルを書き込めなければリストアができません。同じ理由で別ユーザーのファイルも読み書きすることができます。現実的な話として root ユーザーだけは読み書き権限がなくても読み書きできなければ困るわけです。その一方で実行権限に関しては実行不可能なファイルを実行できても困るだけなので実行権限の設定にそのまま従っています。
さいごに
ls
コマンドのパーミッション情報はあくまでファイルが持っている属性情報にすぎません。おおむねその属性情報に従った挙動をしますが、厳密に言えば実際にファイルを読み書きするまで、読み書きできるかどうかはわかりません。
そもそもファイルシステムの情報は、調べたその直後にバックグラウンドプロセスによって書き換えられる可能性があります。例えば「ファイルが存在すれば削除する」([ -f file.txt ] && rm file.txt
) なんてコードを書いたとしてもそれが正しく動くとは限りません。つまりファイルが存在したことを確認した後でバックグラウンドプロセスがファイルを削除して、存在しないファイルを削除しようとしてしまう可能性があるということです。事前チェックは完璧な方法ではなく、実行するまで結果がどうなるかわからないことに注意が必要です。