chownでsticky bitが壊れる

実際にやってしまった痛い失敗です。

root権限で以下のような処理を実行するツールを書き捨てでつくって実行しました。

#!/bin/sh
chown -R ${NEW_USER}:${NEW_GROUP} ${TARGET_DIR}/*

もし、変数が空だったらどうなるでしょうか。

そう、以下のようなコマンド実行になってしまいます。

chown -R : /*

ユーザもグループも指定されていないので、オーナーが変更されることはありませんがls -lcでctimeを確認するとファイルは更新されてしまっています。

通常のファイルには特に悪影響がなくてすみますが、sticky bitの立っている以下のようなファイルはsticky bitがoffにされてしまい、動作に大きな影響を与えてしまいます。

[webmaster@localhost work]$ ls -l /bin/ | grep rws
-rwsr-xr-x  1 root root  87016 May  4  2007 mount
-rwsr-xr-x  1 root root  33272 May  3  2007 ping
-rwsr-xr-x  1 root root  30924 May  3  2007 ping6
-rwsr-xr-x  1 root root  61168 May  5  2007 su
-rwsr-xr-x  1 root root  23844 Nov 23  2006 traceroute
-rwsr-xr-x  1 root root  12300 May  3  2007 traceroute6
-rwsr-xr-x  1 root root  53612 May  4  2007 umount
[webmaster@localhost work]$

具体的には、root権限を持たずにpingを打っても「権限がないので実行できない」と言われるようになったり、suを許容している場合だとsuコマンドを実行してもrootユーザ以外は正しいパスワードを入れてもPAM認証で蹴られたりといった事が起きます。

root権限での作業は、どんなに急ぎの用件であっても「十分すぎるくらいの準備と最新の注意が必要」ということを改めて教訓として胸に刻みました。

#追記:コマンド書き間違えていたので直しました。