{"id":3609,"date":"2025-10-17T17:50:33","date_gmt":"2025-10-17T12:20:33","guid":{"rendered":"https:\/\/blog.spike.sh\/?p=3609"},"modified":"2025-10-24T17:31:55","modified_gmt":"2025-10-24T12:01:55","slug":"linux-motds","status":"publish","type":"post","link":"https:\/\/blog.spike.sh\/linux-motds\/","title":{"rendered":"Linux MOTDs: A Deep Dive"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">It all began when I spun up an <strong>AWS t4g.small burstable instance<\/strong> for a side project. Nothing unusual just another day in the cloud. But the moment I connected through <strong>SSH<\/strong>, something caught my eye.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The system greeted me with a temperature reading of <strong>-273.1\u00b0C<\/strong>. Wait\u2026 what? That\u2019s <strong>0 Kelvin,<\/strong> the point where atomic motion completely<em> <\/em>stops. In other words, <strong>absolute zero<\/strong> , a state that\u2019s theoretically impossible for anything to operate in. For comparison, the coldest natural temperature ever recorded on Earth was <strong>-89.2\u00b0C<\/strong> in <strong>Antarctica (1983)<\/strong>. Even in controlled lab experiments, researchers at <strong>MIT<\/strong> have only managed to get close<em> <\/em>to 0 K using advanced laser-cooling techniques.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> So how on Earth was my server \u201crunning\u201d at <strong>absolute zero<\/strong> and responding just fine? Clearly, something wasn\u2019t right. Turns out, that mysterious number wasn\u2019t an actual reading at all.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><mark style=\"background-color:rgba(0, 0, 0, 0);color:#00d084\" class=\"has-inline-color\"># sshing in to the server<\/mark>\n<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-secondary-color\">ssh -i mysshkey.pem ubuntu@public_ip<\/mark><\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"133\" data-attachment-id=\"3613\" data-permalink=\"https:\/\/blog.spike.sh\/linux-motds\/potd_t4g-small\/\" data-orig-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/potd_t4g.small_.png\" data-orig-size=\"660,133\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"potd_t4g.small\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/potd_t4g.small_.png\" src=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/potd_t4g.small_.png\" alt=\"\" class=\"wp-image-3613\" srcset=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/potd_t4g.small_.png 660w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/potd_t4g.small_-300x60.png 300w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><figcaption class=\"wp-element-caption\">MOTD of Ubuntu t4g.small Instance<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">It was a <strong>bogus placeholder<\/strong>, quietly sitting inside the system\u2019s <strong>Message of the Day (MOTD)<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And that discovery sent me down a rabbit hole into the world of Linux MOTDs, dynamic system messages, and a bit of digital detective work.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Backstory &#8211; From Unix Terminal to Basically All Cloud Servers<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The answer goes back to the early days of Unix, long before the cloud, containers, or even the graphical desktop existed. Back then, system administrators logged into <strong>shared mainframes<\/strong> through text-only terminals. When users connected, they were often greeted by a short \u201c<strong>Message of the Day<\/strong>\u201d posted by the sysadmin. The MOTD was where admins shared important announcements like:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2192 Scheduled maintenance windows<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2192 New software update and many more.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"599\" data-attachment-id=\"3654\" data-permalink=\"https:\/\/blog.spike.sh\/linux-motds\/earl_motd-2\/\" data-orig-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/earl_motd-1.png\" data-orig-size=\"1024,599\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"earl_motd\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/earl_motd-1.png\" src=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/earl_motd-1.png\" alt=\"\" class=\"wp-image-3654\" style=\"aspect-ratio:1.7096124604446636;width:630px;height:auto\" srcset=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/earl_motd-1.png 1024w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/earl_motd-1-300x175.png 300w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/earl_motd-1-768x449.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">As Linux evolved and spread across personal computers, servers, and eventually the cloud, the MOTD quietly came along for the ride. What was once a simple noticeboard for sysadmins became a <strong>built-in tradition,<\/strong> one that still greets you every time you log in.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Today, in the age of cloud, MOTD has found a new role. It\u2019s no longer just for messages, it\u2019s a <strong>tiny dashboard<\/strong>, capable of showing <strong>system health<\/strong>, <strong>instance metadata<\/strong>, or even <strong>deployment info<\/strong>. Ubuntu, for example, takes it further with <strong>dynamic MOTDs<\/strong> that change every time you log in, generated by small scripts under <code><mark style=\"background-color:rgba(0, 0, 0, 0);color:#00d084\" class=\"has-inline-color\">\/etc\/update-motd.d\/<\/mark><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So that \u201c-273.1\u00b0C\u201d message I saw wasn\u2019t some ghost in the machine, it was a hint that <strong>my MOTD was dynamically generated<\/strong>, and something in the chain had gone wrong.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And that\u2019s when I decided to explore how this little greeting message actually works behind the scenes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How MOTD Works in Ubuntu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Traditionally, MOTD was just a static text file located at<code> <\/code><mark style=\"background-color:rgba(0, 0, 0, 0);color:#00d084\" class=\"has-inline-color\"><code>\/etc\/motd<\/code>.<\/mark> But on modern Ubuntu has moved from static to dynamic MOTDs. Modern Ubuntu versions (like 22.04+) generate MOTDs dynamically using small executable scripts stored in <code><mark style=\"background-color:rgba(0, 0, 0, 0);color:#00d084\" class=\"has-inline-color\">\/etc\/update-motd.d\/.<\/mark><\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"330\" data-attachment-id=\"3621\" data-permalink=\"https:\/\/blog.spike.sh\/linux-motds\/list_of_potds\/\" data-orig-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/list_of_potds.png\" data-orig-size=\"1055,340\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"list_of_potds\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/list_of_potds-1024x330.png\" src=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/list_of_potds-1024x330.png\" alt=\"\" class=\"wp-image-3621\" srcset=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/list_of_potds-1024x330.png 1024w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/list_of_potds-300x97.png 300w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/list_of_potds-768x248.png 768w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/list_of_potds.png 1055w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">List of Executable MOTDs<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The higher the number, the later the scripts run, it follows to run the scripts in ascending numeric order, so <code>00-<\/code> executes first and <code>99-<\/code> last.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each of these scripts run every time you log in via ssh or a TTY session. Their output is combined to form the final MOTD message you see.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For Example:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>50-landscape-sysinfo \u2192 Shows system info (CPU, load, memory)<\/li>\n\n\n\n<li>90-updates-available \u2192 Displays pending updates<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Now after getting how MOTDs worked, I was eager to experiment with custom scripts and see how they would turn out.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Experimenting With Different Scripts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I started with a simple script the goal was to display key instance details like the <strong>Instance ID<\/strong>, <strong>Availability Zone<\/strong>, <strong>Uptime<\/strong>, <strong>Memory usage<\/strong>, and <strong>Disk usage<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To try it out, created a new file called <strong>99-custom<\/strong> in the <code>\/etc\/update-motd.d\/<\/code> directory and wrote the following script, added a few fun symbols to make it more expressive.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-secondary-color\">sudo nano \/etc\/update-motd.d\/99-custom<\/mark><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><code><mark style=\"background-color:rgba(0, 0, 0, 0);color:#9b51e0\" class=\"has-inline-color\">#!\/bin\/bash\n\n<\/mark><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-secondary-color\">if command -v ec2metadata &amp;&gt; \/dev\/null; then\n    echo \"\ud83c\udf0d Instance ID: $(ec2metadata --instance-id)\"\n    echo \"\ud83d\udccd Availability Zone: $(ec2metadata --availability-zone)\"\nfi\n\necho \"\ud83d\udca1 Uptime: $(uptime -p)\"\necho \"\ud83e\udde0 Memory: $(free -h | awk '\/Mem:\/ {print $3 \" \/ \" $2}')\"\necho \"\ud83d\udcbe Disk: $(df -h \/ | awk 'NR==2 {print $3 \" \/ \" $2}')\"<\/mark><\/code><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now it was time to run the script. To do that, I first gave the file executable permissions and then tested it individually.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-secondary-color\">sudo chmod +x \/etc\/update-motd.d\/99-custom<\/mark><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-secondary-color\">bash \/etc\/update-motd.d\/99-custom<\/mark><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The output turned out just as I imagined clean, colorful, and pretty cool to look at.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"269\" data-attachment-id=\"3625\" data-permalink=\"https:\/\/blog.spike.sh\/linux-motds\/99-custom\/\" data-orig-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/99-custom.png\" data-orig-size=\"1327,349\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"99-custom\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/99-custom-1024x269.png\" src=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/99-custom-1024x269.png\" alt=\"\" class=\"wp-image-3625\" srcset=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/99-custom-1024x269.png 1024w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/99-custom-300x79.png 300w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/99-custom-768x202.png 768w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/99-custom-1200x316.png 1200w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/99-custom.png 1327w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Now it was time to try something a little fancy with the script. For that, installed <strong>Figlet<\/strong> and <strong>Lolca<\/strong>t in the system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">figlet draws big ASCII banners, lolcat colorizes text in rainbow gradient.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><mark style=\"background-color:rgba(0, 0, 0, 0);color:#9b51e0\" class=\"has-inline-color\">sudo apt update<\/mark>\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#9b51e0\" class=\"has-inline-color\">sudo apt install figlet lolcat -y<\/mark>\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#9b51e0\" class=\"has-inline-color\">sudo nano \/etc\/update-motd.d\/99-custom<\/mark><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><mark style=\"background-color:rgba(0, 0, 0, 0);color:#9b51e0\" class=\"has-inline-color\">#!\/bin\/bash\n\n<\/mark><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-secondary-color\">RED=\"\\e&#091;31m\"; GREEN=\"\\e&#091;32m\"; YELLOW=\"\\e&#091;33m\"; BLUE=\"\\e&#091;34m\"\nMAGENTA=\"\\e&#091;35m\"; CYAN=\"\\e&#091;36m\"; BOLD=\"\\e&#091;1m\"; RESET=\"\\e&#091;0m\"<\/mark>\n\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#00d084\" class=\"has-inline-color\">#  it displays the hostname in banner using figlet and lolcat<\/mark>\n<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-secondary-color\">if command -v figlet &amp;&gt; \/dev\/null &amp;&amp; command -v lolcat &amp;&gt; \/dev\/null; then\n    figlet \"$(hostname)\" | lolcat\nelse\n    echo -e \"${CYAN}${BOLD}$(hostname)${RESET}\"\nfi\n\necho -e \"${CYAN}\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501${RESET}\"<\/mark>\n\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#00d084\" class=\"has-inline-color\"># displays the instance features<\/mark>\n<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-secondary-color\">if command -v ec2metadata &amp;&gt; \/dev\/null; then\n    echo -e \"\u2601\ufe0f  ${BOLD}Instance ID:${RESET} $(ec2metadata --instance-id)\"\n    echo -e \"\ud83d\udccd ${BOLD}Availability Zone:${RESET} $(ec2metadata --availability-zone)\"\nfi<\/mark>\n\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#00d084\" class=\"has-inline-color\"># displays the system info<\/mark>\n<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-secondary-color\">uptime_info=$(uptime -p)\nmem_usage=$(free -h | awk '\/Mem:\/ {print $3 \" \/ \" $2}')\ndisk_usage=$(df -h \/ | awk 'NR==2 {print $3 \" \/ \" $2}')\nload_avg=$(uptime | awk -F'load average:' '{print $2}' | xargs)\nkernel_version=$(uname -r)\n\necho -e \"\ud83d\udd52 ${BOLD}Uptime:${RESET} $uptime_info\"\necho -e \"\ud83e\udde0 ${BOLD}Memory:${RESET} $mem_usage\"\necho -e \"\ud83d\udcbe ${BOLD}Disk:${RESET} $disk_usage\"\necho -e \"\u2699\ufe0f  ${BOLD}Kernel:${RESET} $kernel_version\"\necho -e \"\ud83d\udd25 ${BOLD}Load Avg:${RESET} $load_avg\"<\/mark><mark style=\"background-color:rgba(0, 0, 0, 0);color:#ff6900\" class=\"has-inline-color\">\n<\/mark>\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#00d084\" class=\"has-inline-color\"># displays the weather<\/mark>\nif command -v curl &amp;&gt; \/dev\/null; then\n    weather=$(curl -s \"wttr.in?format=1\")\n    if &#091;&#091; -n \"$weather\" ]]; then\n        echo -e \"\ud83c\udf24\ufe0f  ${BOLD}Weather:${RESET} $weather\"\n    fi\nfi\n\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#00d084\" class=\"has-inline-color\"># displays user info<\/mark>\ncurrent_user=$(whoami)\nlogin_ip=$(who | awk '{print $5}' | head -n 1 | tr -d '()')\nlogin_time=$(who -u | awk '{print $3, $4}' | head -n 1)\necho -e \"\ud83d\udc64 ${BOLD}User:${RESET} $current_user\"\necho -e \"\ud83d\udd17 ${BOLD}Login From:${RESET} ${login_ip:-N\/A} at ${login_time:-N\/A}\"\n\n<mark style=\"background-color:rgba(0, 0, 0, 0);color:#00d084\" class=\"has-inline-color\"># displays a random quote<\/mark>\n\nquotes=(\n    \"Keep it simple, automate everything.\"\n    \"Cloud is just someone else's computer \u2601\ufe0f\"\n    \"In God we trust, all others bring data.\"\n    \"There is no cloud without coffee \u2615\"\n    \"DevOps: Because downtime isn\u2019t an option.\"\n)\nrand_quote=${quotes&#091;$RANDOM % ${#quotes&#091;@]}]}\necho -e \"\ud83d\udcac ${MAGENTA}${rand_quote}${RESET}\"\n\necho -e \"${CYAN}\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501${RESET}\"\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The output showed up as a banner, giving the MOTD a bold and vibrant look.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"572\" data-attachment-id=\"3627\" data-permalink=\"https:\/\/blog.spike.sh\/linux-motds\/fancy_99-custom\/\" data-orig-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/fancy_99-custom.png\" data-orig-size=\"1101,615\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"fancy_99-custom\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/fancy_99-custom-1024x572.png\" src=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/fancy_99-custom-1024x572.png\" alt=\"\" class=\"wp-image-3627\" srcset=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/fancy_99-custom-1024x572.png 1024w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/fancy_99-custom-300x168.png 300w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/fancy_99-custom-768x429.png 768w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/fancy_99-custom.png 1101w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">But this wasn\u2019t the only custom script that will run at login, all the other default MOTD scripts were still executing too. And that meant the haunting <code>-273.1\u00b0C<\/code> message will still be appearing every time I ssh the server. So, my little battle to delete or edit that impossible temperature reading began here.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">My Failed Attempt to Change The Temperature:<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I started by looking into the <code>\/etc\/update-motd.d\/<\/code> folder to figure out where the MOTD was fetching the temperature, turns out that all the system-related information is handled inside the <strong>50-landscape-sysinfo<\/strong> script, so opened it with <code>cat<\/code>, but surprisingly, there was <strong>no temperature code there<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After a bit of digging, I discovered that the temperature was actually fetched using the <code>bin<\/code>. Following the trail, I was directed to check <code>\/usr\/bin\/landscape-sysinfo.<\/code> That, in turn, led to <code>\/usr\/bin\/python3\/ dist-packages\/landscape\/sysinfo.<\/code> Inside, a bunch of Python scripts were found and buried among them was <strong><code>temperature.py<\/code><\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"425\" data-attachment-id=\"3636\" data-permalink=\"https:\/\/blog.spike.sh\/linux-motds\/temperature-py\/\" data-orig-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/temperature.py_.png\" data-orig-size=\"1898,788\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"temperature.py\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/temperature.py_-1024x425.png\" src=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/temperature.py_-1024x425.png\" alt=\"\" class=\"wp-image-3636\" srcset=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/temperature.py_-1024x425.png 1024w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/temperature.py_-300x125.png 300w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/temperature.py_-768x319.png 768w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/temperature.py_-1536x638.png 1536w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/temperature.py_-1200x498.png 1200w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/temperature.py_.png 1898w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The code further led to <code>landscape.lib.sysstats<\/code>, and from there it calls <code>get_thermal_zones<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"255\" data-attachment-id=\"3638\" data-permalink=\"https:\/\/blog.spike.sh\/linux-motds\/main_temperaure_thing\/\" data-orig-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/main_temperaure_thing.png\" data-orig-size=\"1036,258\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"main_temperaure_thing\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/main_temperaure_thing-1024x255.png\" src=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/main_temperaure_thing-1024x255.png\" alt=\"\" class=\"wp-image-3638\" srcset=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/main_temperaure_thing-1024x255.png 1024w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/main_temperaure_thing-300x75.png 300w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/main_temperaure_thing-768x191.png 768w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/main_temperaure_thing.png 1036w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">From the code, it looks like it first checks if there is a sensor available. If a sensor exists, it fetches the actual data from there. Otherwise, on a cloud VM where there is no access to system-level hardware data, it returns a placeholder bogus value called <code>temp1_input<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"165\" data-attachment-id=\"3641\" data-permalink=\"https:\/\/blog.spike.sh\/linux-motds\/static_value\/\" data-orig-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/static_value.png\" data-orig-size=\"1110,179\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"static_value\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/static_value-1024x165.png\" src=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/static_value-1024x165.png\" alt=\"\" class=\"wp-image-3641\" srcset=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/static_value-1024x165.png 1024w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/static_value-300x48.png 300w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/static_value-768x124.png 768w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/static_value.png 1110w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">When I tried changing it, 101 Linux Basics came to mind, the part about kernel space and user space. Files inside <strong>\/sys\/class\/hwmon\/<\/strong> can\u2019t be modified directly since the kernel protects them from user-level changes. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On a cloud VM, there\u2019s <strong>no access to physical hardware sensors<\/strong>, so system files like <code>\/sys\/class\/hwmon\/ <\/code>just return <strong>placeholder values<\/strong>. That\u2019s why temperatures like <code>-273.1\u00b0C<\/code> appear it\u2019s the kernel\u2019s way of saying the data isn\u2019t available.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">These files are <strong>read-only placeholders<\/strong>, so attempting to write just gives a \u201cpermission denied\u201d error. That safeguard ensures stability even if something tries to mess with kernel data.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"620\" height=\"154\" data-attachment-id=\"3643\" data-permalink=\"https:\/\/blog.spike.sh\/linux-motds\/permission-denied\/\" data-orig-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/permission-denied.png\" data-orig-size=\"620,154\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"permission denied\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/permission-denied.png\" src=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/permission-denied.png\" alt=\"\" class=\"wp-image-3643\" srcset=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/permission-denied.png 620w, https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/permission-denied-300x75.png 300w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">The Tricky Solution:<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On Ubuntu cloud VMs, the default <code>50-landscape-sysinfo<\/code> script prints system information, including a bogus <code>-273.1\u00b0C<\/code> because cloud instances don\u2019t have access to real hardware sensors. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I figured out two ways to get rid of this bogus temperature value, the first method was simple but effective, by removing the execute permission of the <code>50-landscape-sysinfo<\/code> script so it wouldn\u2019t run at all, preventing it from printing the impossible <code>-273.1\u00b0C<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The second method was to directly edited the script to override the temperature. By adding a check to see if a hardware sensor exists, make  it print a safe value or a friendly message whenever the VM had no real sensor data. This way, the script still showed all the useful system information.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wrapping Up<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">MOTDs may look harmless, but on Linux, they can actually <strong>pose security concerns<\/strong>. Each script in <code>\/etc\/update-motd.d\/<\/code> is <strong>executable<\/strong>, meaning any malicious or poorly written script could run commands as your user (or even root if misconfigured). That\u2019s why it\u2019s important to <strong>only customize or override scripts you trust<\/strong>, and never blindly copy scripts from unverified sources.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Despite this, MOTDs are incredibly <strong>useful for quick system insights<\/strong>, showing load, memory, disk usage, cloud metadata, or custom banners all at login. By safely overriding scripts like <code>50-landscape-sysinfo<\/code>, you can fix quirks (like the bogus <code>-273.1\u00b0C<\/code>) and make your MOTD both <strong>informative and safe<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Happy Exploring!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I spun up an AWS instance, but the system greeted me at -273.1\u00b0C. This impossible temperature wasn&#8217;t a hardware failure but a quirk in the Linux MOTD. Here&#8217;s a deep dive into what happened and how dynamic MOTDs work on Ubuntu servers.<\/p>\n","protected":false},"author":263547075,"featured_media":3670,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","_lmt_disableupdate":"","_lmt_disable":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[1464],"tags":[],"class_list":["post-3609","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech-deep-dives"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Linux MOTDs: A Deep Dive<\/title>\n<meta name=\"description\" content=\"Why does my Linux MOTD show -273.1\u00b0C? A deep dive into Ubuntu&#039;s dynamic message system and fixing placeholder sensor data.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.spike.sh\/linux-motds\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Linux MOTDs: A Deep Dive\" \/>\n<meta property=\"og:description\" content=\"Why does my Linux MOTD show -273.1\u00b0C? A deep dive into Ubuntu&#039;s dynamic message system and fixing placeholder sensor data.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.spike.sh\/linux-motds\/\" \/>\n<meta property=\"og:site_name\" content=\"Spike&#039;s blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-17T12:20:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-24T12:01:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/Basics-of-Incident-Management-5.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1040\" \/>\n\t<meta property=\"og:image:height\" content=\"564\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Ritik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ritik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blog.spike.sh\\\/linux-motds\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.spike.sh\\\/linux-motds\\\/\"},\"author\":{\"name\":\"Ritik\",\"@id\":\"https:\\\/\\\/blog.spike.sh\\\/#\\\/schema\\\/person\\\/0ebc403b67137be9453c2c19f7049e6a\"},\"headline\":\"Linux MOTDs: A Deep Dive\",\"datePublished\":\"2025-10-17T12:20:33+00:00\",\"dateModified\":\"2025-10-24T12:01:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blog.spike.sh\\\/linux-motds\\\/\"},\"wordCount\":1227,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/blog.spike.sh\\\/linux-motds\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.spike.sh\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/Basics-of-Incident-Management-5.png\",\"articleSection\":[\"Tech Deep Dives\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blog.spike.sh\\\/linux-motds\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blog.spike.sh\\\/linux-motds\\\/\",\"url\":\"https:\\\/\\\/blog.spike.sh\\\/linux-motds\\\/\",\"name\":\"Linux MOTDs: A Deep Dive\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.spike.sh\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blog.spike.sh\\\/linux-motds\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.spike.sh\\\/linux-motds\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.spike.sh\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/Basics-of-Incident-Management-5.png\",\"datePublished\":\"2025-10-17T12:20:33+00:00\",\"dateModified\":\"2025-10-24T12:01:55+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blog.spike.sh\\\/#\\\/schema\\\/person\\\/0ebc403b67137be9453c2c19f7049e6a\"},\"description\":\"Why does my Linux MOTD show -273.1\u00b0C? A deep dive into Ubuntu's dynamic message system and fixing placeholder sensor data.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blog.spike.sh\\\/linux-motds\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blog.spike.sh\\\/linux-motds\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/blog.spike.sh\\\/linux-motds\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blog.spike.sh\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/Basics-of-Incident-Management-5.png\",\"contentUrl\":\"https:\\\/\\\/blog.spike.sh\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/Basics-of-Incident-Management-5.png\",\"width\":1040,\"height\":564,\"caption\":\"Blog cover titled \\\"Linux MOTDs: A Deep Dive\\\"\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blog.spike.sh\\\/linux-motds\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blog.spike.sh\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Linux MOTDs: A Deep Dive\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blog.spike.sh\\\/#website\",\"url\":\"https:\\\/\\\/blog.spike.sh\\\/\",\"name\":\"Spike&#039;s blog\",\"description\":\"Learnings and opinions in a changing world\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blog.spike.sh\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blog.spike.sh\\\/#\\\/schema\\\/person\\\/0ebc403b67137be9453c2c19f7049e6a\",\"name\":\"Ritik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/920216c1bf99ca7d2bc498ed60693d207d263e047fc7c8d8c916bc76148bb32f?s=96&d=robohash&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/920216c1bf99ca7d2bc498ed60693d207d263e047fc7c8d8c916bc76148bb32f?s=96&d=robohash&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/920216c1bf99ca7d2bc498ed60693d207d263e047fc7c8d8c916bc76148bb32f?s=96&d=robohash&r=g\",\"caption\":\"Ritik\"},\"description\":\"Just a random engineer from the street figuring out life.\",\"url\":\"https:\\\/\\\/blog.spike.sh\\\/author\\\/ritik100xdev\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Linux MOTDs: A Deep Dive","description":"Why does my Linux MOTD show -273.1\u00b0C? A deep dive into Ubuntu's dynamic message system and fixing placeholder sensor data.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.spike.sh\/linux-motds\/","og_locale":"en_GB","og_type":"article","og_title":"Linux MOTDs: A Deep Dive","og_description":"Why does my Linux MOTD show -273.1\u00b0C? A deep dive into Ubuntu's dynamic message system and fixing placeholder sensor data.","og_url":"https:\/\/blog.spike.sh\/linux-motds\/","og_site_name":"Spike&#039;s blog","article_published_time":"2025-10-17T12:20:33+00:00","article_modified_time":"2025-10-24T12:01:55+00:00","og_image":[{"width":1040,"height":564,"url":"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/Basics-of-Incident-Management-5.png","type":"image\/png"}],"author":"Ritik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Ritik","Estimated reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.spike.sh\/linux-motds\/#article","isPartOf":{"@id":"https:\/\/blog.spike.sh\/linux-motds\/"},"author":{"name":"Ritik","@id":"https:\/\/blog.spike.sh\/#\/schema\/person\/0ebc403b67137be9453c2c19f7049e6a"},"headline":"Linux MOTDs: A Deep Dive","datePublished":"2025-10-17T12:20:33+00:00","dateModified":"2025-10-24T12:01:55+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.spike.sh\/linux-motds\/"},"wordCount":1227,"commentCount":0,"image":{"@id":"https:\/\/blog.spike.sh\/linux-motds\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/Basics-of-Incident-Management-5.png","articleSection":["Tech Deep Dives"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.spike.sh\/linux-motds\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.spike.sh\/linux-motds\/","url":"https:\/\/blog.spike.sh\/linux-motds\/","name":"Linux MOTDs: A Deep Dive","isPartOf":{"@id":"https:\/\/blog.spike.sh\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.spike.sh\/linux-motds\/#primaryimage"},"image":{"@id":"https:\/\/blog.spike.sh\/linux-motds\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/Basics-of-Incident-Management-5.png","datePublished":"2025-10-17T12:20:33+00:00","dateModified":"2025-10-24T12:01:55+00:00","author":{"@id":"https:\/\/blog.spike.sh\/#\/schema\/person\/0ebc403b67137be9453c2c19f7049e6a"},"description":"Why does my Linux MOTD show -273.1\u00b0C? A deep dive into Ubuntu's dynamic message system and fixing placeholder sensor data.","breadcrumb":{"@id":"https:\/\/blog.spike.sh\/linux-motds\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.spike.sh\/linux-motds\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/blog.spike.sh\/linux-motds\/#primaryimage","url":"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/Basics-of-Incident-Management-5.png","contentUrl":"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/Basics-of-Incident-Management-5.png","width":1040,"height":564,"caption":"Blog cover titled \"Linux MOTDs: A Deep Dive\""},{"@type":"BreadcrumbList","@id":"https:\/\/blog.spike.sh\/linux-motds\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.spike.sh\/"},{"@type":"ListItem","position":2,"name":"Linux MOTDs: A Deep Dive"}]},{"@type":"WebSite","@id":"https:\/\/blog.spike.sh\/#website","url":"https:\/\/blog.spike.sh\/","name":"Spike&#039;s blog","description":"Learnings and opinions in a changing world","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.spike.sh\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/blog.spike.sh\/#\/schema\/person\/0ebc403b67137be9453c2c19f7049e6a","name":"Ritik","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/920216c1bf99ca7d2bc498ed60693d207d263e047fc7c8d8c916bc76148bb32f?s=96&d=robohash&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/920216c1bf99ca7d2bc498ed60693d207d263e047fc7c8d8c916bc76148bb32f?s=96&d=robohash&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/920216c1bf99ca7d2bc498ed60693d207d263e047fc7c8d8c916bc76148bb32f?s=96&d=robohash&r=g","caption":"Ritik"},"description":"Just a random engineer from the street figuring out life.","url":"https:\/\/blog.spike.sh\/author\/ritik100xdev\/"}]}},"modified_by":"Ritik","jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/blog.spike.sh\/wp-content\/uploads\/2025\/10\/Basics-of-Incident-Management-5.png","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfMe4Q-Wd","jetpack-related-posts":[{"id":283,"url":"https:\/\/blog.spike.sh\/tools-and-products-we-use-at-spike-part-1\/","url_meta":{"origin":3609,"position":0},"title":"\u26a1\ufe0fTools and Products We Use at Spike &#8211; Part 1","author":"Kaushik","date":"26th May, 2020","format":false,"excerpt":"Servers1. AWS2. Vercel (formerly Zeit.co)3. MongoDB AtlasMonitoring1. Cloudwatch2. Healthchecks.io3. Uptime Robot4. Datadog5. Nginx Amplify6. SentryCI\/CD1. Buddy.works2. Travis CIDevTools1. Ngrok2. VS Code Live Share3. Twilio4. Sendgrid Every organisation uses a multitude of a number of tools to support their business. We will try and cover all of the ones we use\u2026","rel":"","context":"In &quot;Building Spike&quot;","block_context":{"text":"Building Spike","link":"https:\/\/blog.spike.sh\/category\/building-spike\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2020\/05\/photo-1426927308491-6380b6a9936f.jpeg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2020\/05\/photo-1426927308491-6380b6a9936f.jpeg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2020\/05\/photo-1426927308491-6380b6a9936f.jpeg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2020\/05\/photo-1426927308491-6380b6a9936f.jpeg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2020\/05\/photo-1426927308491-6380b6a9936f.jpeg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2020\/05\/photo-1426927308491-6380b6a9936f.jpeg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":331,"url":"https:\/\/blog.spike.sh\/starting-with-incident-management-career\/","url_meta":{"origin":3609,"position":1},"title":"Starting with Incident Management Career","author":"Gurneet Kaur","date":"4th September, 2023","format":false,"excerpt":"A small list of resources to start your incident management career.","rel":"","context":"In &quot;Industry Insights&quot;","block_context":{"text":"Industry Insights","link":"https:\/\/blog.spike.sh\/category\/industry-insights\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2023\/09\/Careers-in-incident-management.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2023\/09\/Careers-in-incident-management.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2023\/09\/Careers-in-incident-management.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2023\/09\/Careers-in-incident-management.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2023\/09\/Careers-in-incident-management.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2023\/09\/Careers-in-incident-management.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":347,"url":"https:\/\/blog.spike.sh\/behind-the-outage-unpacking-the-lessons-of-major-software-incidents\/","url_meta":{"origin":3609,"position":2},"title":"Behind the Outage: Unpacking the Lessons of Major Software Incidents","author":"Sreekar","date":"20th February, 2024","format":false,"excerpt":"Look behind Slack, Cloudflare, GitHub, and other software outages in this analysis.","rel":"","context":"In &quot;Incident Management&quot;","block_context":{"text":"Incident Management","link":"https:\/\/blog.spike.sh\/category\/incident-management\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2024\/02\/Behind-the-outage.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2024\/02\/Behind-the-outage.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2024\/02\/Behind-the-outage.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2024\/02\/Behind-the-outage.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2024\/02\/Behind-the-outage.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2024\/02\/Behind-the-outage.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":370,"url":"https:\/\/blog.spike.sh\/2024-recap\/","url_meta":{"origin":3609,"position":3},"title":"A recap of 2024","author":"Kaushik","date":"11th January, 2025","format":false,"excerpt":"Spike\u2019s 2024 highlights: 691 deployments, 165,000 alerts sent, and AWS leading integrations. Critical incidents tripled to 9,200, with 1.4M incidents suppressed and 132K auto-resolved. Seamless on-call management: 53K shifts rotated, 8K overrides logged.","rel":"","context":"In &quot;Recap&quot;","block_context":{"text":"Recap","link":"https:\/\/blog.spike.sh\/category\/recap\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2025\/01\/2024-recap.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2025\/01\/2024-recap.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2025\/01\/2024-recap.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2025\/01\/2024-recap.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2025\/01\/2024-recap.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2025\/01\/2024-recap.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":315,"url":"https:\/\/blog.spike.sh\/insights-from-sre-at-cloudflare\/","url_meta":{"origin":3609,"position":4},"title":"How they SRE: Insights from the Cloudflare SRE Team","author":"Pruthvi","date":"3rd November, 2021","format":false,"excerpt":"Introduction Cloudflare is a global cloud services provider that is based all over the globe, from San Francisco, US to London, England to Sydney, Australia. Their mission, as stated front and center on their homepage, is to help build a better Internet. While that may read like hyperbole, their numbers\u2026","rel":"","context":"In &quot;Interview&quot;","block_context":{"text":"Interview","link":"https:\/\/blog.spike.sh\/category\/interview\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2021\/11\/002.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2021\/11\/002.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2021\/11\/002.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2021\/11\/002.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2021\/11\/002.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2021\/11\/002.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":336,"url":"https:\/\/blog.spike.sh\/basics-of-incident-management\/","url_meta":{"origin":3609,"position":5},"title":"Basics of Incident Management","author":"Gurneet Kaur","date":"1st November, 2023","format":false,"excerpt":"There is a great deal of things we can develop and learn from our incidents. Incident management is a vital piece in bringing your resiliency together.","rel":"","context":"In &quot;Incident Management&quot;","block_context":{"text":"Incident Management","link":"https:\/\/blog.spike.sh\/category\/incident-management\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2024\/02\/Basics-of-Incident-Management.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2024\/02\/Basics-of-Incident-Management.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2024\/02\/Basics-of-Incident-Management.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2024\/02\/Basics-of-Incident-Management.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2024\/02\/Basics-of-Incident-Management.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.spike.sh\/wp-content\/uploads\/2024\/02\/Basics-of-Incident-Management.png?resize=1400%2C800&ssl=1 4x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/blog.spike.sh\/wp-json\/wp\/v2\/posts\/3609","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.spike.sh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.spike.sh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.spike.sh\/wp-json\/wp\/v2\/users\/263547075"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.spike.sh\/wp-json\/wp\/v2\/comments?post=3609"}],"version-history":[{"count":42,"href":"https:\/\/blog.spike.sh\/wp-json\/wp\/v2\/posts\/3609\/revisions"}],"predecessor-version":[{"id":3718,"href":"https:\/\/blog.spike.sh\/wp-json\/wp\/v2\/posts\/3609\/revisions\/3718"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.spike.sh\/wp-json\/wp\/v2\/media\/3670"}],"wp:attachment":[{"href":"https:\/\/blog.spike.sh\/wp-json\/wp\/v2\/media?parent=3609"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.spike.sh\/wp-json\/wp\/v2\/categories?post=3609"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.spike.sh\/wp-json\/wp\/v2\/tags?post=3609"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}