コンバンハ、千葉(幸)です。
わたしは詳しく知らないのですが、最近とある SNS で青い鳥がいなくなったことが話題であるそうです。わたしは詳しく知らないのですが。
青い鳥と言えば幸せの象徴、それがいなくなったとなれば皆さんの青い鳥ロスは避けられません。代わりとなる青い鳥が必要です。なんなら鳥さえ確保できれば、それを青くするのはこちらでやります。
そんな折、どうやらアマゾンにはいい感じの鳥が住んでいるようだという噂を聞きつけました。ということで、藁にもすがる思いで我々は、未来の青い鳥の影を求め、アマゾンの奥地に出かけていくのであった。
こちらが今回赴くアマゾンです
アマゾン(Amazon Linux 2023)に到着しました。今回はこちらにお邪魔してみます。ワクワクしますね。
- AMI:ami-04beabd6a4fb6ab6f(
al2023-ami-2023.1.20230809.0-kernel-6.1-x86_64
) - 配置サブネット:パブリックサブネット
- パブリックIP アドレス割り当て:有効化
- SecuriryGroup:
- インバウンド:
3.112.23.0/29
からの SSH を許可 *1 - アウトバウンド:すべて許可
- インバウンド:
アマゾンには、コンソールから EC2 Instance Connect で接続していきます。「接続」→「EC2 Instance Connect」→「接続タイプ:EC2 Instance Connect を使用して接続する」→「接続」と押下していきます。
接続が完了し、幸先よく鳥がお出迎えしてくれました。
ほう……。
これはなかなかいい面構えをしていますね。青くし甲斐がありそうだ……。
Amazon Linux 2023 の鳥はどこに住んでいるのか
今回お出迎えしてくれた鳥は、/usr/lib/motd.d/30-banner
に住んでいます。
$ cat /usr/lib/motd.d/30-banner
, #_
~\_ ####_ Amazon Linux 2023
~~ \_#####\
~~ \###|
~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
ログイン時のメッセージ表示は motd という機能により成り立っています。motd が参照するファイルのひとつである/usr/lib/motd.d/30-banner
に鳥(を含むメッセージ)が定義されているというわけです。
Amazon Linux 2023 の motd 関連のファイル/ディレクトリを確認してみる
せっかくなので motd 関連の各種ファイル/ディレクトリの内訳を確認してみます。
/usr/lib/ 配下
/usr/lib/motd
は空のファイルです。/usr/lib/motd.d/
配下には先ほど見た30-banner
が存在します。
# ls -l /usr/lib/motd
-rw-r--r--. 1 root root 0 Jan 30 2023 /usr/lib/motd
# ls -l /usr/lib/motd.d/
total 4
-rw-r--r--. 1 root root 271 Aug 14 14:53 30-banner
/etc/ 配下
/etc/motd
は/var/lib/update-motd/motd
へのリンクになっています。リンク先は空ファイルです。/etc/motd.d/
配下には何も存在しません。
# ls -l /etc/motd
lrwxrwxrwx. 1 root root 25 Aug 7 22:39 /etc/motd -> /var/lib/update-motd/motd
# ls -l /var/lib/update-motd/
total 0
-rw-r--r--. 1 root root 0 Aug 14 14:20 motd
# ls -l /etc/motd.d/
total 0
/run/ 配下
/run/motd
は空ファイルで、/run/motd.d/
配下には何も存在しません。
# ls -l /run/motd
-rw-r--r--. 1 root root 0 Aug 14 14:20 /run/motd
# ls -l /run/motd.d/
total 0
/etc/update-motd.d/配下
/etc/update-motd.d/
配下には70-available-updates
のみが存在します。(ちなみに Amazon Linux 2 では30-banner
がこのディレクトリに存在します。)
# ls -l /etc/update-motd.d/
total 4
-rwxr-xr-x. 1 root root 1285 Aug 1 22:22 70-available-updates
70-available-updates
の内訳はこのようになっています。
# cat /etc/update-motd.d/70-available-updates
#!/usr/bin/sh
# Updates to current release
# Possible summaries include:
# No packages needed for security; %d packages available
# %d package(s) needed[ (+%d related)] for security, out of %d available
# There are [[%d security update(s)[ out of ]%d total update(s)]] available
LANG=C timeout 30s /usr/bin/dnf \
--debuglevel 2 \
updateinfo 2>/dev/null \
| grep -Pzo '.*Updates(.*\n)*' \
&& echo 'Run "sudo dnf update" to apply all updates.'
# New OS releases and versions
#
# Example summary:
#
# A newer release of "Amazon Linux" is available.
# Version 2023.0.20230824:
# Version 2023.0.20230831:
# A new version of "Amazon Linux" is available!
# Version 2024.0.20240915:
# don't be noisy if plugin is missing
if rpm -q --quiet dnf-plugin-release-notification; then
LANG=C timeout 30s /usr/bin/dnf \
check-release-update 2>&1 |
awk 'function pline() { printf any?"%s\n":"\n%s\n", $0; any=1; }
/newer release.*is available/ { sub("^ *", ""); pline(); }
/new version.*is available/ { sub("^ *", ""); pline(); }
/Version .*:/ { print; }
END { if (any) {
print "Run \"/usr/bin/dnf check-release-update\" for full release and version update info";
} }'
fi
setterm で背景とか青くしてみたらどうだろう
話は戻って、Amazon Linux 2023 の鳥を青くしたいです。手始めに背景を青くしてみましょう。
setterm
コマンドで、コンソールの文字色や背景色を変更できます。(有効なのはそのセッションのみです。)
以下のコマンドを実行することで、「端末の文字のクリア(clear
コマンド相当)」「文字色を白に変更」「背景色を青に変更」が実行されます。
$ setterm -clear all -foreground white -background blue
その状態で再度先ほどの鳥を表示してみます。
まぁ……悪くないですが「青い鳥」という感じはあまりしないですね。青く見えるサングラス越しに景色を見ているようなものですからね。鳥だけを青くしたいですね。
echo の出力で文字を青くしてみたらどうだろう
echo コマンドでは色属性のエスケープシーケンスを記述することにより、文字や背景色に色をつけられます。
色属性のエスケープシーケンス構文
\e[色属性mテキスト\e[m
例えば以下のような形です。
echo -e "\e[31mこんにちは\e[m"
echo -e "\e[42mこんばんは\e[m"
色属性の一桁目は3
が文字色、4
が背景色を表します。二桁目で色を指定しています。
ということでログインメッセージの鳥だけを青く表示する場合の一例はこのようになります。(4行目の末尾に\
を追加していることに注意してください。これが無いと改行が無視されてしまいました。)
$ echo -e "\e[34m
, #_
~\_ ####_ \e[0mAmazon Linux 2023\e[34m
~~ \_#####\\
~~ \###|
~~ \#/ ___ \e[0mhttps://aws.amazon.com/linux/amazon-linux-2023\e[34m
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
\e[0m"
いい感じですね。
ちょっと線が細い感じもするので、「太字」を表す\e[1m
も加えてみます。
$ echo -e "\e[1m\e[34m
, #_
~\_ ####_ \e[0mAmazon Linux 2023\e[1m\e[34m
~~ \_#####\\
~~ \###|
~~ \#/ ___ \e[0mhttps://aws.amazon.com/linux/amazon-linux-2023\e[1m\e[34m
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
\e[0m"
いい感じの青い鳥だ!いい感じだ!
/usr/lib/motd.d/配下だと動的な処理ができない
echo を用いて鳥を青くすることに成功しました。あとはこれをログインメッセージにも反映させたいです。
/usr/lib/motd.d/30-banner
を以下の内容にしてあげれば良さそうでしょうか。 *2
/usr/lib/motd.d/30-banner
#!/bin/bash
echo -e "\e[1m\e[34m
, #_
~\_ ####_ \e[0mAmazon Linux 2023\e[1m\e[34m
~~ \_#####\\
~~ \###|
~~ \#/ ___ \e[0mhttps://aws.amazon.com/linux/amazon-linux-2023\e[1m\e[34m
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
\e[0m"
以下のコマンドで/usr/lib/motd.d/30-banner
を書き換えてみます。
$ sudo sed -i -e '1s/^/#!\/bin\/bash\n\necho -e "\\e[1m\\e[34m\n/' -e '$s/$/\n\\e[0m"/' -e 's/Amazon Linux 2023/\\e[0m&\\e[1m\\e[34m/g' -e 's|https://aws.amazon.com/linux/amazon-linux-2023|\\e[0m&\\e[1m\\e[34m|g' -e '3s/$/\\/' /usr/lib/motd.d/30-banner
この状態で再度ログインしてみると、ファイルの内容がそのまま表示されてしまいました。
/usr/lib/motd.d/
配下では動的な内容は定義できないようです。
/etc/update-motd.d/配下に移してサービス起動してみる
修正済みの30-banner
を/etc/update-motd.d/
配下に移動させてみます。
$ sudo mv /usr/lib/motd.d/30-banner /etc/update-motd.d/
/etc/update-motd.d/
配下に置いたファイルから動的なメッセージを作成するにはupdate-motd
サービスを起動して読み込ませてあげる必要があります。
$ sudo systemctl start update-motd
ちなみにupdate-motd
サービスは起動直後に自動的に停止(inactive
)されていました。
$ systemctl status update-motd
○ update-motd.service - Dynamically Generate Message Of The Day
Loaded: loaded (/usr/lib/systemd/system/update-motd.service; enabled; preset: enabled)
Active: inactive (dead) since Tue 2023-08-15 04:33:21 UTC; 1min 6s ago
TriggeredBy: ● update-motd.timer
Process: 4943 ExecStart=/usr/sbin/update-motd (code=exited, status=0/SUCCESS)
Main PID: 4943 (code=exited, status=0/SUCCESS)
CPU: 694ms
Aug 15 04:33:20 ip-172-31-42-93.ap-northeast-1.compute.internal systemd[1]: Starting update-motd.service - Dynamically Generate Message Of The Day...
Aug 15 04:33:21 ip-172-31-42-93.ap-northeast-1.compute.internal systemd[1]: update-motd.service: Deactivated successfully.
Aug 15 04:33:21 ip-172-31-42-93.ap-northeast-1.compute.internal systemd[1]: Finished update-motd.service - Dynamically Generate Message Of The Day.
この状態で再度ログインすると……
ついに青い鳥がお出迎えしてくれました!!!
青い鳥…どこに行ってたんだよ……なぁ……!
あなたもすぐ青い鳥に会えるユーザーデータスクリプト
Amazon Linux 2023 の AMI からインスタンスを起動する際に、以下のユーザーデータを設定することで今回の取り上げた一連の処理が実行できます。
#!/bin/bash
sed -i -e '1s/^/#!\/bin\/bash\n\necho -e "\\e[1m\\e[34m\n/' -e '$s/$/\n\\e[0m"/' -e 's/Amazon Linux 2023/\\e[0m&\\e[1m\\e[34m/g' -e 's|https://aws.amazon.com/linux/amazon-linux-2023|\\e[0m&\\e[1m\\e[34m|g' -e '3s/$/\\/' /usr/lib/motd.d/30-banner
mv /usr/lib/motd.d/30-banner /etc/update-motd.d/
systemctl start update-motd.service
起動直後にsystemctl start update-motd.service
を実行するとサービスが立ち上がるまで時間がかかることがあったので、その場合は以下に置き換えてみるのもいいかもしれません。
#!/bin/bash
sed -i -e '1s/^/#!\/bin\/bash\n\necho -e "\\e[1m\\e[34m\n/' -e '$s/$/\n\\e[0m"/' -e 's/Amazon Linux 2023/\\e[0m&\\e[1m\\e[34m/g' -e 's|https://aws.amazon.com/linux/amazon-linux-2023|\\e[0m&\\e[1m\\e[34m|g' -e '3s/$/\\/' /usr/lib/motd.d/30-banner
mv /usr/lib/motd.d/30-banner /etc/update-motd.d/
systemctl enable update-motd.service
shutdown -r now
「いいかもしれません」と言うか、まぁ、こんな酔狂なことを試さないのが一番だと思います。
まとめ
- Amazon Linux 2023 のデフォルトのログインメッセージは
/usr/lib/motd.d/30-banner
で管理されている /usr/lib/motd.d/
配下では動的な内容を定義できない/etc/update-motd.d/
配下にファイルを格納し、update-motd
サービスを起動することで動的な内容をバナー表示できる
終わりに
Amazon Linux 2023 の鳥を青く染めてみた、という話でした。
ふとした思いつきから始めてみた行為でしたが、setterm コマンドや echo による文字列の変更、motd 周りの理解に繋がりそれなりに楽しめました。
元々生息している鳥を捕まえて青く染めた上で「青い鳥だ」と言い張るという、童話に出てくる悪役の気分も味わえました。
▲ 人類のエゴの犠牲になった鳥。
青い鳥うんぬんは別として、Amazon Linux 2023 におけるログインメッセージの変更自体は役に立つことがあるかも知れません。何らか参考になれば幸いです。
以上、 チバユキ (@batchicchi) がお送りしました。
おまけ:ログイン時のメッセージにエックスと表示したい
せっかくなのでログイン時のメッセージを別パターンにも変更してみたくなりました。
静的な内容であれば、/usr/lib/motd.d/30-banner
を直接編集するだけで済みます。特に理由はないのですが、「エックス」という単語を表示させたくなりました。
こちらのサイトで AA を生成してみます。
root で/usr/lib/motd.d/30-banner
を変更してみます。
# cat <<EOF > /usr/lib/motd.d/30-banner
■■■■■■■ ■■■■■■■■■
■■■■■■■■■ ■■ ■■ ■■
■ ■ ■■ ■ ■■
■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■■ ■■ ■■
■ ■ ■ ■ ■ ■■■
■ ■ ■■ ■■ ■■
■■■■■■■■■■ ■ ■■ ■■ ■■
■■ ■■■ ■ ■■
■■ ■
EOF
ログインしてみます。あっ文字化けしてる。
皆さんもお好きなメッセージを表示させてみてくださいね!
参考
- コンソールの表示色を変更するには
- シェルの出力に色を付ける | クロジカ
- 第755回 UbuntuにおけるMOTDの仕組みのすべて | gihyo.jp
- Amazon Linux 2023 が GA したので、SSH 接続時のバナーの変更をしてみた - サーバーワークスエンジニアブログ
- EC2(Amazon Linux)のログインバナーを変更する
- EC2 Instance Connectを使ってブラウザからSSH接続する - karakaram-blog
脚注
- 東京リージョンの EC2 Instance Connect が用いるグローバル IP アドレスです。以下で確認できます。
「curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq -r '.prefixes[] | select(.service == "EC2_INSTANCE_CONNECT" and .region == "ap-northeast-1")'」 ↩ - この内容だと末尾に改行が入ってしまっているので、動的に生成されたログインメッセージにも改行が反映されてしまいます。(ここではそもそも動的に生成されないのですが。)後から気づきました。まぁ細かいことを気にするのはやめましょう。改行が入ったほうが鳥が飛び立っている感じがより強く出ていいじゃないですか。 ↩