<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://aakashbudhathoki.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://aakashbudhathoki.github.io/" rel="alternate" type="text/html" /><updated>2026-10-24T11:29:38+00:00</updated><id>https://aakashbudhathoki.github.io/feed.xml</id><title type="html">Aakash Budhathoki</title><subtitle>Junior System Administrator passionate about Linux environments and automation. Transforming academic theory into efficient IT operations through Python scripting, system monitoring, and robust infrastructure practices.</subtitle><author><name>Aakash Budhathoki</name><email>aakashbudhathoki10@gmail.com</email></author><entry><title type="html">Automating Linux Administration with Bash: Three Scripts I Use Daily</title><link href="https://aakashbudhathoki.github.io/blog/2026/05/29/automating-linux-with-bash/" rel="alternate" type="text/html" title="Automating Linux Administration with Bash: Three Scripts I Use Daily" /><published>2026-05-29T00:00:00+00:00</published><updated>2026-05-29T00:00:00+00:00</updated><id>https://aakashbudhathoki.github.io/blog/2026/05/29/automating-linux-with-bash</id><content type="html" xml:base="https://aakashbudhathoki.github.io/blog/2026/05/29/automating-linux-with-bash/"><![CDATA[<p>Bash scripting is one of the most powerful tools in a system administrator’s toolkit.
Once you stop running the same commands manually and start automating them,
your productivity changes completely.</p>

<p>Here are three Bash scripts I reach for regularly. Each solves a real, recurring sysadmin problem.</p>

<hr />

<h2 id="1-system-health-check">1. System Health Check</h2>

<p>Running a quick sanity check on a server should take one command, not ten.
This script collects the most useful metrics and prints a clean report:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="c"># health-check.sh — Quick system health snapshot</span>

<span class="nv">HOSTNAME</span><span class="o">=</span><span class="si">$(</span><span class="nb">hostname</span><span class="si">)</span>
<span class="nv">DATE</span><span class="o">=</span><span class="si">$(</span><span class="nb">date</span> +<span class="s2">"%Y-%m-%d %T"</span><span class="si">)</span>
<span class="nv">LOAD</span><span class="o">=</span><span class="si">$(</span><span class="nb">uptime</span> | <span class="nb">awk</span> <span class="nt">-F</span><span class="s1">'load average:'</span> <span class="s1">'{print $2}'</span> | xargs<span class="si">)</span>
<span class="nv">MEM_USED</span><span class="o">=</span><span class="si">$(</span>free <span class="nt">-h</span> | <span class="nb">awk</span> <span class="s1">'/^Mem:/ {print $3 "/" $2}'</span><span class="si">)</span>
<span class="nv">DISK_USED</span><span class="o">=</span><span class="si">$(</span><span class="nb">df</span> <span class="nt">-h</span> / | <span class="nb">awk</span> <span class="s1">'NR==2 {print $5 " used (" $3 "/" $2 ")"}'</span><span class="si">)</span>
<span class="nv">FAILED_SERVICES</span><span class="o">=</span><span class="si">$(</span>systemctl <span class="nt">--failed</span> <span class="nt">--no-legend</span> | <span class="nb">wc</span> <span class="nt">-l</span><span class="si">)</span>

<span class="nb">echo</span> <span class="s2">"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"</span>
<span class="nb">echo</span> <span class="s2">"  System Health: </span><span class="nv">$HOSTNAME</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"  </span><span class="nv">$DATE</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"</span>
<span class="nb">echo</span> <span class="s2">"  Load avg:   </span><span class="nv">$LOAD</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"  Memory:     </span><span class="nv">$MEM_USED</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"  Disk (/):   </span><span class="nv">$DISK_USED</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"  Failed svc: </span><span class="nv">$FAILED_SERVICES</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"</span>

<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$FAILED_SERVICES</span><span class="s2">"</span> <span class="nt">-gt</span> 0 <span class="o">]</span><span class="p">;</span> <span class="k">then
  </span><span class="nb">echo</span> <span class="s2">"  ⚠ Failed services:"</span>
  systemctl <span class="nt">--failed</span> <span class="nt">--no-legend</span>
<span class="k">fi</span>
</code></pre></div></div>

<p>Make it executable and drop it into cron for a daily report:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">chmod</span> +x health-check.sh

<span class="c"># Run every morning at 8am, append to a log</span>
0 8 <span class="k">*</span> <span class="k">*</span> <span class="k">*</span> /opt/scripts/health-check.sh <span class="o">&gt;&gt;</span> /var/log/health.log 2&gt;&amp;1
</code></pre></div></div>

<hr />

<h2 id="2-automated-backup-with-7-day-rotation">2. Automated Backup with 7-Day Rotation</h2>

<p>Backups without rotation fill your disk. This script archives a target directory and
automatically removes archives older than your retention window:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="c"># backup.sh — Daily backup with configurable retention</span>

<span class="nv">SOURCE_DIR</span><span class="o">=</span><span class="s2">"/var/www/html"</span>
<span class="nv">BACKUP_DIR</span><span class="o">=</span><span class="s2">"/backups"</span>
<span class="nv">RETENTION_DAYS</span><span class="o">=</span>7
<span class="nv">DATE</span><span class="o">=</span><span class="si">$(</span><span class="nb">date</span> +%Y-%m-%d<span class="si">)</span>
<span class="nv">ARCHIVE</span><span class="o">=</span><span class="s2">"</span><span class="nv">$BACKUP_DIR</span><span class="s2">/backup-</span><span class="nv">$DATE</span><span class="s2">.tar.gz"</span>

<span class="c"># Ensure backup dir exists</span>
<span class="nb">mkdir</span> <span class="nt">-p</span> <span class="s2">"</span><span class="nv">$BACKUP_DIR</span><span class="s2">"</span>

<span class="c"># Create compressed archive</span>
<span class="nb">tar</span> <span class="nt">-czf</span> <span class="s2">"</span><span class="nv">$ARCHIVE</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">$SOURCE_DIR</span><span class="s2">"</span> 2&gt;/dev/null
<span class="nb">echo</span> <span class="s2">"[</span><span class="si">$(</span><span class="nb">date</span><span class="si">)</span><span class="s2">] Created: </span><span class="nv">$ARCHIVE</span><span class="s2">"</span>

<span class="c"># Prune old archives</span>
find <span class="s2">"</span><span class="nv">$BACKUP_DIR</span><span class="s2">"</span> <span class="nt">-name</span> <span class="s2">"backup-*.tar.gz"</span> <span class="nt">-mtime</span> +<span class="s2">"</span><span class="nv">$RETENTION_DAYS</span><span class="s2">"</span> <span class="nt">-delete</span>
<span class="nb">echo</span> <span class="s2">"[</span><span class="si">$(</span><span class="nb">date</span><span class="si">)</span><span class="s2">] Pruned archives older than </span><span class="k">${</span><span class="nv">RETENTION_DAYS</span><span class="k">}</span><span class="s2"> days"</span>
</code></pre></div></div>

<p>Schedule it nightly:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0 2 <span class="k">*</span> <span class="k">*</span> <span class="k">*</span> /opt/scripts/backup.sh <span class="o">&gt;&gt;</span> /var/log/backup.log 2&gt;&amp;1
</code></pre></div></div>

<blockquote>
  <p>Change <code class="language-plaintext highlighter-rouge">RETENTION_DAYS</code> and <code class="language-plaintext highlighter-rouge">SOURCE_DIR</code> at the top — no need to touch the logic.</p>
</blockquote>

<hr />

<h2 id="3-staff-onboarding-create-a-user-with-a-forced-password-reset">3. Staff Onboarding: Create a User with a Forced Password Reset</h2>

<p>When a new employee joins, this script creates their account and ensures they set
their own password on first login — no sharing of known passwords:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="c"># onboard.sh — Create a user with a temporary password</span>

<span class="nv">USERNAME</span><span class="o">=</span><span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span>
<span class="nv">TEMP_PASS</span><span class="o">=</span><span class="s2">"Welcome@</span><span class="si">$(</span><span class="nb">date</span> +%Y<span class="si">)</span><span class="s2">!"</span>

<span class="k">if</span> <span class="o">[</span> <span class="nt">-z</span> <span class="s2">"</span><span class="nv">$USERNAME</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
  </span><span class="nb">echo</span> <span class="s2">"Usage: </span><span class="nv">$0</span><span class="s2"> &lt;username&gt;"</span>
  <span class="nb">exit </span>1
<span class="k">fi

if </span><span class="nb">id</span> <span class="s2">"</span><span class="nv">$USERNAME</span><span class="s2">"</span> &amp;&gt;/dev/null<span class="p">;</span> <span class="k">then
  </span><span class="nb">echo</span> <span class="s2">"User '</span><span class="nv">$USERNAME</span><span class="s2">' already exists."</span>
  <span class="nb">exit </span>1
<span class="k">fi

</span>useradd <span class="nt">-m</span> <span class="nt">-s</span> /bin/bash <span class="s2">"</span><span class="nv">$USERNAME</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"</span><span class="nv">$USERNAME</span><span class="s2">:</span><span class="nv">$TEMP_PASS</span><span class="s2">"</span> | chpasswd
chage <span class="nt">-d</span> 0 <span class="s2">"</span><span class="nv">$USERNAME</span><span class="s2">"</span>   <span class="c"># Force password change on first login</span>

<span class="nb">echo</span> <span class="s2">"✓ User '</span><span class="nv">$USERNAME</span><span class="s2">' created."</span>
<span class="nb">echo</span> <span class="s2">"  Temp password: </span><span class="nv">$TEMP_PASS</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"  They will be prompted to change it at first login."</span>
</code></pre></div></div>

<p>Usage:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>bash onboard.sh john.doe
</code></pre></div></div>

<hr />

<h2 id="the-rule-that-changed-how-i-work">The Rule That Changed How I Work</h2>

<blockquote>
  <p><strong>If you do something twice, write a script.</strong></p>
</blockquote>

<p>Every manual step is a place where you can make a mistake, forget something,
or waste ten minutes you didn’t need to. A script is a decision made once
and applied consistently forever.</p>

<p>These three scripts took maybe an hour to write and refine. They’ve saved far more
than that in repeated manual work since then.</p>

<p>What Bash scripts have become part of your daily workflow?
Reach out via the <a href="/#contact">Contact</a> section — I’d love to see what others are automating.</p>]]></content><author><name>Aakash Budhathoki</name></author><category term="Linux" /><category term="Bash" /><category term="Automation" /><category term="SysAdmin" /><summary type="html"><![CDATA[Bash scripting is the backbone of Linux automation. In this post I walk through three practical scripts I use daily — system health checks, automated backups with rotation, and a user onboarding helper.]]></summary></entry></feed>