Tetsuo Handa
from-****@I-lov*****
2008年 9月 12日 (金) 21:29:23 JST
熊猫です。 最近、 1777 のパーミッションを持っているはずの /tmp/ ディレクトリの パーミッションがいつの間にか 0755 になってしまっているという不思議な現象に 悩まされていました。今日、解決したわけですが、犯人は何と ccs-patch-\*.tar.gz でした。 ccs-patch-\*.tar.gz を作成するときには tar -zcf ccs-patch-\*.tar.gz --exclude .svn -- . のように指定しているわけですが、このようにするとカレントディレクトリである . が tar ball に含まれてしまいます。 tar -zvtf ccs-patch-\*.tar.gz を実行すると確認できるのですが、 . のパーミッションは 0755 です。 それを cd /tmp/ してから tar -zxf ccs-patch-\*.tar.gz で展開していたのですが、 tar コマンドが tar ball の中の . を展開後に chmod() を呼んでしまうため、 . (すなわち /tmp/ )のパーミッションが 0755 になってしまっていたのです。 というわけで、 ccs-patch-\*.tar.gz を展開する場合、 パーミッションが 0755 のディレクトリで展開するようにお願いします。 パーミッションつながりということで、今日発見した chmod コマンドの 予想外の仕様変更についても書いておきます。 chmod コマンドでパーミッションを指定する場合、 0755 のように数値で 指定する方法と、 u=rwx,go=rx のように文字列で指定する方法があります。 http://ja.wikipedia.org/wiki/Chmod しかし、以下のように操作すると、ディレクトリの suid/sgid がクリアされないという 不思議な現象に遭遇しました。 # cd / # mkdir dir # ls -ld dir/ drwxr-xr-x 2 root root 4096 2008-09-12 12:48 dir/ # chmod 7777 dir/ # ls -ld dir/ drwsrwsrwt 2 root root 4096 2008-09-12 12:48 dir/ # chmod 1777 dir/ # ls -ld dir/ drwsrwsrwt 2 root root 4096 2008-09-12 12:48 dir/ 期待したとおりの振る舞いをした場合、以下のように ディレクトリの suid/sgid ビットはクリアされるはずです。 # cd / # mkdir dir # ls -ld dir/ drwxr-xr-x 2 root root 4096 Sep 12 12:43 dir/ # chmod 7777 dir/ # ls -ld dir/ drwsrwsrwt 2 root root 4096 Sep 12 12:43 dir/ # chmod 1777 dir/ # ls -ld dir/ drwxrwxrwt 2 root root 4096 Sep 12 12:43 dir/ カーネルのバグかと思って慌ててしまいましたが、犯人は chmod コマンドでした。 coreutils-6.12.tar.gz の ChangeLog-2006 の中に、以下のような記述がありました。 > 2006-07-28 Paul Eggert <egger****@cs*****> > > * NEWS: chmod now preserves setuid and setgid bits on directories > if you use a numeric mode with them clear, e.g., "chmod 755 DIR". 「バグではなくて仕様です」ということですね。 明確にディレクトリのパーミッションを設定したい場合には、数値による指定ではなく 文字列による指定をしろということになったようです。 数値で指定することで予期せず suid/sgid ビットを失ってしまうというトラブルでも 続発したんでしょうかねぇ?でも、この仕様変更により、今度は数値で指定することで 予期せず suid/sgid ビットが残ってしまうというトラブルが続発しそうな気もします。 LPI 試験で出題されたらどっちの振る舞いで回答すればいいんでしょうね?(^x^;