{"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":{"_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,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"{title}\n\n{excerpt}\n\n{url}","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 v28.1 - 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=\"Welcome to Spike.\" \/>\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\":\"Welcome to Spike.\",\"description\":\"In this space, our team talks about all things incidents, response, oncall, and share our journey of building Spike.\",\"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":"Welcome to Spike.","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":"Welcome to Spike.","description":"In this space, our team talks about all things incidents, response, oncall, and share our journey of building Spike.","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","_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}]}}