リモートでシャットダウン
帰省などと相まって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 / と・か・ね)