ログイン時にメッセージを表示する Linux の仕組み MOTD をやってみたメモ

ログイン時にメッセージを表示する Linux の仕組み MOTD をやってみたメモ

ログイン時にメッセージを表示する Linux の仕組み MOTD をやってみたメモです。

背景

最近、とみにそうなんですが、Docker などで動かしたりして複数のサーバーを触っていると「あれ?今どのサーバーにいるんだっけ?」と混乱することがあります。

一番まずいのは、同じ黒い画面で、自分の手元のコンテナならいいだろうって思ってたら、うっかり本番のクラウド環境をいじってたみたいなときです。事故ってないけど、ヒヤリハットはあります。

ということでログイン時にメッセージを出したくて、最初は .bashrc に echo を書けば済むだろうと思いました。ただ .bashrc は「ログインのたび」ではなく「対話シェルが起動するたび」実行されることに気づきました。なんかサブシェルを起動しても実行されるので、意図しないタイミングでもメッセージが出てしまいましたね。

たぶんこれが合う用途もあると思うのですが「ログインのたび」を求めると違う感じ。さらに調べてみると、Linux には最初からこの用途専用の仕組み MOTD があるんだなということが分かりました。

MOTD とは

MOTD は「Message Of The Day」とのこと。ユーザーがログインしたときにメッセージを表示する仕組みです。1970 年代のUNIXから存在する伝統的な機能で Linux・macOS・BSD・Solarisなど広く実装されているようです。

いままでも、目の前を通り過ぎて行った機能だとは思うのですが、ちゃんと分かってる使うのははじめてです。

シンプルに書く

一番シンプルな方法は /etc/motd に直接書くことです。

sudo nano /etc/motd

みたいなコマンドでエディタで開いて書きます。

========================================
  環境: 本番 (production)
  役割: Web Server #1
  注意: 変更前に必ず承認を取ること
========================================

これでログイン時に上記のメッセージが表示されます。シンプル。

もうちょっと発展

そうこれでもいいんですけどね。固定値なら。

でも、ほら、今の IP アドレスとかそういうのって手入力でやって使いまわしてしまうと、事故りますよね。実際、他の Linux で IP のところまで移植してしまって混乱したことがあります。

ということで、固定文言だけでなく、ログインのたびにスクリプトで動的に生成することもできます。/etc/update-motd.d/ ディレクトリにスクリプトを置く方式です。

sudo nano /etc/update-motd.d/99-custom

こんな感じでエディタで編集します。

#!/bin/bash
echo ""
echo "============================================"
echo "  環境: 本番 (production)"
echo "  役割: Web Server"
echo "  ホスト名: $(hostname)"
echo "  ログインユーザー: $(whoami)"
echo "============================================"
echo ""

今回は echo で出す仕掛けです。こうすれば、システムで取れる値が色々出せる。

sudo chmod +x /etc/update-motd.d/99-custom

あと実行ファイルなので、ちゃんと実行可能にします。最初、ここがうまく理解できてなくて権限エラーで泣きました。しかも、あまりに当然の機能すぎて AI に聞いても原因をさっぱり気づいてもらえませんでした。

そう、AI には問題点をしっかり伝えきらないと、解決できない。

実行順がおもしろい

ファイル名先頭の数字が実行順序を決めます。/etc/update-motd.d/ 内は run-parts によって数字の昇順で実行されているそうです。

その出力がまとめて表示されます。クラウドとかだとそもそもカスタムの文言の手前に出てくる文言もあります。アップデートとか。

不要なスクリプトは実行権限を外せば無効化できます。

sudo chmod -x /etc/update-motd.d/古いスクリプト名

ただ、私は、権限とか気づきにくかったので最低限の利用って感じです。慣れると分かりやすいんだろうなあ。

ログインでも確認する方法

ログイン何度も出力チェックしてると結構確認サイクルがきついです。再表示したい場合は以下で確認できました。ありがたい。

# 静的MOTDの場合
cat /etc/motd

# 動的MOTDの場合
run-parts /etc/update-motd.d/

ちょっとこのあたりは環境によって違うかもしれません。

色も装飾できる

そうそう、どちらかというと echo の知見ですが echo -e と ANSI カラーコードを使うと、MOTDに色を付けられます。

例えばこんな感じ。

#!/bin/bash
RED="\e[31m"
GREEN="\e[32m"
YELLOW="\e[33m"
RESET="\e[0m"

COLOR=${RED}

echo ""
echo -e "${COLOR}============================================${RESET}"
echo -e "${COLOR}  環境: 本番 (production)${RESET}"
echo -e "${COLOR}  役割: Web Server${RESET}"
echo "  ホスト名: $(hostname)"
echo -e "${COLOR}============================================${RESET}"
echo ""

\e[0m は色をリセットするコードです。装飾した文字列の末尾に必ず付けることで、後続の出力に色が残らないようにできます。

  • 赤
    • \e[31m
  • 緑
    • \e[32m
  • 黄
    • \e[33m
  • 青
    • \e[34m
  • リセット
    • \e[0m

本番は赤、検証は白・緑など環境ごとに色を分けておくと、視覚的に判別しやすくなりました。

例えば、こんな感じ。だいぶ危険感がある。いいですね。