sticky bit をディレクトリに設定すると、ファイルの所有者、ディレクトリの所有者、またはスーパーユーザーである場合にのみ、削除または名前変更ができるという仕様があり、/tmp は 1777 を付けて、すべてのユーザが、自身が owner のファイルを作成、削除して利用できるようになっている。
ここまではよいのだが、Ubuntu だと少し特殊な挙動が加わる。
sticky bit が付いている /tmp に、test01 ユーザが abc.txt を作成した後、root ユーザが、そこに >> で追記しようとすると、パーミッションエラーで書き込めないのだ。
test01@ubuntu-pc:~$ cd /tmp
test01@ubuntu-pc:/tmp$ touch abc.txt
test01@ubuntu-pc:/tmp$ sudo -s -H
root@ubuntu-pc:/tmp# echo "test" >> abc.txt
bash: abc.txt: Permission denied
これが、通常の sticky bit のないディレクトリなら問題なく書き込める。
そして、この挙動、sticky bit が付いているディレクトリの owner が test01 だった場合は、なぜか起きない。
root@ubuntu-pc:/# mkdir /test-dir
root@ubuntu-pc:/# touch /test-dir/abc.txt
root@ubuntu-pc:/# chown -R test01:test01 /test-dir
root@ubuntu-pc:/# chmod 1777 /test-dir
root@ubuntu-pc:/# echo "test" >> /test-dir/abc.txt # これは OK
root@ubuntu-pc:/# chown -R root:root /test-dir
root@ubuntu-pc:/# echo "test" >> /test-dir/abc.txt # これは /tmp と同じで NG
bash: /test-dir/abc.txt: Permission denied
レアケースかもしれないが、Ubuntu で /tmp 直下にある(1段 sticky bit ではないディレクトリ挟めば起きない)ユーザのファイルに、root で書き込めることを期待すると、この問題を踏むことになる。
ログファイルをユーザと root で交互に append するような、スクリプトを書く場合は、気をつけたい。
ユーザが先にファイルを作成しても、root は書き込めない。
2025/1/18 追記
ファイルに Permission denied で書き込めないのは、
-
>>
を使った書き込みで、O_CREAT が付いていること、 -
/proc/sys/fs/protected_regular
に2
が入っていること
が関係しているとコメントいただきました。
O_CREAT を外すか、
echo 0 > /proc/sys/fs/protected_regular
とすることで、書き込めることを確認しました。
詳しくは、コメントをご参照ください。