リモートでシャットダウン

帰省などと相まって2週間ぶりの出勤です。今回から新しいタスクが始まりました。
「引っ越しとか停電でサーバー(400台ぐらい)シャットダウンするとき、
 一台一台手動でやるとタルいから自動化できない?」
 
とりあえず方針としてはtelnetなりrloginなりで入ってシャットダウンだけしてログアウト。これを400回ぐらい繰り返すスクリプト書けばいいのかなと。
 
でもセキュリティ面で
 ログイン
 ↓
 $su -
 ↓
 $shutdown -h now
 ↓
 ログアウト
っていう順番は駄目。つまりroot権限を取らずにshutdownを実行しろということです。
 
 そんなこんなでガリガリ調べていると、shutdownっていうユーザーが見つかりました。/etc/passwdを参照して、どんなもんかと調べると、ホームディレクトリが/sbin ログインシェルが/sbin/shutdown という不気味な設定。つまりログインと同時にshutdownが走るわけです。
「おーこれでいいじゃん楽勝☆」と思いログインしてみると
「shutdownはroot以外使えないんじゃこのヴォケ!」なる旨のメッセージが。
そこで、じゃあ試しにルート権限くれてやるよとばかりにshutdownユーザーのUIDをゼロに(良い子はまねしちゃダメ)してみると今度は
「shutdownはオプションをちゃんと指定してね♪」と言われてしまいました。
 
つまりこのshutdownユーザーはログイン時バカ正直に
 $shutdown
をオプションなし実行しているわけです。
 この仕様でこのユーザー、何の意味があるのか不明です。(どうせ通ってもUIDゼロじゃ危なくて使えないんだけど)
 
で、仕方がないので路線変更。
 Linuxにはsudoなるroot権限の一部を一般ユーザーに許可できる機能が付いているのでこれを利用することに。
こいつは/etc/sudoerって設定ファイルを編集することで使うんですけど、なんか制限付きで直接編集はできません。ゆえに編集するときには
 $visudo
ってコマンドを叩きます。(結局viライクなエディタが出てくるが、どうも保存前に文法チェックをしてくれている模様)
まあなんにしても、こいつでお目当てのユーザーにshutdownを許可してやればいいわけです。許可したら次は、そいつのログインシェルをbashにして、.bashrcを編集。
いきなり
$/sbin/sudo /sbin/shutdown -h now
を実行し、exitで抜けるように記述します。
 
で、試してみたら見事成功。ログインと同時にシャットダウンする素敵なユーザーができあがりました。
 
あとはとりあえずteratermのマクロかなんかでtelnet連続ログインのスクリプトを作ればOKなんだけど、とりあえずそれはまた来週。
 
sudoはセキュアじゃないSELinuxのニオイがして楽しかったです。
(rm許可して$/sbin/sudo rm -R -U / と・か・ね)