<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: methew smith </title>
    <description>The latest articles on DEV Community by methew smith  (@methew_smith).</description>
    <link>https://dev.to/methew_smith</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3824590%2F15fe0454-a6af-4188-9792-b23ea2c65b84.jpg</url>
      <title>DEV Community: methew smith </title>
      <link>https://dev.to/methew_smith</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/methew_smith"/>
    <language>en</language>
    <item>
      <title>scripting</title>
      <dc:creator>methew smith </dc:creator>
      <pubDate>Sun, 15 Mar 2026 01:54:39 +0000</pubDate>
      <link>https://dev.to/methew_smith/scripting-4odo</link>
      <guid>https://dev.to/methew_smith/scripting-4odo</guid>
      <description>&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;systeminfo.sh&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# systeminfo.sh&lt;/span&gt;
&lt;span class="c"&gt;# Purpose: Display system information including kernel, processor, OS, and editor info&lt;/span&gt;
&lt;span class="c"&gt;# Usage: ./systeminfo.sh&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"         SYSTEM INFORMATION REPORT       "&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;

&lt;span class="c"&gt;# Print kernel name (e.g., Linux)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Kernel Name     : &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Print kernel release version (e.g., 5.15.0-91-generic)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Kernel Release  : &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Print processor/hardware type (e.g., x86_64)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Processor Type  : &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Print the installed operating system name and version&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Operating System: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;lsb_release &lt;span class="nt"&gt;-d&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-f2&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"           FAVORITE EDITOR INFO          "&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;

&lt;span class="c"&gt;# Define favorite editor&lt;/span&gt;
&lt;span class="nv"&gt;EDITOR_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"nano"&lt;/span&gt;

&lt;span class="c"&gt;# Display the name of the favorite editor&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Favorite Editor : &lt;/span&gt;&lt;span class="nv"&gt;$EDITOR_NAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Show where the editor binary is located using 'which'&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Editor Location : &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;which &lt;span class="nv"&gt;$EDITOR_NAME&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Show where the editor documentation/manual is located using 'whereis'&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Documentation   : &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;whereis &lt;span class="nv"&gt;$EDITOR_NAME&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Make executable and run:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x systeminfo.sh
./systeminfo.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Expected Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=========================================
         SYSTEM INFORMATION REPORT
=========================================
Kernel Name     : Linux
Kernel Release  : 5.15.0-91-generic
Processor Type  : x86_64
Operating System: Ubuntu 22.04.3 LTS
=========================================
           FAVORITE EDITOR INFO
=========================================
Favorite Editor : nano
Editor Location : /usr/bin/nano
Documentation   : nano: /usr/bin/nano /usr/share/man/man1/nano.1.gz
=========================================
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;User and Group Management &lt;br&gt;
&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;usergroup.sh&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# usergroup.sh&lt;/span&gt;
&lt;span class="c"&gt;# Purpose: Create a user, a group, and add the user to the group&lt;/span&gt;
&lt;span class="c"&gt;# Usage: ./usergroup.sh&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"       USER AND GROUP MANAGEMENT         "&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;

&lt;span class="c"&gt;# Step 1: Create a new user named 'devopsuser'&lt;/span&gt;
&lt;span class="c"&gt;# -m flag creates the home directory automatically&lt;/span&gt;
&lt;span class="c"&gt;# -s sets the default shell to bash&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="s2"&gt;"devopsuser"&lt;/span&gt; &amp;amp;&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="c"&gt;# Check if user already exists to avoid errors&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] User 'devopsuser' already exists. Skipping creation."&lt;/span&gt;
&lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;useradd &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /bin/bash devopsuser
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] User 'devopsuser' created successfully."&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Step 2: Create a new group named 'devopsgroup'&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;getent group devopsgroup &amp;amp;&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="c"&gt;# Check if group already exists to avoid errors&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] Group 'devopsgroup' already exists. Skipping creation."&lt;/span&gt;
&lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;groupadd devopsgroup
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] Group 'devopsgroup' created successfully."&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Step 3: Add 'devopsuser' to 'devopsgroup'&lt;/span&gt;
&lt;span class="c"&gt;# usermod -aG appends the user to the group without removing from other groups&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; devopsgroup devopsuser
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] User 'devopsuser' added to group 'devopsgroup'."&lt;/span&gt;

&lt;span class="c"&gt;# Display verification — show the groups the user belongs to&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"--- Verification ---"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Groups for devopsuser:"&lt;/span&gt;
&lt;span class="nb"&gt;groups &lt;/span&gt;devopsuser

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Make executable and run:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x usergroup.sh
./usergroup.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Expected Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=========================================
       USER AND GROUP MANAGEMENT
=========================================
[SUCCESS] User 'devopsuser' created successfully.
[SUCCESS] Group 'devopsgroup' created successfully.
[SUCCESS] User 'devopsuser' added to group 'devopsgroup'.

--- Verification ---
Groups for devopsuser: devopsuser devopsgroup
=========================================
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Question 3: SSH Configuration
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;sshconfig.sh&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# sshconfig.sh&lt;/span&gt;
&lt;span class="c"&gt;# Purpose: Generate SSH key pair, configure passwordless login, and run non-interactive SSH tasks&lt;/span&gt;
&lt;span class="c"&gt;# Usage: ./sshconfig.sh&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"          SSH CONFIGURATION SCRIPT       "&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;

&lt;span class="c"&gt;# Define the target user and their home directory&lt;/span&gt;
&lt;span class="nv"&gt;TARGET_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"devopsuser"&lt;/span&gt;
&lt;span class="nv"&gt;USER_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/home/&lt;/span&gt;&lt;span class="nv"&gt;$TARGET_USER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;SSH_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USER_HOME&lt;/span&gt;&lt;span class="s2"&gt;/.ssh"&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Step 1: Generate SSH key pair for devopsuser&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[STEP 1] Generating SSH key pair for &lt;/span&gt;&lt;span class="nv"&gt;$TARGET_USER&lt;/span&gt;&lt;span class="s2"&gt;..."&lt;/span&gt;

&lt;span class="c"&gt;# Create .ssh directory inside devopsuser's home if it doesn't exist&lt;/span&gt;
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nv"&gt;$SSH_DIR&lt;/span&gt;

&lt;span class="c"&gt;# Generate RSA key pair with no passphrase (-N "")&lt;/span&gt;
&lt;span class="c"&gt;# -t rsa   → use RSA algorithm&lt;/span&gt;
&lt;span class="c"&gt;# -b 2048  → 2048-bit key strength&lt;/span&gt;
&lt;span class="c"&gt;# -f       → specify the output file path&lt;/span&gt;
&lt;span class="c"&gt;# -N ""    → no passphrase (for automation)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa &lt;span class="nt"&gt;-b&lt;/span&gt; 2048 &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="nv"&gt;$SSH_DIR&lt;/span&gt;/id_rsa &lt;span class="nt"&gt;-N&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TARGET_USER&lt;/span&gt;&lt;span class="s2"&gt;@localhost"&lt;/span&gt;

&lt;span class="c"&gt;# Copy public key to authorized_keys so the user can login with the private key&lt;/span&gt;
&lt;span class="nb"&gt;sudo cat&lt;/span&gt; &lt;span class="nv"&gt;$SSH_DIR&lt;/span&gt;/id_rsa.pub | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nv"&gt;$SSH_DIR&lt;/span&gt;/authorized_keys &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null

&lt;span class="c"&gt;# Set correct permissions — SSH is strict about permissions&lt;/span&gt;
&lt;span class="c"&gt;# 700 = only owner can access the .ssh folder&lt;/span&gt;
&lt;span class="c"&gt;# 600 = only owner can read/write the key files&lt;/span&gt;
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;700 &lt;span class="nv"&gt;$SSH_DIR&lt;/span&gt;
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;600 &lt;span class="nv"&gt;$SSH_DIR&lt;/span&gt;/authorized_keys
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;600 &lt;span class="nv"&gt;$SSH_DIR&lt;/span&gt;/id_rsa
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;644 &lt;span class="nv"&gt;$SSH_DIR&lt;/span&gt;/id_rsa.pub

&lt;span class="c"&gt;# Make devopsuser own all these files&lt;/span&gt;
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; &lt;span class="nv"&gt;$TARGET_USER&lt;/span&gt;:&lt;span class="nv"&gt;$TARGET_USER&lt;/span&gt; &lt;span class="nv"&gt;$SSH_DIR&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] SSH key pair generated and saved to &lt;/span&gt;&lt;span class="nv"&gt;$SSH_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Step 2: Disable password authentication in SSH config&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[STEP 2] Disabling password authentication in /etc/ssh/sshd_config..."&lt;/span&gt;

&lt;span class="c"&gt;# Edit SSH server config to disable password-based login&lt;/span&gt;
&lt;span class="c"&gt;# This forces key-based authentication only&lt;/span&gt;
&lt;span class="nb"&gt;sudo sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/^#PasswordAuthentication yes/PasswordAuthentication no/'&lt;/span&gt; /etc/ssh/sshd_config
&lt;span class="nb"&gt;sudo sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/^PasswordAuthentication yes/PasswordAuthentication no/'&lt;/span&gt; /etc/ssh/sshd_config

&lt;span class="c"&gt;# Also ensure PubkeyAuthentication is enabled&lt;/span&gt;
&lt;span class="nb"&gt;sudo sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/^#PubkeyAuthentication yes/PubkeyAuthentication yes/'&lt;/span&gt; /etc/ssh/sshd_config

&lt;span class="c"&gt;# Restart SSH service to apply changes&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart ssh
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] Password authentication disabled. Key-based auth enabled."&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Step 3: Set up SSH shortcut in ~/.ssh/config&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[STEP 3] Setting up SSH config shortcut..."&lt;/span&gt;

&lt;span class="c"&gt;# Create SSH client config file so user doesn't need to type full username and IP&lt;/span&gt;
&lt;span class="c"&gt;# This allows: ssh devopsserver  instead of: ssh devopsuser@127.0.0.1&lt;/span&gt;
&lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nv"&gt;$SSH_DIR&lt;/span&gt;/config &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
# SSH shortcut configuration for devopsuser
Host devopsserver
    HostName 127.0.0.1
    User &lt;/span&gt;&lt;span class="nv"&gt;$TARGET_USER&lt;/span&gt;&lt;span class="sh"&gt;
    Port 22
    IdentityFile &lt;/span&gt;&lt;span class="nv"&gt;$SSH_DIR&lt;/span&gt;&lt;span class="sh"&gt;/id_rsa
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Fix permissions on config file&lt;/span&gt;
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;600 &lt;span class="nv"&gt;$SSH_DIR&lt;/span&gt;/config
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nv"&gt;$TARGET_USER&lt;/span&gt;:&lt;span class="nv"&gt;$TARGET_USER&lt;/span&gt; &lt;span class="nv"&gt;$SSH_DIR&lt;/span&gt;/config

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] SSH config shortcut created. Use: ssh devopsserver"&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Step 3a: SSH in non-interactive mode and run tasks&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[STEP 3a] Running tasks via non-interactive SSH..."&lt;/span&gt;

&lt;span class="c"&gt;# Task b: Create a test directory inside home directory&lt;/span&gt;
&lt;span class="c"&gt;# -o StrictHostKeyChecking=no → skip host fingerprint prompt (for automation)&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nv"&gt;$TARGET_USER&lt;/span&gt; ssh &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;StrictHostKeyChecking&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nv"&gt;$SSH_DIR&lt;/span&gt;/id_rsa &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;$TARGET_USER&lt;/span&gt;@127.0.0.1 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="s2"&gt;"mkdir -p ~/testdir"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] Test directory 'testdir' created inside &lt;/span&gt;&lt;span class="nv"&gt;$USER_HOME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Task c: Create file and write the required text into it&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nv"&gt;$TARGET_USER&lt;/span&gt; ssh &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;StrictHostKeyChecking&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nv"&gt;$SSH_DIR&lt;/span&gt;/id_rsa &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;$TARGET_USER&lt;/span&gt;@127.0.0.1 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="s2"&gt;"echo 'I am doing the task3.' &amp;gt; ~/testdir/filecreatedinnoninteractivemode.txt"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] File 'filecreatedinnoninteractivemode.txt' created with required content."&lt;/span&gt;

&lt;span class="c"&gt;# Verify the file contents&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"--- Verification: File Contents ---"&lt;/span&gt;
&lt;span class="nb"&gt;sudo cat&lt;/span&gt; &lt;span class="nv"&gt;$USER_HOME&lt;/span&gt;/testdir/filecreatedinnoninteractivemode.txt

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"     SSH CONFIGURATION COMPLETE          "&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Make executable and run:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x sshconfig.sh
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./sshconfig.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Question 4: File and Directory Manipulation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;filedir.sh&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# filedir.sh&lt;/span&gt;
&lt;span class="c"&gt;# Purpose: Create directory, file, write content, and set correct permissions&lt;/span&gt;
&lt;span class="c"&gt;# Usage: ./filedir.sh&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"     FILE AND DIRECTORY MANIPULATION     "&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;

&lt;span class="c"&gt;# Step 1: Create the directory /devopsdir&lt;/span&gt;
&lt;span class="c"&gt;# -p flag prevents error if directory already exists&lt;/span&gt;
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /devopsdir
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] Directory '/devopsdir' created."&lt;/span&gt;

&lt;span class="c"&gt;# Step 2: Create file inside /devopsdir and write the required text&lt;/span&gt;
&lt;span class="c"&gt;# Using tee with sudo so we can write to the protected /devopsdir&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"AoA, Hello DevOps!"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /devopsdir/devopsfile.txt &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] File 'devopsfile.txt' created with content: 'AoA, Hello DevOps!'"&lt;/span&gt;

&lt;span class="c"&gt;# Step 3: Set permissions for devopsuser and other users&lt;/span&gt;
&lt;span class="c"&gt;# We need to set:&lt;/span&gt;
&lt;span class="c"&gt;#   - devopsuser → rw- on the file (read + write) → 6&lt;/span&gt;
&lt;span class="c"&gt;#   - devopsuser → rwx on the directory (read + write + execute) → 7&lt;/span&gt;
&lt;span class="c"&gt;#   - Others     → r-- on the file (read only) → 4&lt;/span&gt;
&lt;span class="c"&gt;#   - Others     → r-- on the directory (read only) → 4&lt;/span&gt;

&lt;span class="c"&gt;# Change owner of /devopsdir and its contents to devopsuser&lt;/span&gt;
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; devopsuser:devopsuser /devopsdir

&lt;span class="c"&gt;# Set permissions on the directory: rwxr--r-- (744)&lt;/span&gt;
&lt;span class="c"&gt;# devopsuser: rwx (7), group: r-- (4), others: r-- (4)&lt;/span&gt;
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;744 /devopsdir

&lt;span class="c"&gt;# Set permissions on the file: rw-r--r-- (644)&lt;/span&gt;
&lt;span class="c"&gt;# devopsuser: rw- (6), group: r-- (4), others: r-- (4)&lt;/span&gt;
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;644 /devopsdir/devopsfile.txt

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] Permissions set:"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  /devopsdir       → 744 (devopsuser: rwx, others: r--)"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  devopsfile.txt   → 644 (devopsuser: rw-, others: r--)"&lt;/span&gt;

&lt;span class="c"&gt;# Verify — display the final permissions&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"--- Verification ---"&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-ld&lt;/span&gt; /devopsdir
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; /devopsdir/devopsfile.txt
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"--- File Content ---"&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /devopsdir/devopsfile.txt

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Make executable and run:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x filedir.sh
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./filedir.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Expected Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=========================================
     FILE AND DIRECTORY MANIPULATION
=========================================
[SUCCESS] Directory '/devopsdir' created.
[SUCCESS] File 'devopsfile.txt' created with content: 'AoA, Hello DevOps!'
[SUCCESS] Permissions set:
  /devopsdir       → 744 (devopsuser: rwx, others: r--)
  devopsfile.txt   → 644 (devopsuser: rw-, others: r--)

--- Verification ---
drwxr--r-- 2 devopsuser devopsuser 4096 Mar 15 12:00 /devopsdir
-rw-r--r-- 1 devopsuser devopsuser   19 Mar 15 12:00 /devopsdir/devopsfile.txt

--- File Content ---
AoA, Hello DevOps!
=========================================
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Question 5: Backup Script
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;backup.sh&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# backup.sh&lt;/span&gt;
&lt;span class="c"&gt;# Purpose: Compress /devopsdir into a timestamped tarball and save to devopsuser's backup folder&lt;/span&gt;
&lt;span class="c"&gt;# Usage: ./backup.sh&lt;/span&gt;
&lt;span class="c"&gt;# Bonus: Also sets up a cron job to run this backup every 10 minutes&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"            BACKUP SCRIPT                "&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;

&lt;span class="c"&gt;# Define variables&lt;/span&gt;
&lt;span class="nv"&gt;SOURCE_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/devopsdir"&lt;/span&gt;                            &lt;span class="c"&gt;# Directory to back up&lt;/span&gt;
&lt;span class="nv"&gt;BACKUP_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/home/devopsuser/backup"&lt;/span&gt;               &lt;span class="c"&gt;# Where to save backups&lt;/span&gt;
&lt;span class="nv"&gt;TIMESTAMP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +&lt;span class="s2"&gt;"%Y-%m-%d_%H-%M-%S"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;            &lt;span class="c"&gt;# Unique timestamp: e.g., 2026-03-15_14-30-00&lt;/span&gt;
&lt;span class="nv"&gt;BACKUP_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;&lt;span class="s2"&gt;/devopsdir_backup_&lt;/span&gt;&lt;span class="nv"&gt;$TIMESTAMP&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz"&lt;/span&gt;  &lt;span class="c"&gt;# Full backup filename&lt;/span&gt;

&lt;span class="c"&gt;# Step 1: Create backup directory if it doesn't exist&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] Backup directory: &lt;/span&gt;&lt;span class="nv"&gt;$BACKUP_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Step 2: Check if source directory exists before backing up&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SOURCE_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[ERROR] Source directory '&lt;/span&gt;&lt;span class="nv"&gt;$SOURCE_DIR&lt;/span&gt;&lt;span class="s2"&gt;' does not exist. Exiting."&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Step 3: Create compressed tarball of /devopsdir&lt;/span&gt;
&lt;span class="c"&gt;# -c → create archive&lt;/span&gt;
&lt;span class="c"&gt;# -z → compress with gzip&lt;/span&gt;
&lt;span class="c"&gt;# -f → specify filename&lt;/span&gt;
&lt;span class="c"&gt;# -v → verbose (show files being added)&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-czf&lt;/span&gt; &lt;span class="nv"&gt;$BACKUP_FILE&lt;/span&gt; &lt;span class="nv"&gt;$SOURCE_DIR&lt;/span&gt; 2&amp;gt;/dev/null

&lt;span class="c"&gt;# Step 4: Check if backup was created successfully using exit code $?&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] Backup created: &lt;/span&gt;&lt;span class="nv"&gt;$BACKUP_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] Backup size: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; &lt;span class="nv"&gt;$BACKUP_FILE&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-f1&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[ERROR] Backup failed!"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# BONUS: Set up cron job to run backup every 10 minutes&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[BONUS] Setting up cron job for automatic backup every 10 minutes..."&lt;/span&gt;

&lt;span class="c"&gt;# Get the absolute path of this script&lt;/span&gt;
&lt;span class="nv"&gt;SCRIPT_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;realpath&lt;/span&gt; &lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Add cron job for devopsuser — run backup.sh every 10 minutes&lt;/span&gt;
&lt;span class="c"&gt;# crontab -l lists existing cron jobs&lt;/span&gt;
&lt;span class="c"&gt;# We check first to avoid duplicate entries&lt;/span&gt;
&lt;span class="nv"&gt;CRON_JOB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"*/10 * * * * &lt;/span&gt;&lt;span class="nv"&gt;$SCRIPT_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Check if cron job already exists&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;crontab &lt;span class="nt"&gt;-l&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SCRIPT_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] Cron job already exists. Skipping."&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="o"&gt;(&lt;/span&gt;crontab &lt;span class="nt"&gt;-l&lt;/span&gt; 2&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CRON_JOB&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; | crontab -

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] Cron job set: backup runs every 10 minutes."&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"--- Current Cron Jobs ---"&lt;/span&gt;
crontab &lt;span class="nt"&gt;-l&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Make executable and run:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x backup.sh
./backup.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Expected Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;=========================================&lt;/span&gt;
            BACKUP SCRIPT
&lt;span class="o"&gt;=========================================&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;INFO] Backup directory: /home/devopsuser/backup
&lt;span class="o"&gt;[&lt;/span&gt;SUCCESS] Backup created: /home/devopsuser/backup/devopsdir_backup_2026-03-15_14-30-00.tar.gz
&lt;span class="o"&gt;[&lt;/span&gt;INFO] Backup size: 4.0K

&lt;span class="o"&gt;[&lt;/span&gt;BONUS] Setting up cron job &lt;span class="k"&gt;for &lt;/span&gt;automatic backup every 10 minutes...
&lt;span class="o"&gt;[&lt;/span&gt;SUCCESS] Cron job &lt;span class="nb"&gt;set&lt;/span&gt;: backup runs every 10 minutes.

&lt;span class="nt"&gt;---&lt;/span&gt; Current Cron Jobs &lt;span class="nt"&gt;---&lt;/span&gt;
&lt;span class="k"&gt;*&lt;/span&gt;/10 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; /path/to/backup.sh
&lt;span class="o"&gt;=========================================&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Question 6: System Health Report (40 Marks)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;system_health.sh&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# system_health.sh&lt;/span&gt;
&lt;span class="c"&gt;# Purpose: Collect system health info and generate an HTML report, then host it with nginx&lt;/span&gt;
&lt;span class="c"&gt;# Usage: ./system_health.sh&lt;/span&gt;

&lt;span class="nv"&gt;OUTPUT_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/var/www/html/system_health.html"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"        SYSTEM HEALTH REPORT             "&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Collect: Current Date and Time&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="nv"&gt;CURRENT_DATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="s2"&gt;"+%A, %B %d %Y %I:%M %p"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Collect: Memory Information using free + awk&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;

&lt;span class="c"&gt;# Total memory in MB&lt;/span&gt;
&lt;span class="nv"&gt;TOTAL_MEM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;free &lt;span class="nt"&gt;-m&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^Mem:/ {print $2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Used memory in MB&lt;/span&gt;
&lt;span class="nv"&gt;USED_MEM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;free &lt;span class="nt"&gt;-m&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^Mem:/ {print $3}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Available memory in MB&lt;/span&gt;
&lt;span class="nv"&gt;AVAIL_MEM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;free &lt;span class="nt"&gt;-m&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^Mem:/ {print $7}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Used memory as percentage&lt;/span&gt;
&lt;span class="nv"&gt;USED_MEM_PCT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;free | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^Mem:/ {printf("%.1f", $3/$2 * 100)}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Available memory as percentage&lt;/span&gt;
&lt;span class="nv"&gt;AVAIL_MEM_PCT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;free | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^Mem:/ {printf("%.1f", $7/$2 * 100)}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Total swap memory in MB&lt;/span&gt;
&lt;span class="nv"&gt;TOTAL_SWAP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;free &lt;span class="nt"&gt;-m&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^Swap:/ {print $2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Used swap in MB&lt;/span&gt;
&lt;span class="nv"&gt;USED_SWAP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;free &lt;span class="nt"&gt;-m&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^Swap:/ {print $3}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Used swap as percentage (avoid divide by zero if no swap)&lt;/span&gt;
&lt;span class="nv"&gt;USED_SWAP_PCT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;free | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^Swap:/ { if($2 &amp;gt; 0) printf("%.1f", $3/$2 * 100); else print "0.0" }'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Available swap as percentage&lt;/span&gt;
&lt;span class="nv"&gt;AVAIL_SWAP_PCT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;free | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^Swap:/ { if($2 &amp;gt; 0) printf("%.1f", ($2-$3)/$2 * 100); else print "0.0" }'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Collect: Disk Information using df + awk&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;

&lt;span class="c"&gt;# Total disk space (root partition)&lt;/span&gt;
&lt;span class="nv"&gt;TOTAL_DISK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; / | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'NR==2 {print $2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Used disk space&lt;/span&gt;
&lt;span class="nv"&gt;USED_DISK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; / | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'NR==2 {print $3}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Available disk space&lt;/span&gt;
&lt;span class="nv"&gt;AVAIL_DISK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; / | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'NR==2 {print $4}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# List partitioned disks — exclude tmpfs using awk regex&lt;/span&gt;
&lt;span class="c"&gt;# ^ means starts with, ! negates the match — exclude lines starting with tmpfs&lt;/span&gt;
&lt;span class="nv"&gt;DISK_LIST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'!/^tmpfs/ &amp;amp;&amp;amp; !/^Filesystem/ {print $1, $3, $4}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Write everything into HTML using heredoc&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] Writing HTML report..."&lt;/span&gt;

&lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nv"&gt;$OUTPUT_FILE&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8"&amp;gt;
    &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt;
    &amp;lt;title&amp;gt;System Health Report&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        body {
            font-family: Arial, sans-serif;
            background-color: #1a1a2e;
            color: #e0e0e0;
            margin: 0;
            padding: 20px;
        }
        h1 {
            color: #00d4ff;
            text-align: center;
            border-bottom: 2px solid #00d4ff;
            padding-bottom: 10px;
        }
        h2 {
            color: #00d4ff;
            margin-top: 30px;
        }
        .section {
            background-color: #16213e;
            border-radius: 8px;
            padding: 20px;
            margin: 20px 0;
            border-left: 4px solid #00d4ff;
        }
        table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 10px;
        }
        th {
            background-color: #0f3460;
            color: #00d4ff;
            padding: 10px;
            text-align: left;
        }
        td {
            padding: 8px 10px;
            border-bottom: 1px solid #0f3460;
        }
        tr:hover {
            background-color: #0f3460;
        }
        .date {
            text-align: center;
            font-size: 1.1em;
            color: #aaa;
            margin-bottom: 20px;
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;h1&amp;gt;🖥️ System Health Report&amp;lt;/h1&amp;gt;
&amp;lt;p class="date"&amp;gt;Generated on: &lt;/span&gt;&lt;span class="nv"&gt;$CURRENT_DATE&lt;/span&gt;&lt;span class="sh"&gt;&amp;lt;/p&amp;gt;

&amp;lt;!-- Memory Section --&amp;gt;
&amp;lt;div class="section"&amp;gt;
    &amp;lt;h2&amp;gt;💾 Memory Usage&amp;lt;/h2&amp;gt;
    &amp;lt;table&amp;gt;
        &amp;lt;tr&amp;gt;
            &amp;lt;th&amp;gt;Type&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;Total&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;Used&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;Used %&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;Available %&amp;lt;/th&amp;gt;
        &amp;lt;/tr&amp;gt;
        &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;RAM&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TOTAL_MEM&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt; MB&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USED_MEM&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt; MB&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USED_MEM_PCT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;%&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;AVAIL_MEM_PCT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;%&amp;lt;/td&amp;gt;
        &amp;lt;/tr&amp;gt;
        &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;Swap&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TOTAL_SWAP&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt; MB&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USED_SWAP&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt; MB&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USED_SWAP_PCT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;%&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;AVAIL_SWAP_PCT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;%&amp;lt;/td&amp;gt;
        &amp;lt;/tr&amp;gt;
    &amp;lt;/table&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;!-- Disk Section --&amp;gt;
&amp;lt;div class="section"&amp;gt;
    &amp;lt;h2&amp;gt;💿 Disk Usage&amp;lt;/h2&amp;gt;
    &amp;lt;table&amp;gt;
        &amp;lt;tr&amp;gt;
            &amp;lt;th&amp;gt;Total Space&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;Used&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;Available&amp;lt;/th&amp;gt;
        &amp;lt;/tr&amp;gt;
        &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;$TOTAL_DISK&lt;/span&gt;&lt;span class="sh"&gt;&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;$USED_DISK&lt;/span&gt;&lt;span class="sh"&gt;&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;$AVAIL_DISK&lt;/span&gt;&lt;span class="sh"&gt;&amp;lt;/td&amp;gt;
        &amp;lt;/tr&amp;gt;
    &amp;lt;/table&amp;gt;

    &amp;lt;h2&amp;gt;📂 Partitioned Disks (excluding tmpfs)&amp;lt;/h2&amp;gt;
    &amp;lt;table&amp;gt;
        &amp;lt;tr&amp;gt;
            &amp;lt;th&amp;gt;Disk Name&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;Used&amp;lt;/th&amp;gt;
            &amp;lt;th&amp;gt;Available&amp;lt;/th&amp;gt;
        &amp;lt;/tr&amp;gt;
&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'!/^tmpfs/ &amp;amp;&amp;amp; !/^Filesystem/ {print "&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;"$1"&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;"$3"&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;"$4"&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;"}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;
    &amp;lt;/table&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Host the HTML file using Nginx&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] Setting up Nginx to host the report..."&lt;/span&gt;

&lt;span class="c"&gt;# Install nginx if not already installed&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; nginx &amp;amp;&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Copy report to nginx web root as index.html&lt;/span&gt;
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; &lt;span class="nv"&gt;$OUTPUT_FILE&lt;/span&gt; /var/www/html/index.html

&lt;span class="c"&gt;# Start and enable nginx&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nginx

&lt;span class="c"&gt;# Check if nginx started successfully using exit code&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] System health report is live at: http://localhost"&lt;/span&gt;
&lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[ERROR] Nginx failed to start."&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Make executable and run:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x system_health.sh
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./system_health.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Question 7: LAMP Stack Automation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;bsc-configuring-lamp-environment.sh&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# bsc-configuring-lamp-environment.sh&lt;/span&gt;
&lt;span class="c"&gt;# Purpose: Automate installation and removal of full LAMP stack (Linux, Apache/Nginx, MySQL, PHP)&lt;/span&gt;
&lt;span class="c"&gt;# Usage:&lt;/span&gt;
&lt;span class="c"&gt;#   ./bsc-configuring-lamp-environment.sh -i           → install with default Apache&lt;/span&gt;
&lt;span class="c"&gt;#   ./bsc-configuring-lamp-environment.sh -i -ws Apache → install with Apache&lt;/span&gt;
&lt;span class="c"&gt;#   ./bsc-configuring-lamp-environment.sh -i -ws Nginx  → install with Nginx&lt;/span&gt;
&lt;span class="c"&gt;#   ./bsc-configuring-lamp-environment.sh -d            → delete all LAMP services&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# LOG FILE SETUP&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Create a log file with your registration number in the name&lt;/span&gt;
&lt;span class="nv"&gt;REG_NUMBER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"YOUR_REG_NUMBER"&lt;/span&gt;      &lt;span class="c"&gt;# ← Replace with your actual reg number&lt;/span&gt;
&lt;span class="nv"&gt;LOG_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"lamp-setup-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REG_NUMBER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.log"&lt;/span&gt;

&lt;span class="c"&gt;# Function to write timestamped log entries&lt;/span&gt;
log&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;# Each log entry gets a timestamp like: [2026-03-15 14:30:21] message&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="s1"&gt;'+%Y-%m-%d %H:%M:%S'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;] &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# PARSE COMMAND LINE ARGUMENTS&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="nv"&gt;ACTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;          &lt;span class="c"&gt;# Will be 'install' or 'delete'&lt;/span&gt;
&lt;span class="nv"&gt;WEB_SERVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Apache"&lt;/span&gt; &lt;span class="c"&gt;# Default web server is Apache&lt;/span&gt;

&lt;span class="c"&gt;# Loop through all arguments using getopts&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;getopts&lt;/span&gt; &lt;span class="s2"&gt;":idw:s:"&lt;/span&gt; opt&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    case&lt;/span&gt; &lt;span class="nv"&gt;$opt&lt;/span&gt; &lt;span class="k"&gt;in
        &lt;/span&gt;i&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;ACTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"install"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;       &lt;span class="c"&gt;# -i flag → install&lt;/span&gt;
        d&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;ACTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"delete"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;        &lt;span class="c"&gt;# -d flag → delete&lt;/span&gt;
        w&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;                        &lt;span class="c"&gt;# partial -ws handling&lt;/span&gt;
        s&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;WEB_SERVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OPTARG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;   &lt;span class="c"&gt;# capture Apache or Nginx value&lt;/span&gt;
        ?&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[ERROR] Unknown option: -&lt;/span&gt;&lt;span class="nv"&gt;$OPTARG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1 &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="k"&gt;esac&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# Handle -ws Apache or -ws Nginx as combined argument&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;arg &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$arg&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Apache"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$arg&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Nginx"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nv"&gt;WEB_SERVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$arg&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;fi
done&lt;/span&gt;

&lt;span class="c"&gt;# Validate — must provide either -i or -d&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ACTION&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Usage: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; -i [-ws Apache|Nginx]   → install LAMP"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"       &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; -d                       → delete LAMP"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# FUNCTION: Install Web Server (Apache or Nginx)&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
install_webserver&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    log &lt;span class="s2"&gt;"Starting Web Server installation: &lt;/span&gt;&lt;span class="nv"&gt;$WEB_SERVER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$WEB_SERVER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Apache"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
        &lt;span class="c"&gt;# Check if Apache is already installed&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;dpkg &lt;span class="nt"&gt;-l&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; apache2&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] Apache web server is already installed."&lt;/span&gt;
            &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Do you want to remove it and reinstall? (Y/n): "&lt;/span&gt; CONFIRM
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONFIRM&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Y"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONFIRM&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"y"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
                &lt;/span&gt;log &lt;span class="s2"&gt;"Removing existing Apache installation..."&lt;/span&gt;
                &lt;span class="nb"&gt;sudo &lt;/span&gt;apt remove &lt;span class="nt"&gt;--purge&lt;/span&gt; apache2 &lt;span class="nt"&gt;-y&lt;/span&gt;
                log &lt;span class="s2"&gt;"Apache removed."&lt;/span&gt;
            &lt;span class="k"&gt;else
                &lt;/span&gt;log &lt;span class="s2"&gt;"Skipping Apache reinstall. Continuing..."&lt;/span&gt;
                &lt;span class="k"&gt;return
            fi
        fi&lt;/span&gt;
        &lt;span class="c"&gt;# Install Apache without user interaction&lt;/span&gt;
        log &lt;span class="s2"&gt;"Installing Apache Web Server..."&lt;/span&gt;
        &lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="nt"&gt;-y&lt;/span&gt;
        &lt;span class="nb"&gt;sudo &lt;/span&gt;&lt;span class="nv"&gt;DEBIAN_FRONTEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;noninteractive apt &lt;span class="nb"&gt;install &lt;/span&gt;apache2 &lt;span class="nt"&gt;-y&lt;/span&gt;
        &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start apache2
        &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;apache2
        log &lt;span class="s2"&gt;"Apache Web Server installed and started successfully."&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] Apache installed. Visit http://localhost"&lt;/span&gt;

    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$WEB_SERVER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Nginx"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
        &lt;span class="c"&gt;# Check if Nginx is already installed&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;dpkg &lt;span class="nt"&gt;-l&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; nginx&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] Nginx web server is already installed."&lt;/span&gt;
            &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Do you want to remove it and reinstall? (Y/n): "&lt;/span&gt; CONFIRM
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONFIRM&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Y"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONFIRM&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"y"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
                &lt;/span&gt;log &lt;span class="s2"&gt;"Removing existing Nginx installation..."&lt;/span&gt;
                &lt;span class="nb"&gt;sudo &lt;/span&gt;apt remove &lt;span class="nt"&gt;--purge&lt;/span&gt; nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
                log &lt;span class="s2"&gt;"Nginx removed."&lt;/span&gt;
            &lt;span class="k"&gt;else
                &lt;/span&gt;log &lt;span class="s2"&gt;"Skipping Nginx reinstall. Continuing..."&lt;/span&gt;
                &lt;span class="k"&gt;return
            fi
        fi&lt;/span&gt;
        &lt;span class="c"&gt;# Install Nginx without user interaction&lt;/span&gt;
        log &lt;span class="s2"&gt;"Installing Nginx Web Server..."&lt;/span&gt;
        &lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="nt"&gt;-y&lt;/span&gt;
        &lt;span class="nb"&gt;sudo &lt;/span&gt;&lt;span class="nv"&gt;DEBIAN_FRONTEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;noninteractive apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
        &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nginx
        &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nginx
        log &lt;span class="s2"&gt;"Nginx Web Server installed and started successfully."&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] Nginx installed. Visit http://localhost"&lt;/span&gt;
    &lt;span class="k"&gt;else
        &lt;/span&gt;log &lt;span class="s2"&gt;"[ERROR] Invalid web server: &lt;/span&gt;&lt;span class="nv"&gt;$WEB_SERVER&lt;/span&gt;&lt;span class="s2"&gt;. Choose Apache or Nginx."&lt;/span&gt;
        &lt;span class="nb"&gt;exit &lt;/span&gt;1
    &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# FUNCTION: Install PHP and required modules&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
install_php&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    log &lt;span class="s2"&gt;"Starting PHP installation..."&lt;/span&gt;

    &lt;span class="c"&gt;# Check if PHP is already installed&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; php &amp;amp;&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nv"&gt;PHP_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;php &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"echo PHP_VERSION;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] PHP is already installed. Version: &lt;/span&gt;&lt;span class="nv"&gt;$PHP_VERSION&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        log &lt;span class="s2"&gt;"PHP already installed. Version: &lt;/span&gt;&lt;span class="nv"&gt;$PHP_VERSION&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;return
    fi&lt;/span&gt;

    &lt;span class="c"&gt;# Install PHP with common modules needed for a basic PHP application&lt;/span&gt;
    &lt;span class="c"&gt;# php-mysql     → MySQL support&lt;/span&gt;
    &lt;span class="c"&gt;# php-curl      → HTTP requests&lt;/span&gt;
    &lt;span class="c"&gt;# php-xml       → XML processing&lt;/span&gt;
    &lt;span class="c"&gt;# php-mbstring  → Multibyte string handling&lt;/span&gt;
    &lt;span class="c"&gt;# php-zip       → ZIP file support&lt;/span&gt;
    log &lt;span class="s2"&gt;"Installing PHP and required modules..."&lt;/span&gt;
    &lt;span class="nb"&gt;sudo &lt;/span&gt;&lt;span class="nv"&gt;DEBIAN_FRONTEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;noninteractive apt &lt;span class="nb"&gt;install &lt;/span&gt;php libapache2-mod-php &lt;span class="se"&gt;\&lt;/span&gt;
        php-mysql php-curl php-xml php-mbstring php-zip php-gd &lt;span class="nt"&gt;-y&lt;/span&gt;

    log &lt;span class="s2"&gt;"PHP installed successfully. Version: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;php &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'echo PHP_VERSION;'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] PHP installed. Version: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;php &lt;span class="nt"&gt;--version&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# FUNCTION: Install MySQL and generate root password&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
install_mysql&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    log &lt;span class="s2"&gt;"Starting MySQL installation..."&lt;/span&gt;

    &lt;span class="c"&gt;# Check if MySQL is already installed&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; mysql &amp;amp;&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] MySQL is already installed."&lt;/span&gt;
        log &lt;span class="s2"&gt;"MySQL already installed. Skipping."&lt;/span&gt;
        &lt;span class="k"&gt;return
    fi&lt;/span&gt;

    &lt;span class="c"&gt;# Generate a random root password (16 characters)&lt;/span&gt;
    &lt;span class="nv"&gt;MYSQL_ROOT_PASS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;openssl rand &lt;span class="nt"&gt;-base64&lt;/span&gt; 16&lt;span class="si"&gt;)&lt;/span&gt;

    log &lt;span class="s2"&gt;"Installing MySQL Server..."&lt;/span&gt;
    &lt;span class="c"&gt;# Set root password non-interactively using debconf&lt;/span&gt;
    &lt;span class="nb"&gt;sudo &lt;/span&gt;debconf-set-selections &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;"mysql-server mysql-server/root_password password &lt;/span&gt;&lt;span class="nv"&gt;$MYSQL_ROOT_PASS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;sudo &lt;/span&gt;debconf-set-selections &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;"mysql-server mysql-server/root_password_again password &lt;/span&gt;&lt;span class="nv"&gt;$MYSQL_ROOT_PASS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="nb"&gt;sudo &lt;/span&gt;&lt;span class="nv"&gt;DEBIAN_FRONTEND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;noninteractive apt &lt;span class="nb"&gt;install &lt;/span&gt;mysql-server &lt;span class="nt"&gt;-y&lt;/span&gt;

    &lt;span class="c"&gt;# Start and enable MySQL&lt;/span&gt;
    &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start mysql
    &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;mysql

    log &lt;span class="s2"&gt;"MySQL installed successfully."&lt;/span&gt;

    &lt;span class="c"&gt;# Display the generated password to the user&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  ⚠️  IMPORTANT: SAVE THIS PASSWORD!"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  MySQL Root Password: &lt;/span&gt;&lt;span class="nv"&gt;$MYSQL_ROOT_PASS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
    log &lt;span class="s2"&gt;"MySQL root password generated and displayed to user."&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# FUNCTION: Delete all LAMP services&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
delete_lamp&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    log &lt;span class="s2"&gt;"LAMP stack deletion requested."&lt;/span&gt;

    &lt;span class="c"&gt;# Show serious warning before deleting&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=========================================================="&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  ⚠️  WARNING: You are about to DELETE the LAMP stack!"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  This will remove Apache/Nginx, PHP, and MySQL."&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  ALL DATA WILL BE LOST. Please take a backup first!"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=========================================================="&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;

    &lt;span class="c"&gt;# Ask user to confirm — double confirmation for safety&lt;/span&gt;
    &lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Have you taken a backup? Are you sure you want to continue? (Y/n): "&lt;/span&gt; CONFIRM

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONFIRM&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"Y"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONFIRM&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"y"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] Deletion cancelled. No changes made."&lt;/span&gt;
        log &lt;span class="s2"&gt;"Deletion cancelled by user."&lt;/span&gt;
        &lt;span class="nb"&gt;exit &lt;/span&gt;0
    &lt;span class="k"&gt;fi

    &lt;/span&gt;log &lt;span class="s2"&gt;"User confirmed deletion. Proceeding to remove LAMP stack..."&lt;/span&gt;

    &lt;span class="c"&gt;# Remove Apache if installed&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;dpkg &lt;span class="nt"&gt;-l&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; apache2&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;log &lt;span class="s2"&gt;"Removing Apache..."&lt;/span&gt;
        &lt;span class="nb"&gt;sudo &lt;/span&gt;apt remove &lt;span class="nt"&gt;--purge&lt;/span&gt; apache2 apache2-utils &lt;span class="nt"&gt;-y&lt;/span&gt;
        &lt;span class="nb"&gt;sudo &lt;/span&gt;apt autoremove &lt;span class="nt"&gt;-y&lt;/span&gt;
        log &lt;span class="s2"&gt;"Apache removed."&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] Apache removed."&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;

    &lt;span class="c"&gt;# Remove Nginx if installed&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;dpkg &lt;span class="nt"&gt;-l&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; nginx&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;log &lt;span class="s2"&gt;"Removing Nginx..."&lt;/span&gt;
        &lt;span class="nb"&gt;sudo &lt;/span&gt;apt remove &lt;span class="nt"&gt;--purge&lt;/span&gt; nginx nginx-common &lt;span class="nt"&gt;-y&lt;/span&gt;
        &lt;span class="nb"&gt;sudo &lt;/span&gt;apt autoremove &lt;span class="nt"&gt;-y&lt;/span&gt;
        log &lt;span class="s2"&gt;"Nginx removed."&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] Nginx removed."&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;

    &lt;span class="c"&gt;# Remove PHP and all modules&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; php &amp;amp;&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;log &lt;span class="s2"&gt;"Removing PHP..."&lt;/span&gt;
        &lt;span class="nb"&gt;sudo &lt;/span&gt;apt remove &lt;span class="nt"&gt;--purge&lt;/span&gt; php&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt;
        &lt;span class="nb"&gt;sudo &lt;/span&gt;apt autoremove &lt;span class="nt"&gt;-y&lt;/span&gt;
        log &lt;span class="s2"&gt;"PHP removed."&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] PHP removed."&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;

    &lt;span class="c"&gt;# Remove MySQL&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; mysql &amp;amp;&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;log &lt;span class="s2"&gt;"Removing MySQL..."&lt;/span&gt;
        &lt;span class="nb"&gt;sudo &lt;/span&gt;apt remove &lt;span class="nt"&gt;--purge&lt;/span&gt; mysql-server mysql-client mysql-common &lt;span class="nt"&gt;-y&lt;/span&gt;
        &lt;span class="nb"&gt;sudo &lt;/span&gt;apt autoremove &lt;span class="nt"&gt;-y&lt;/span&gt;
        &lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/mysql /etc/mysql
        log &lt;span class="s2"&gt;"MySQL removed."&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] MySQL removed."&lt;/span&gt;
    &lt;span class="k"&gt;fi

    &lt;/span&gt;log &lt;span class="s2"&gt;"LAMP stack deletion complete."&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] All LAMP services have been removed."&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# MAIN: Execute based on action flag&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
log &lt;span class="s2"&gt;"========= Script started ========="&lt;/span&gt;
log &lt;span class="s2"&gt;"Action: &lt;/span&gt;&lt;span class="nv"&gt;$ACTION&lt;/span&gt;&lt;span class="s2"&gt; | Web Server: &lt;/span&gt;&lt;span class="nv"&gt;$WEB_SERVER&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ACTION&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"install"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] Starting LAMP stack installation..."&lt;/span&gt;
    install_webserver
    install_php
    install_mysql
    log &lt;span class="s2"&gt;"========= LAMP installation complete ========="&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] LAMP stack fully installed!"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  Web Server : &lt;/span&gt;&lt;span class="nv"&gt;$WEB_SERVER&lt;/span&gt;&lt;span class="s2"&gt; → http://localhost"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  PHP        : &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;php &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'echo PHP_VERSION;'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  MySQL      : Running"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  Log file   : &lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ACTION&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"delete"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;delete_lamp
    log &lt;span class="s2"&gt;"========= Script ended ========="&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Make executable and run:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x bsc-configuring-lamp-environment.sh

&lt;span class="c"&gt;# Install with Apache (default)&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./bsc-configuring-lamp-environment.sh &lt;span class="nt"&gt;-i&lt;/span&gt;

&lt;span class="c"&gt;# Install with Nginx&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./bsc-configuring-lamp-environment.sh &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;-ws&lt;/span&gt; Nginx

&lt;span class="c"&gt;# Delete everything&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./bsc-configuring-lamp-environment.sh &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Question 8: Submit Script (10 Marks)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;submit.sh&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# submit.sh&lt;/span&gt;
&lt;span class="c"&gt;# Purpose: Bundle all bash scripts from this assignment into a compressed tarball for submission&lt;/span&gt;
&lt;span class="c"&gt;# Usage: ./submit.sh&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"         ASSIGNMENT SUBMISSION SCRIPT    "&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;

&lt;span class="c"&gt;# Define your registration number — change this to your actual reg number&lt;/span&gt;
&lt;span class="nv"&gt;REG_NUMBER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"YOUR_REG_NUMBER"&lt;/span&gt;

&lt;span class="c"&gt;# Define the output tarball name using reg number&lt;/span&gt;
&lt;span class="nv"&gt;TARBALL_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REG_NUMBER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz"&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Step 1: Find all bash scripts in current directory&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Use *.sh pattern to match ALL bash scripts automatically&lt;/span&gt;
&lt;span class="c"&gt;# This handles any number of scripts without naming them manually&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] Finding all bash scripts..."&lt;/span&gt;
&lt;span class="nv"&gt;SCRIPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.sh 2&amp;gt;/dev/null&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Check if any scripts exist&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SCRIPTS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[ERROR] No .sh files found in current directory!"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] Scripts found:"&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;script &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$SCRIPTS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  - &lt;/span&gt;&lt;span class="nv"&gt;$script&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Step 2: Create compressed tarball of all scripts&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# -c → create&lt;/span&gt;
&lt;span class="c"&gt;# -z → compress with gzip&lt;/span&gt;
&lt;span class="c"&gt;# -v → verbose (show files being added)&lt;/span&gt;
&lt;span class="c"&gt;# -f → output filename&lt;/span&gt;
&lt;span class="c"&gt;# *.sh → pattern matches all shell scripts (no need to name each one!)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] Creating tarball: &lt;/span&gt;&lt;span class="nv"&gt;$TARBALL_NAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-czvf&lt;/span&gt; &lt;span class="nv"&gt;$TARBALL_NAME&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.sh

&lt;span class="c"&gt;# Step 3: Check if tarball was created successfully&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[SUCCESS] Tarball created: &lt;/span&gt;&lt;span class="nv"&gt;$TARBALL_NAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] Size: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; &lt;span class="nv"&gt;$TARBALL_NAME&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-f1&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] Contents:"&lt;/span&gt;
    &lt;span class="c"&gt;# List what's inside the tarball to verify&lt;/span&gt;
    &lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-tzvf&lt;/span&gt; &lt;span class="nv"&gt;$TARBALL_NAME&lt;/span&gt;
&lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[ERROR] Failed to create tarball!"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Step 3: Reminder to upload&lt;/span&gt;
&lt;span class="c"&gt;# -----------------------------------------------&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  ✅ Done! Now upload '&lt;/span&gt;&lt;span class="nv"&gt;$TARBALL_NAME&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"     to Microsoft Teams for submission."&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"========================================="&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Make executable and run:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x submit.sh
./submit.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Expected Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=========================================
         ASSIGNMENT SUBMISSION SCRIPT
=========================================
[INFO] Finding all bash scripts...
[INFO] Scripts found:
  - systeminfo.sh
  - usergroup.sh
  - sshconfig.sh
  - filedir.sh
  - backup.sh
  - system_health.sh
  - bsc-configuring-lamp-environment.sh
  - submit.sh

[INFO] Creating tarball: YOUR_REG_NUMBER.tar.gz
systeminfo.sh
usergroup.sh
...

[SUCCESS] Tarball created: .tar.gz
[INFO] Size: 12K

=========================================
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Make all scripts executable at once
&lt;/h1&gt;

&lt;p&gt;chmod +x *.sh&lt;/p&gt;

&lt;h1&gt;
  
  
  Run in order:
&lt;/h1&gt;

&lt;p&gt;sudo ./systeminfo.sh&lt;br&gt;
sudo ./usergroup.sh&lt;br&gt;
sudo ./sshconfig.sh&lt;br&gt;
sudo ./filedir.sh&lt;br&gt;
./backup.sh&lt;br&gt;
sudo ./system_health.sh&lt;br&gt;
sudo ./bsc-configuring-lamp-environment.sh -i -ws Apache&lt;br&gt;
./submit.sh&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nt"&gt;---&lt;/span&gt;

&lt;span class="c"&gt;## 🔑 Key Commands Used — Quick Reference&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
uname -s          # kernel name&lt;br&gt;
uname -r          # kernel release&lt;br&gt;
uname -p          # processor type&lt;br&gt;
lsb_release -d    # OS name&lt;br&gt;
which        # location of command&lt;br&gt;
whereis      # location + docs of command&lt;/p&gt;

&lt;p&gt;useradd -m -s /bin/bash username    # create user&lt;br&gt;
groupadd groupname                  # create group&lt;br&gt;
usermod -aG groupname username      # add user to group&lt;/p&gt;

&lt;p&gt;ssh-keygen -t rsa -b 2048           # generate RSA key pair&lt;br&gt;
chmod 700 ~/.ssh                    # fix ssh dir permissions&lt;br&gt;
chmod 600 ~/.ssh/authorized_keys    # fix key file permissions&lt;/p&gt;

&lt;p&gt;tar -czf backup.tar.gz /folder      # create compressed backup&lt;br&gt;
tar -tzvf backup.tar.gz             # list contents of tarball&lt;br&gt;
crontab -e                          # edit cron jobs&lt;/p&gt;

&lt;p&gt;free -m                             # memory in MB&lt;br&gt;
df -h                               # disk usage human readable&lt;br&gt;
awk '/^Mem:/ {print $3/$2 * 100}'  # calculate memory percent&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
    </item>
    <item>
      <title>Docker commands</title>
      <dc:creator>methew smith </dc:creator>
      <pubDate>Sun, 15 Mar 2026 01:20:58 +0000</pubDate>
      <link>https://dev.to/methew_smith/docker-commands-1kh</link>
      <guid>https://dev.to/methew_smith/docker-commands-1kh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;A practical, terminal-focused guide covering everything you need to know about web server deployment, Docker containers, GitHub-based hosting, and Bash automation.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📌 Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Hosting Apache2 — Traditional Way&lt;/li&gt;
&lt;li&gt;Hosting Nginx — Traditional Way&lt;/li&gt;
&lt;li&gt;Multiple Static Sites — Virtual Hosts &amp;amp; Server Blocks&lt;/li&gt;
&lt;li&gt;Hosting via Docker&lt;/li&gt;
&lt;li&gt;Clone from GitHub &amp;amp; Host via Docker&lt;/li&gt;
&lt;li&gt;Bash Scripting — Automate Everything&lt;/li&gt;
&lt;li&gt;Docker Cheatsheet&lt;/li&gt;
&lt;li&gt;Key Concepts &amp;amp; Golden Rules&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Hosting Apache2 — Traditional Way
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Install Apache2
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;apache2 &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Start, Enable &amp;amp; Check Status
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start apache2
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;apache2      &lt;span class="c"&gt;# auto-start on reboot&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status apache2      &lt;span class="c"&gt;# check if running&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Web Root — where your files go
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/var/www/html/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deploy your page
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;h1&amp;gt;My Apache Site&amp;lt;/h1&amp;gt;"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /var/www/html/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fix Permissions (always do this!)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/html/
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 755 /var/www/html/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Test config &amp;amp; Reload
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apache2ctl &lt;span class="nt"&gt;-t&lt;/span&gt;          &lt;span class="c"&gt;# test for syntax errors → should say: Syntax OK&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit: &lt;code&gt;http://localhost&lt;/code&gt; ✅&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Hosting Nginx — Traditional Way
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Install Nginx
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deploy your page
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;h1&amp;gt;My Nginx Site&amp;lt;/h1&amp;gt;"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /var/www/html/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Test config &amp;amp; Reload
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;               &lt;span class="c"&gt;# should say: syntax is ok&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Port Conflict — Apache &amp;amp; Nginx both want port 80
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :80            &lt;span class="c"&gt;# see who owns port 80&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop apache2 &lt;span class="c"&gt;# free port 80&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nginx  &lt;span class="c"&gt;# now nginx can start&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Multiple Static Sites
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apache — Virtual Hosts
&lt;/h3&gt;

&lt;p&gt;Each site gets its own folder and config file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 1 — Create site folders&lt;/span&gt;
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /var/www/site1
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /var/www/site2

&lt;span class="c"&gt;# Step 2 — Create HTML pages&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;h1&amp;gt;Site 1&amp;lt;/h1&amp;gt;"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /var/www/site1/index.html
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;h1&amp;gt;Site 2&amp;lt;/h1&amp;gt;"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /var/www/site2/index.html

&lt;span class="c"&gt;# Step 3 — Fix permissions&lt;/span&gt;
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/site1 /var/www/site2
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 755 /var/www/site1 /var/www/site2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create config file for Site 1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/apache2/sites-available/site1.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;VirtualHost&lt;/span&gt;&lt;span class="sr"&gt; *:80&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;ServerName&lt;/span&gt; site1.local
    &lt;span class="nc"&gt;DocumentRoot&lt;/span&gt; /var/www/site1
    &lt;span class="nc"&gt;ErrorLog&lt;/span&gt; ${APACHE_LOG_DIR}/site1_error.log
    &lt;span class="nc"&gt;CustomLog&lt;/span&gt; ${APACHE_LOG_DIR}/site1_access.log combined
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;VirtualHost&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create config file for Site 2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/apache2/sites-available/site2.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;VirtualHost&lt;/span&gt;&lt;span class="sr"&gt; *:80&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;ServerName&lt;/span&gt; site2.local
    &lt;span class="nc"&gt;DocumentRoot&lt;/span&gt; /var/www/site2
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;VirtualHost&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable both sites:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;a2ensite site1.conf
&lt;span class="nb"&gt;sudo &lt;/span&gt;a2ensite site2.conf
&lt;span class="nb"&gt;sudo &lt;/span&gt;a2dissite 000-default.conf    &lt;span class="c"&gt;# disable default site&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add fake DNS to &lt;code&gt;/etc/hosts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/hosts
&lt;span class="c"&gt;# Add these lines:&lt;/span&gt;
127.0.0.1   site1.local
127.0.0.1   site2.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit &lt;code&gt;http://site1.local&lt;/code&gt; and &lt;code&gt;http://site2.local&lt;/code&gt; ✅&lt;/p&gt;




&lt;h3&gt;
  
  
  Nginx — Server Blocks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /var/www/site1 /var/www/site2
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;h1&amp;gt;Nginx Site 1&amp;lt;/h1&amp;gt;"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /var/www/site1/index.html
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;h1&amp;gt;Nginx Site 2&amp;lt;/h1&amp;gt;"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /var/www/site2/index.html
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/site1 /var/www/site2
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 755 /var/www/site1 /var/www/site2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create config for Site 1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/nginx/sites-available/site1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;site1.local&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/var/www/site1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable sites using symlinks (no &lt;code&gt;a2ensite&lt;/code&gt; in Nginx!):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/nginx/sites-available/site1 /etc/nginx/sites-enabled/
&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/nginx/sites-available/site2 /etc/nginx/sites-enabled/
&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Difference:&lt;/strong&gt; Apache uses &lt;code&gt;a2ensite&lt;/code&gt; command. Nginx uses manual &lt;code&gt;ln -s&lt;/code&gt; symlinks.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. Hosting via Docker
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Nginx via Docker — Single Site
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Pull image&lt;/span&gt;
docker pull nginx

&lt;span class="c"&gt;# Run with port mapping&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="nt"&gt;--name&lt;/span&gt; mysite nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit &lt;code&gt;http://localhost:8080&lt;/code&gt; ✅&lt;/p&gt;

&lt;h3&gt;
  
  
  Host your own HTML file inside Docker
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;h1&amp;gt;Hello Docker!&amp;lt;/h1&amp;gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; index.html

docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; mysite &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/index.html:/usr/share/nginx/html/index.html &lt;span class="se"&gt;\&lt;/span&gt;
  nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Nginx's web root inside Docker is &lt;code&gt;/usr/share/nginx/html/&lt;/code&gt; — NOT &lt;code&gt;/var/www/html/&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Apache via Docker
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull ubuntu/apache2
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; webserver &lt;span class="nt"&gt;-p&lt;/span&gt; 8081:80 ubuntu/apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Multiple Sites via Docker (different ports)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;site1 site2
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;h1&amp;gt;Site 1&amp;lt;/h1&amp;gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; site1/index.html
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;h1&amp;gt;Site 2&amp;lt;/h1&amp;gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; site2/index.html

docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; site1 &lt;span class="nt"&gt;-p&lt;/span&gt; 8081:80 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/site1/index.html:/usr/share/nginx/html/index.html nginx

docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; site2 &lt;span class="nt"&gt;-p&lt;/span&gt; 8082:80 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/site2/index.html:/usr/share/nginx/html/index.html nginx

docker ps    &lt;span class="c"&gt;# verify both running&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit &lt;code&gt;http://localhost:8081&lt;/code&gt; and &lt;code&gt;http://localhost:8082&lt;/code&gt; ✅&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Clone from GitHub &amp;amp; Host via Docker
&lt;/h2&gt;

&lt;p&gt;This is the real-world DevOps workflow — pull code from GitHub, host it instantly with Docker.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method 1 — Clone &amp;amp; Mount with Docker
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 1 — Clone your static site from GitHub&lt;/span&gt;
git clone https://github.com/yourusername/your-static-site.git
&lt;span class="nb"&gt;cd &lt;/span&gt;your-static-site

&lt;span class="c"&gt;# Step 2 — Run Nginx container with your cloned folder mounted&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; myapp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/usr/share/nginx/html &lt;span class="se"&gt;\&lt;/span&gt;
  nginx

&lt;span class="c"&gt;# Step 3 — Verify&lt;/span&gt;
docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit &lt;code&gt;http://localhost:8080&lt;/code&gt; — your GitHub site is live! ✅&lt;/p&gt;

&lt;h3&gt;
  
  
  Method 2 — Clone &amp;amp; Host with Apache
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/yourusername/your-static-site.git
&lt;span class="nb"&gt;cd &lt;/span&gt;your-static-site

docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; apacheapp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 8081:80 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/var/www/html &lt;span class="se"&gt;\&lt;/span&gt;
  ubuntu/apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key difference:&lt;/strong&gt; Apache Docker container uses &lt;code&gt;/var/www/html&lt;/code&gt; as web root, Nginx uses &lt;code&gt;/usr/share/nginx/html&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Method 3 — Clone &amp;amp; Host Normally (Without Docker)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone repo&lt;/span&gt;
git clone https://github.com/yourusername/your-site.git

&lt;span class="c"&gt;# Copy files to Apache/Nginx web root&lt;/span&gt;
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; your-site/&lt;span class="k"&gt;*&lt;/span&gt; /var/www/html/

&lt;span class="c"&gt;# Fix permissions&lt;/span&gt;
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/html/
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 755 /var/www/html/

&lt;span class="c"&gt;# Reload server&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload apache2
&lt;span class="c"&gt;# OR&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Bash Scripting — Automate Everything
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Script Skeleton (always start with this)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Description: What this script does&lt;/span&gt;
&lt;span class="c"&gt;# Usage: ./script.sh &amp;lt;argument&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;# your code here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make it executable and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x script.sh
./script.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Variables &amp;amp; User Input
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Daniyal"&lt;/span&gt;             &lt;span class="c"&gt;# variable — NO spaces around =&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Hello &lt;/span&gt;&lt;span class="nv"&gt;$NAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Enter site name: "&lt;/span&gt; SITE    &lt;span class="c"&gt;# get input from user&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"You entered: &lt;/span&gt;&lt;span class="nv"&gt;$SITE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Special Variables
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;First argument passed to script&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Second argument&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Total number of arguments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$@&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All arguments as list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$?&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Exit code of last command (0=success)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./deploy.sh site1 8080
&lt;span class="c"&gt;# $1 = site1, $2 = 8080, $# = 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  If / Else
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Error: No argument given"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Usage: ./script.sh &amp;lt;sitename&amp;gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi

if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"File exists"&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"It is a directory"&lt;/span&gt;
&lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Not found"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Case Statement — Handle Flags
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
  &lt;span class="nt"&gt;--install&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing..."&lt;/span&gt;
    &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
    &lt;span class="p"&gt;;;&lt;/span&gt;
  &lt;span class="nt"&gt;--remove&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Removing..."&lt;/span&gt;
    &lt;span class="nb"&gt;sudo &lt;/span&gt;apt remove nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
    &lt;span class="p"&gt;;;&lt;/span&gt;
  &lt;span class="nt"&gt;--status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status nginx
    &lt;span class="p"&gt;;;&lt;/span&gt;
  &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Usage: ./script.sh --install | --remove | --status"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
    &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  For Loop
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Loop over numbers&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in &lt;/span&gt;1 2 3 4 5&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Number: &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# Loop over sites and create folders&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;site &lt;span class="k"&gt;in &lt;/span&gt;site1 site2 site3&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /var/www/&lt;span class="nv"&gt;$site&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;h1&amp;gt;Welcome to &lt;/span&gt;&lt;span class="nv"&gt;$site&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/h1&amp;gt;"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /var/www/&lt;span class="nv"&gt;$site&lt;/span&gt;/index.html
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Created &lt;/span&gt;&lt;span class="nv"&gt;$site&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Heredoc — Write Multi-line Files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Normal folder (no sudo needed)&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; index.html &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Protected folder — use sudo tee&lt;/span&gt;
&lt;span class="nb"&gt;sudo tee&lt;/span&gt; /var/www/html/index.html &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;Hello World&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Redirect Operators
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; file.txt       &lt;span class="c"&gt;# write (overwrite)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; file.txt      &lt;span class="c"&gt;# append&lt;/span&gt;
&lt;span class="nb"&gt;command&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee &lt;/span&gt;file.txt   &lt;span class="c"&gt;# pipe to tee (for protected files)&lt;/span&gt;
./script.sh &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; output.log 2&amp;gt;&amp;amp;1 &lt;span class="c"&gt;# redirect stdout AND stderr to file&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Full Script — Auto Deploy Site from GitHub
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# deploy.sh — Clone from GitHub and host with Docker&lt;/span&gt;

&lt;span class="nv"&gt;REPO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;span class="nv"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;8080&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;      &lt;span class="c"&gt;# default port 8080 if not given&lt;/span&gt;
&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;mysite&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;    &lt;span class="c"&gt;# default name mysite if not given&lt;/span&gt;

&lt;span class="c"&gt;# Validate input&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Usage: ./deploy.sh &amp;lt;github-repo-url&amp;gt; [port] [container-name]"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Cloning repo..."&lt;/span&gt;
git clone &lt;span class="nv"&gt;$REPO&lt;/span&gt; site_files

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Starting Docker container on port &lt;/span&gt;&lt;span class="nv"&gt;$PORT&lt;/span&gt;&lt;span class="s2"&gt;..."&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="nv"&gt;$NAME&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nv"&gt;$PORT&lt;/span&gt;:80 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/site_files:/usr/share/nginx/html &lt;span class="se"&gt;\&lt;/span&gt;
    nginx

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Done! Visit http://localhost:&lt;/span&gt;&lt;span class="nv"&gt;$PORT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
docker ps | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nv"&gt;$NAME&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x deploy.sh
./deploy.sh https://github.com/user/mysite.git 8081 coolsite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Full Script — Setup Apache Virtual Host
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# setup_vhost.sh — Create Apache virtual host&lt;/span&gt;

&lt;span class="nv"&gt;SITE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SITE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Usage: ./setup_vhost.sh &amp;lt;sitename&amp;gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Creating directory..."&lt;/span&gt;
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /var/www/&lt;span class="nv"&gt;$SITE&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Creating HTML page..."&lt;/span&gt;
&lt;span class="nb"&gt;sudo tee&lt;/span&gt; /var/www/&lt;span class="nv"&gt;$SITE&lt;/span&gt;/index.html &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;Welcome to &lt;/span&gt;&lt;span class="nv"&gt;$SITE&lt;/span&gt;&lt;span class="sh"&gt;&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Setting permissions..."&lt;/span&gt;
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/&lt;span class="nv"&gt;$SITE&lt;/span&gt;
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 755 /var/www/&lt;span class="nv"&gt;$SITE&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Creating Virtual Host config..."&lt;/span&gt;
&lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apache2/sites-available/&lt;span class="nv"&gt;$SITE&lt;/span&gt;.conf &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
&amp;lt;VirtualHost *:80&amp;gt;
    ServerName &lt;/span&gt;&lt;span class="nv"&gt;$SITE&lt;/span&gt;&lt;span class="sh"&gt;.local
    DocumentRoot /var/www/&lt;/span&gt;&lt;span class="nv"&gt;$SITE&lt;/span&gt;&lt;span class="sh"&gt;
    ErrorLog &lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="sh"&gt;{APACHE_LOG_DIR}/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SITE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;_error.log
    CustomLog &lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="sh"&gt;{APACHE_LOG_DIR}/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SITE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;_access.log combined
&amp;lt;/VirtualHost&amp;gt;
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Enabling site..."&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;a2ensite &lt;span class="nv"&gt;$SITE&lt;/span&gt;.conf
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload apache2

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Adding to /etc/hosts..."&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"127.0.0.1   &lt;/span&gt;&lt;span class="nv"&gt;$SITE&lt;/span&gt;&lt;span class="s2"&gt;.local"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; /etc/hosts

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Done! Visit http://&lt;/span&gt;&lt;span class="nv"&gt;$SITE&lt;/span&gt;&lt;span class="s2"&gt;.local"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Docker Cheatsheet
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Images
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull nginx              &lt;span class="c"&gt;# download image&lt;/span&gt;
docker pull ubuntu:22.04       &lt;span class="c"&gt;# specific version/tag&lt;/span&gt;
docker images                  &lt;span class="c"&gt;# list all downloaded images&lt;/span&gt;
docker rmi nginx               &lt;span class="c"&gt;# remove image&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Containers — Run
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run nginx                          &lt;span class="c"&gt;# basic run&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; nginx                       &lt;span class="c"&gt;# detached (background)&lt;/span&gt;
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; ubuntu bash                &lt;span class="c"&gt;# interactive shell&lt;/span&gt;
docker run &lt;span class="nt"&gt;--name&lt;/span&gt; mysite nginx            &lt;span class="c"&gt;# with custom name&lt;/span&gt;
docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 nginx               &lt;span class="c"&gt;# port mapping HOST:CONTAINER&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="nt"&gt;--name&lt;/span&gt; s nginx   &lt;span class="c"&gt;# all combined&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; nginx                     &lt;span class="c"&gt;# auto-remove when stopped&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Volume Mount
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Mount a single file&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/index.html:/usr/share/nginx/html/index.html &lt;span class="se"&gt;\&lt;/span&gt;
  nginx

&lt;span class="c"&gt;# Mount entire folder&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/mysite:/usr/share/nginx/html &lt;span class="se"&gt;\&lt;/span&gt;
  nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Containers — Manage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps                      &lt;span class="c"&gt;# running containers&lt;/span&gt;
docker ps &lt;span class="nt"&gt;-a&lt;/span&gt;                   &lt;span class="c"&gt;# all containers (including stopped)&lt;/span&gt;
docker stop mysite             &lt;span class="c"&gt;# stop container&lt;/span&gt;
docker start mysite            &lt;span class="c"&gt;# start stopped container&lt;/span&gt;
docker &lt;span class="nb"&gt;rm &lt;/span&gt;mysite               &lt;span class="c"&gt;# remove container&lt;/span&gt;
docker logs mysite             &lt;span class="c"&gt;# view logs&lt;/span&gt;
docker inspect mysite          &lt;span class="c"&gt;# detailed info&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enter a Running Container
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; mysite bash    &lt;span class="c"&gt;# open NEW shell (safe — exit won't stop container)&lt;/span&gt;
docker attach mysite           &lt;span class="c"&gt;# attach to main process (exit WILL stop container)&lt;/span&gt;
                               &lt;span class="c"&gt;# safe detach: CTRL+P+Q&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cleanup — All at Once
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker stop &lt;span class="si"&gt;$(&lt;/span&gt;docker ps &lt;span class="nt"&gt;-q&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;    &lt;span class="c"&gt;# stop ALL running containers&lt;/span&gt;
docker &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;docker ps &lt;span class="nt"&gt;-aq&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;     &lt;span class="c"&gt;# remove ALL containers&lt;/span&gt;
docker rmi &lt;span class="si"&gt;$(&lt;/span&gt;docker images &lt;span class="nt"&gt;-q&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="c"&gt;# remove ALL images&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Useful Flags Reference
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flag&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Detached — run in background&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-it&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Interactive + TTY — go inside container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-p 8080:80&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Port map host:container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-v path:path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Volume mount local:container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Give container a name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--rm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Auto-remove container when it exits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  8. Key Concepts &amp;amp; Golden Rules
&lt;/h2&gt;

&lt;h3&gt;
  
  
  File Locations — Never Forget
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Apache web root&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/var/www/html/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nginx web root&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/var/www/html/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nginx Docker web root&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/usr/share/nginx/html/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apache sites config&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/etc/apache2/sites-available/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nginx sites config&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/etc/nginx/sites-available/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apache enabled sites&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/etc/apache2/sites-enabled/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nginx enabled sites&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/etc/nginx/sites-enabled/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH config file&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH keys folder&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.ssh/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public key destination&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fake DNS file&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/etc/hosts&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Permissions — The Rules
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;755   &lt;span class="c"&gt;# directories  → owner:rwx  group:r-x  others:r-x&lt;/span&gt;
644   &lt;span class="c"&gt;# files        → owner:rw-  group:r--  others:r--&lt;/span&gt;
600   &lt;span class="c"&gt;# private keys → owner:rw-  group:---  others:---&lt;/span&gt;
777   &lt;span class="c"&gt;# ❌ NEVER USE — anyone can write/execute = security risk&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/html/   &lt;span class="c"&gt;# fix ownership&lt;/span&gt;
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 755 /var/www/html/                 &lt;span class="c"&gt;# fix permissions&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  systemctl Commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start apache2      &lt;span class="c"&gt;# start now&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop apache2       &lt;span class="c"&gt;# stop now&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart apache2    &lt;span class="c"&gt;# stop + start (brief downtime)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload apache2     &lt;span class="c"&gt;# apply config changes gracefully (no downtime)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;apache2     &lt;span class="c"&gt;# auto-start on reboot&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status apache2     &lt;span class="c"&gt;# check if running&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Apache vs Nginx — Quick Comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Apache&lt;/th&gt;
&lt;th&gt;Nginx&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Install&lt;/td&gt;
&lt;td&gt;&lt;code&gt;apt install apache2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;apt install nginx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enable site&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a2ensite site.conf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ln -s sites-available/x sites-enabled/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disable site&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a2dissite site.conf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rm /etc/nginx/sites-enabled/x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test config&lt;/td&gt;
&lt;td&gt;&lt;code&gt;apache2ctl -t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nginx -t&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config folder&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/etc/apache2/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/etc/nginx/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default port&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker image&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ubuntu/apache2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nginx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Pipe vs Redirect — Common Mistakes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# WRONG ❌ — &amp;gt;&amp;gt; is for files, not commands&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /var/www/html/index.html

&lt;span class="c"&gt;# CORRECT ✅ — use pipe | before sudo tee&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /var/www/html/index.html

&lt;span class="c"&gt;# CORRECT ✅ — append mode with sudo tee -a&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; /var/www/html/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Docker: attach vs exec
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# attach — connects to main process&lt;/span&gt;
&lt;span class="c"&gt;# ⚠️  typing "exit" STOPS the container&lt;/span&gt;
docker attach mycontainer
&lt;span class="c"&gt;# Safe way to leave: CTRL+P+Q&lt;/span&gt;

&lt;span class="c"&gt;# exec — opens a NEW shell&lt;/span&gt;
&lt;span class="c"&gt;# ✅ typing "exit" is completely safe, container keeps running&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; mycontainer bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  GitHub + Docker — The DevOps Workflow
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub Repo  →  git clone  →  Docker container  →  Live website
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/user/repo.git
&lt;span class="nb"&gt;cd &lt;/span&gt;repo
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/usr/share/nginx/html nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. 3 commands. Site is live. ✅&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Quick Reference Card
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Apache — install, start, deploy&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;apache2 &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start apache2 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;apache2
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;h1&amp;gt;Hello&amp;lt;/h1&amp;gt;"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /var/www/html/index.html
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/html/ &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 755 /var/www/html/

&lt;span class="c"&gt;# Nginx — install, start, deploy&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nginx &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nginx

&lt;span class="c"&gt;# Docker — nginx with your file&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/index.html:/usr/share/nginx/html/index.html nginx

&lt;span class="c"&gt;# Docker — clone from github and host&lt;/span&gt;
git clone &amp;lt;repo-url&amp;gt; site &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/site:/usr/share/nginx/html nginx

&lt;span class="c"&gt;# Docker — cleanup everything&lt;/span&gt;
docker stop &lt;span class="si"&gt;$(&lt;/span&gt;docker ps &lt;span class="nt"&gt;-q&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;docker ps &lt;span class="nt"&gt;-aq&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Written for CS316 DevOps — Practical Lab Reference Guide&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Topics: Apache2 | Nginx | Docker | Bash Scripting | GitHub Deployment&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>linux</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>basic OS commands</title>
      <dc:creator>methew smith </dc:creator>
      <pubDate>Sat, 14 Mar 2026 22:12:18 +0000</pubDate>
      <link>https://dev.to/methew_smith/basic-os-commands-3mga</link>
      <guid>https://dev.to/methew_smith/basic-os-commands-3mga</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Focus:&lt;/strong&gt; Terminal-first, step-by-step command explanations for practical exam prep&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Linux Basics &amp;amp; File System&lt;/li&gt;
&lt;li&gt;Linux Commands &amp;amp; Navigation&lt;/li&gt;
&lt;li&gt;File Permissions &amp;amp; Ownership&lt;/li&gt;
&lt;li&gt;Users &amp;amp; Groups Management&lt;/li&gt;
&lt;li&gt;SSH (Secure Shell)&lt;/li&gt;
&lt;li&gt;Apache Web Server&lt;/li&gt;
&lt;li&gt;Nginx Web Server&lt;/li&gt;
&lt;li&gt;Port Debugging &amp;amp; Troubleshooting&lt;/li&gt;
&lt;li&gt;Bash Scripting&lt;/li&gt;
&lt;li&gt;Docker Containers&lt;/li&gt;
&lt;li&gt;Lab Exercises Summary&lt;/li&gt;
&lt;li&gt;Quick Reference Cheat Sheet&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. Linux Basics &amp;amp; File System
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is Linux?
&lt;/h3&gt;

&lt;p&gt;Linux is an open-source operating system kernel. A &lt;strong&gt;Linux Distribution&lt;/strong&gt; (distro) is a collection of software built around the Linux kernel, all licensed under open-source or GPL. &lt;strong&gt;90% of all cloud infrastructure is powered by Linux&lt;/strong&gt;, making it the foundation of DevOps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Linux Distributions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Debian-based&lt;/strong&gt;: Ubuntu, Debian — use &lt;code&gt;.deb&lt;/code&gt; packages and &lt;code&gt;apt&lt;/code&gt; package manager&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Red Hat-based&lt;/strong&gt;: CentOS, Fedora, RHEL — use &lt;code&gt;.rpm&lt;/code&gt; packages and &lt;code&gt;yum/dnf&lt;/code&gt; package manager&lt;/li&gt;
&lt;li&gt;Technical differences are mainly about package management, software versions, and file locations&lt;/li&gt;
&lt;li&gt;Once you grasp those differences, switching between distros becomes painless&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Choosing a Distribution — Key Questions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What is the main function? (Server or Desktop?)&lt;/li&gt;
&lt;li&gt;What packages are important? (web server, database, etc.)&lt;/li&gt;
&lt;li&gt;How much disk space is available?&lt;/li&gt;
&lt;li&gt;How often are packages updated?&lt;/li&gt;
&lt;li&gt;How long is the support cycle? (LTS = Long Term Support)&lt;/li&gt;
&lt;li&gt;Do you need long-term stability or cutting-edge software?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Package Management (apt — Debian/Ubuntu)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt update                    &lt;span class="c"&gt;# Update the package index (local DB of available repos)&lt;/span&gt;
apt upgrade                   &lt;span class="c"&gt;# Upgrade installed packages to latest versions&lt;/span&gt;
apt &lt;span class="nb"&gt;install&lt;/span&gt; &amp;lt;pkg_name&amp;gt;        &lt;span class="c"&gt;# Install a package&lt;/span&gt;
apt remove &amp;lt;pkg_name&amp;gt;         &lt;span class="c"&gt;# Remove a package&lt;/span&gt;
apt search &amp;lt;pkg_name&amp;gt;         &lt;span class="c"&gt;# Search for a package&lt;/span&gt;
apt show &amp;lt;pkg_name&amp;gt;           &lt;span class="c"&gt;# Show package details&lt;/span&gt;
apt list &lt;span class="nt"&gt;--installed&lt;/span&gt;          &lt;span class="c"&gt;# List all installed packages&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔥 EXAM TIP:&lt;/strong&gt; Always run &lt;code&gt;apt update&lt;/code&gt; BEFORE &lt;code&gt;apt install&lt;/code&gt;. Update refreshes the package list, upgrade actually updates the software.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Linux File System Hierarchy
&lt;/h3&gt;

&lt;p&gt;Linux organizes everything in a tree structure starting from &lt;code&gt;/&lt;/code&gt; (root):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Directory&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Root — top of the entire filesystem tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/home&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User home directories (e.g., &lt;code&gt;/home/daniyal&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;System configuration files (ssh config, apache config, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Variable data — logs (&lt;code&gt;/var/log&lt;/code&gt;), web files (&lt;code&gt;/var/www&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/usr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User programs and utilities (&lt;code&gt;/usr/bin&lt;/code&gt;, &lt;code&gt;/usr/lib&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/bin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Essential command binaries (&lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;cp&lt;/code&gt;, &lt;code&gt;mv&lt;/code&gt;, &lt;code&gt;cat&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/sbin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;System binaries (&lt;code&gt;systemctl&lt;/code&gt;, &lt;code&gt;fdisk&lt;/code&gt;) — need root&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/tmp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Temporary files — cleared on reboot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/opt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Optional/third-party software&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/root&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Home directory of the root user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/dev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Device files (hardware represented as files)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/proc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Virtual filesystem — running process info&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔥 EXAM TIP:&lt;/strong&gt; Know these paths by heart: &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;, &lt;code&gt;/var/www/html&lt;/code&gt;, &lt;code&gt;/var/log/apache2/&lt;/code&gt;, &lt;code&gt;/etc/apache2/sites-available/&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  OS and Kernel Information
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt;              &lt;span class="c"&gt;# Full system info (kernel name, version, architecture)&lt;/span&gt;
lsb_release &lt;span class="nt"&gt;-a&lt;/span&gt;        &lt;span class="c"&gt;# Distribution-specific info&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/os-release   &lt;span class="c"&gt;# OS release details&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Linux Commands &amp;amp; Navigation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Command Structure
&lt;/h3&gt;

&lt;p&gt;A Linux command has three parts: &lt;code&gt;command [options] [arguments]&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; devops_course_outline.txt
&lt;span class="c"&gt;#  ^    ^    ^&lt;/span&gt;
&lt;span class="c"&gt;#  |    |    +-- argument (what to operate on)&lt;/span&gt;
&lt;span class="c"&gt;#  |    +------- option (modifies behavior, starts with - or --)&lt;/span&gt;
&lt;span class="c"&gt;#  +------------ command (program to execute)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The sudo Command
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;sudo&lt;/code&gt; (superuser do) lets you run commands with root (administrator) privileges:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /root      &lt;span class="c"&gt;# List root's home directory with elevated privileges&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx  &lt;span class="c"&gt;# Install software (needs root)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Directory Navigation
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pwd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Print current working directory&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pwd&lt;/code&gt; → &lt;code&gt;/home/daniyal&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Change directory&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cd /var/www/html&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;cd ~&lt;/code&gt; or &lt;code&gt;cd&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Go to home directory&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cd ~&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cd ..&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go up one level (parent dir)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cd ..&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cd -&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go to previous directory&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cd -&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ls&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List directory contents&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ls /etc&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ls -la&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List ALL files (hidden + details)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ls -la&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tree&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show directory tree structure&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tree /var/www&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mkdir&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create a directory&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mkdir myproject&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mkdir -p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create nested directories&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mkdir -p a/b/c&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rmdir&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove empty directory&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rmdir myproject&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rm -r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove directory and contents&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rm -r myproject&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Absolute vs Relative Paths
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Absolute path&lt;/strong&gt;: Starts from root &lt;code&gt;/&lt;/code&gt;. Example: &lt;code&gt;/usr/bin/python3&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relative path&lt;/strong&gt;: Starts from current directory. Example: &lt;code&gt;../usr/bin&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /usr/bin     &lt;span class="c"&gt;# Absolute path&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ../usr/bin   &lt;span class="c"&gt;# Relative path&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Viewing Files
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cat file.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Display entire file at once (not ideal for large files)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cat -n file.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Display with line numbers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tac file.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Display file in reverse (last line first)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;less file.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Page through large files (scroll up/down, search with &lt;code&gt;/&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;head file.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show first 10 lines (use &lt;code&gt;-n 20&lt;/code&gt; for first 20)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tail file.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show last 10 lines (use &lt;code&gt;-n 20&lt;/code&gt; for last 20)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tail -f file.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Follow file in real-time (great for logs!)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wc file.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Count lines, words, characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wc -l file.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Count only lines&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Creating &amp;amp; Manipulating Files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;newfile.txt                    &lt;span class="c"&gt;# Create empty file (or update timestamp)&lt;/span&gt;
&lt;span class="nb"&gt;touch&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; 12091600 file.txt           &lt;span class="c"&gt;# Set specific timestamp (Dec 9, 4PM)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; file.txt              &lt;span class="c"&gt;# Write to file (OVERWRITES!)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"world"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; file.txt             &lt;span class="c"&gt;# Append to file&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;source.txt dest.txt               &lt;span class="c"&gt;# Copy file&lt;/span&gt;
&lt;span class="nb"&gt;mv &lt;/span&gt;old.txt new.txt                   &lt;span class="c"&gt;# Rename/move file&lt;/span&gt;
&lt;span class="nb"&gt;rm &lt;/span&gt;file.txt                          &lt;span class="c"&gt;# Delete file&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; directory/                    &lt;span class="c"&gt;# Force delete directory and contents&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Searching for Files
&lt;/h3&gt;

&lt;h4&gt;
  
  
  The &lt;code&gt;find&lt;/code&gt; Command
&lt;/h4&gt;

&lt;p&gt;The &lt;code&gt;find&lt;/code&gt; command searches the filesystem in real-time. Extremely useful in DevOps for automation, cleanup, backups, and CI/CD scripts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find /var/log &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.log"&lt;/span&gt;           &lt;span class="c"&gt;# Find all .log files in /var/log&lt;/span&gt;
find /usr &lt;span class="nt"&gt;-name&lt;/span&gt; gcc                   &lt;span class="c"&gt;# Find files/dirs named gcc&lt;/span&gt;
find /usr &lt;span class="nt"&gt;-type&lt;/span&gt; d &lt;span class="nt"&gt;-name&lt;/span&gt; gcc           &lt;span class="c"&gt;# Find only DIRECTORIES named gcc&lt;/span&gt;
find /usr &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-name&lt;/span&gt; gcc           &lt;span class="c"&gt;# Find only regular FILES named gcc&lt;/span&gt;
find / &lt;span class="nt"&gt;-size&lt;/span&gt; +10M                     &lt;span class="c"&gt;# Find files larger than 10MB&lt;/span&gt;
find / &lt;span class="nt"&gt;-size&lt;/span&gt; 0                        &lt;span class="c"&gt;# Find empty files&lt;/span&gt;
find / &lt;span class="nt"&gt;-mtime&lt;/span&gt; 3                       &lt;span class="c"&gt;# Files modified 3 days ago&lt;/span&gt;
find / &lt;span class="nt"&gt;-user&lt;/span&gt; root                     &lt;span class="c"&gt;# Files owned by root&lt;/span&gt;
find &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.jpg"&lt;/span&gt; &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="s1"&gt;';'&lt;/span&gt;   &lt;span class="c"&gt;# Find and DELETE all .jpg files&lt;/span&gt;
find / &lt;span class="nt"&gt;-size&lt;/span&gt; +10M &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="s1"&gt;';'&lt;/span&gt;  &lt;span class="c"&gt;# Find large files and run command&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key &lt;code&gt;find&lt;/code&gt; Options:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Match filename (case-sensitive)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-iname&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Match filename (case-insensitive)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-type f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Regular files only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-type d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Directories only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;File size (&lt;code&gt;+100M&lt;/code&gt; = over 100MB, &lt;code&gt;-10k&lt;/code&gt; = under 10KB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-mtime&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modified time in days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-exec&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Execute a command on each result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-user&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Files owned by specific user&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📝 NOTE:&lt;/strong&gt; The &lt;code&gt;{}&lt;/code&gt; is a placeholder filled with each file found. The &lt;code&gt;';'&lt;/code&gt; or &lt;code&gt;\;&lt;/code&gt; terminates the &lt;code&gt;-exec&lt;/code&gt; command.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  The &lt;code&gt;locate&lt;/code&gt; Command
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;locate zip         &lt;span class="c"&gt;# Fast search using pre-built database&lt;/span&gt;
&lt;span class="c"&gt;# Database is updated by 'updatedb' (runs daily automatically)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;code&gt;which&lt;/code&gt; &amp;amp; &lt;code&gt;whereis&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;which python3      &lt;span class="c"&gt;# Shows path of executable: /usr/bin/python3&lt;/span&gt;
whereis python3    &lt;span class="c"&gt;# Shows binary, source, and man page locations&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  I/O Redirection &amp;amp; Pipes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; file.txt       &lt;span class="c"&gt;# Redirect stdout to file (overwrite)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"world"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; file.txt      &lt;span class="c"&gt;# Redirect stdout to file (append)&lt;/span&gt;
&lt;span class="nb"&gt;command&lt;/span&gt; &amp;lt; input.txt           &lt;span class="c"&gt;# Feed file as stdin to command&lt;/span&gt;
&lt;span class="nb"&gt;command &lt;/span&gt;2&amp;gt; errors.txt         &lt;span class="c"&gt;# Redirect stderr to file&lt;/span&gt;
&lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; out.txt 2&amp;gt;&amp;amp;1        &lt;span class="c"&gt;# Redirect BOTH stdout AND stderr to file&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/passwd | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;       &lt;span class="c"&gt;# Pipe: send output of cat as input to wc&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/passwd | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;: &lt;span class="nt"&gt;-f1&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt;  &lt;span class="c"&gt;# Chain multiple pipes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔥 EXAM TIP:&lt;/strong&gt; &lt;code&gt;&amp;gt;&lt;/code&gt; overwrites, &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; appends. &lt;code&gt;2&amp;gt;&amp;amp;1&lt;/code&gt; redirects errors to same place as stdout. The pipe &lt;code&gt;|&lt;/code&gt; chains commands together.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Process Management
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;kill&lt;/span&gt; &lt;span class="nt"&gt;-SIGKILL&lt;/span&gt; &amp;lt;PID&amp;gt;       &lt;span class="c"&gt;# Force kill a process (same as kill -9)&lt;/span&gt;
&lt;span class="nb"&gt;kill&lt;/span&gt; &lt;span class="nt"&gt;-9&lt;/span&gt; &amp;lt;PID&amp;gt;             &lt;span class="c"&gt;# Force kill by PID&lt;/span&gt;
node server.js &amp;amp;          &lt;span class="c"&gt;# Run process in background (&amp;amp; suffix)&lt;/span&gt;
lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :80              &lt;span class="c"&gt;# Find what process is using port 80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📝 NOTE:&lt;/strong&gt; You can only kill your own processes (unless you are root).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Getting Help
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;man apache2       &lt;span class="c"&gt;# Full manual page for a command&lt;/span&gt;
man &lt;span class="nt"&gt;-k&lt;/span&gt; compress   &lt;span class="c"&gt;# Search man pages by keyword&lt;/span&gt;
info make         &lt;span class="c"&gt;# GNU Info documentation (alternative to man)&lt;/span&gt;
&lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="nt"&gt;--help&lt;/span&gt;    &lt;span class="c"&gt;# Quick help/usage summary (fastest option)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. File Permissions &amp;amp; Ownership
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Three Types of Owners
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;User (u)&lt;/strong&gt;: The owner of the file. When you create a file, you become the owner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Group (g)&lt;/strong&gt;: A collection of users. Useful in multi-user environments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other (o)&lt;/strong&gt;: Everyone else on the system.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Three Types of Permissions
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Permission&lt;/th&gt;
&lt;th&gt;Symbol&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;On Files&lt;/th&gt;
&lt;th&gt;On Directories&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Read&lt;/td&gt;
&lt;td&gt;&lt;code&gt;r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;View/copy file contents&lt;/td&gt;
&lt;td&gt;List directory contents (&lt;code&gt;ls&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write&lt;/td&gt;
&lt;td&gt;&lt;code&gt;w&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Modify file contents&lt;/td&gt;
&lt;td&gt;Create/delete files inside&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execute&lt;/td&gt;
&lt;td&gt;&lt;code&gt;x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Run the file as program&lt;/td&gt;
&lt;td&gt;Enter the directory (&lt;code&gt;cd&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Octal Permission Table (MEMORIZE THIS!)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;th&gt;5&lt;/th&gt;
&lt;th&gt;6&lt;/th&gt;
&lt;th&gt;7&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Permission&lt;/td&gt;
&lt;td&gt;&lt;code&gt;---&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-w-&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-wx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;r--&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;r-x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rw-&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rwx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meaning&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Exec only&lt;/td&gt;
&lt;td&gt;Write only&lt;/td&gt;
&lt;td&gt;Write+Exec&lt;/td&gt;
&lt;td&gt;Read only&lt;/td&gt;
&lt;td&gt;Read+Exec&lt;/td&gt;
&lt;td&gt;Read+Write&lt;/td&gt;
&lt;td&gt;ALL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Reading Permission Strings
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-rw-r--r-- 1 sajid devops_students 13 2022-05-11 08:29 lecture.txt
 ^^^^^^^^^   ^     ^
 |           |     +-- group owner
 |           +-------- file owner (user)
 +-------------------- permission string

First char: - = file, d = directory, l = symlink
Next 9 chars: rwx for user | rwx for group | rwx for others

Example: -rw-r--r-- means:
  User:  rw-  (read + write)      = 4+2+0 = 6
  Group: r--  (read only)          = 4+0+0 = 4
  Other: r--  (read only)          = 4+0+0 = 4
  Octal: 644
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;chmod&lt;/code&gt; — Change Permissions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;644 file.txt         &lt;span class="c"&gt;# rw-r--r-- (standard file permission)&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;755 directory/       &lt;span class="c"&gt;# rwxr-xr-x (standard directory permission)&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;700 secret.txt       &lt;span class="c"&gt;# rwx------ (owner only, full access)&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;666 file.txt         &lt;span class="c"&gt;# rw-rw-rw- (everyone can read/write)&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x script.sh         &lt;span class="c"&gt;# Add execute permission for everyone&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;u+x script.sh        &lt;span class="c"&gt;# Add execute for user only&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;g-w file.txt         &lt;span class="c"&gt;# Remove write from group&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;o-rwx file.txt       &lt;span class="c"&gt;# Remove all permissions from others&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;chown&lt;/code&gt; — Change Ownership
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chown &lt;/span&gt;root:root file.txt           &lt;span class="c"&gt;# Change owner AND group to root&lt;/span&gt;
&lt;span class="nb"&gt;sudo chown &lt;/span&gt;daniyal file.txt             &lt;span class="c"&gt;# Change owner only&lt;/span&gt;
&lt;span class="nb"&gt;sudo chown &lt;/span&gt;daniyal:www-data file.txt    &lt;span class="c"&gt;# Change owner to daniyal, group to www-data&lt;/span&gt;
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/html/  &lt;span class="c"&gt;# Recursive (all files inside)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ⭐ DevOps Golden Rules for Permissions
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;th&gt;Permission&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Directories&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;755&lt;/code&gt; (rwxr-xr-x)&lt;/td&gt;
&lt;td&gt;Owner full access, others can read/enter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regular files&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;644&lt;/code&gt; (rw-r--r--)&lt;/td&gt;
&lt;td&gt;Owner read/write, others read only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scripts (.sh)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;755&lt;/code&gt; (rwxr-xr-x)&lt;/td&gt;
&lt;td&gt;Must be executable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSH private key&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;600&lt;/code&gt; (rw-------)&lt;/td&gt;
&lt;td&gt;ONLY owner can read (SSH refuses otherwise)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;~/.ssh/ directory&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;700&lt;/code&gt; (rwx------)&lt;/td&gt;
&lt;td&gt;ONLY owner can access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;authorized_keys&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;600&lt;/code&gt; (rw-------)&lt;/td&gt;
&lt;td&gt;ONLY owner can read/write&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web files owner&lt;/td&gt;
&lt;td&gt;&lt;code&gt;www-data:www-data&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Web server user must be able to read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NEVER use&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;777&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SECURITY RISK — everyone has full access!&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔥 EXAM TIP:&lt;/strong&gt; If a web page shows '403 Forbidden', first check permissions and ownership! Owner should be &lt;code&gt;www-data&lt;/code&gt;, dirs &lt;code&gt;755&lt;/code&gt;, files &lt;code&gt;644&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. Users &amp;amp; Groups Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  User Management Commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/passwd                    &lt;span class="c"&gt;# List ALL users on the system&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;adduser newuser               &lt;span class="c"&gt;# Create new user (interactive - sets password)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;useradd newuser               &lt;span class="c"&gt;# Create user (non-interactive - no password set)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;newuser      &lt;span class="c"&gt;# Add user to sudo group (give admin rights)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;userdel newuser               &lt;span class="c"&gt;# Delete a user&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;userdel &lt;span class="nt"&gt;-r&lt;/span&gt; newuser            &lt;span class="c"&gt;# Delete user AND their home directory&lt;/span&gt;
su - newuser                       &lt;span class="c"&gt;# Switch to another user&lt;/span&gt;
&lt;span class="nb"&gt;whoami&lt;/span&gt;                             &lt;span class="c"&gt;# Show current username&lt;/span&gt;
&lt;span class="nb"&gt;id&lt;/span&gt;                                 &lt;span class="c"&gt;# Show user ID, group ID, and groups&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Group Management Commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/group                     &lt;span class="c"&gt;# List all groups&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;groupadd devopsgroup          &lt;span class="c"&gt;# Create a new group&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; devopsgroup user1 &lt;span class="c"&gt;# Add user1 to devopsgroup&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;groupdel devopsgroup          &lt;span class="c"&gt;# Delete a group&lt;/span&gt;
&lt;span class="nb"&gt;groups &lt;/span&gt;username                    &lt;span class="c"&gt;# Show which groups a user belongs to&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📝 NOTE:&lt;/strong&gt; The &lt;code&gt;-aG&lt;/code&gt; flag is critical! Without &lt;code&gt;-a&lt;/code&gt;, the user gets REMOVED from all other groups. Always use &lt;code&gt;-aG&lt;/code&gt; together.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Important Files
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/etc/passwd&lt;/code&gt; — Contains user account info (&lt;code&gt;username:x:UID:GID:info:home:shell&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/etc/shadow&lt;/code&gt; — Contains encrypted passwords (only root can read)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/etc/group&lt;/code&gt; — Contains group definitions&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. SSH (Secure Shell)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is SSH?
&lt;/h3&gt;

&lt;p&gt;SSH (Secure Shell) allows you to connect and log into remote systems securely. It encrypts ALL communication between client and server. SSH runs on &lt;strong&gt;port 22&lt;/strong&gt; by default. The server must have &lt;strong&gt;sshd&lt;/strong&gt; (SSH daemon) installed and running.&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic SSH Connection
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh username@remote_server_ip       &lt;span class="c"&gt;# Connect to remote machine&lt;/span&gt;
ssh daniyal@192.168.1.100           &lt;span class="c"&gt;# Example with IP&lt;/span&gt;
&lt;span class="nb"&gt;whoami&lt;/span&gt;                               &lt;span class="c"&gt;# Verify you are logged in&lt;/span&gt;
&lt;span class="nb"&gt;hostname&lt;/span&gt;                             &lt;span class="c"&gt;# Verify which machine you are on&lt;/span&gt;
&lt;span class="nb"&gt;exit&lt;/span&gt;                                 &lt;span class="c"&gt;# Disconnect from remote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  SSH Service Control
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status ssh          &lt;span class="c"&gt;# Check if SSH is running&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start ssh           &lt;span class="c"&gt;# Start SSH service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop ssh            &lt;span class="c"&gt;# Stop SSH service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart ssh         &lt;span class="c"&gt;# Restart (apply config changes)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;ssh          &lt;span class="c"&gt;# Start automatically on boot&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl disable ssh         &lt;span class="c"&gt;# Don't start on boot&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔥 EXAM TIP:&lt;/strong&gt; &lt;code&gt;systemctl enable&lt;/code&gt; makes service start on boot. &lt;code&gt;systemctl start&lt;/code&gt; starts it NOW. They are different! You often need BOTH.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  SSH Configuration File
&lt;/h3&gt;

&lt;p&gt;The main SSH server config file is: &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/ssh/sshd_config     &lt;span class="c"&gt;# Edit SSH server configuration&lt;/span&gt;

&lt;span class="c"&gt;# Key settings to know:&lt;/span&gt;
Port 22                            &lt;span class="c"&gt;# Default SSH port&lt;/span&gt;
PermitRootLogin &lt;span class="nb"&gt;yes&lt;/span&gt;/no             &lt;span class="c"&gt;# Allow/block root login via SSH&lt;/span&gt;
PasswordAuthentication &lt;span class="nb"&gt;yes&lt;/span&gt;/no      &lt;span class="c"&gt;# Allow/block password-based login&lt;/span&gt;
PubkeyAuthentication &lt;span class="nb"&gt;yes&lt;/span&gt;           &lt;span class="c"&gt;# Allow key-based authentication&lt;/span&gt;

&lt;span class="c"&gt;# IMPORTANT: After ANY change, restart SSH!&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  SSH Key-Based Authentication
&lt;/h3&gt;

&lt;p&gt;Key-based auth is more secure than passwords. It uses a pair of keys:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Private key&lt;/strong&gt; (&lt;code&gt;~/.ssh/id_rsa&lt;/code&gt;): Stays on YOUR machine. NEVER share this!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public key&lt;/strong&gt; (&lt;code&gt;~/.ssh/id_rsa.pub&lt;/code&gt;): Goes to the REMOTE server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step-by-step setup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# STEP 1: Generate key pair on YOUR machine (client)&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa
&lt;span class="c"&gt;# Press Enter for default location (~/.ssh/id_rsa)&lt;/span&gt;
&lt;span class="c"&gt;# Press Enter for no passphrase (or set one for extra security)&lt;/span&gt;
&lt;span class="c"&gt;# Creates: ~/.ssh/id_rsa (private) and ~/.ssh/id_rsa.pub (public)&lt;/span&gt;

&lt;span class="c"&gt;# STEP 2: Copy public key to the REMOTE server&lt;/span&gt;
ssh-copy-id username@remote_server
&lt;span class="c"&gt;# OR manually:&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_rsa.pub &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.ssh/authorized_keys  &lt;span class="c"&gt;# On the remote server&lt;/span&gt;

&lt;span class="c"&gt;# STEP 3: Set correct permissions (CRITICAL!)&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;700 ~/.ssh                   &lt;span class="c"&gt;# Directory: owner only&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.ssh/id_rsa            &lt;span class="c"&gt;# Private key: owner only&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.ssh/authorized_keys   &lt;span class="c"&gt;# Auth keys: owner only&lt;/span&gt;

&lt;span class="c"&gt;# STEP 4: Now you can login without password!&lt;/span&gt;
ssh username@remote_server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📝 NOTE:&lt;/strong&gt; The remote server stores public keys in &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; (one key per line). If permissions on this file are wrong, SSH will REFUSE the key and fall back to password auth.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  SSH Config File (Client Side)
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;~/.ssh/config&lt;/code&gt; to avoid typing username and IP every time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# File: ~/.ssh/config&lt;/span&gt;
Host myserver
    HostName 192.168.1.100
    User daniyal
    IdentityFile ~/.ssh/id_rsa

&lt;span class="c"&gt;# Now you can just type:&lt;/span&gt;
ssh myserver
&lt;span class="c"&gt;# Instead of: ssh daniyal@192.168.1.100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Non-Interactive SSH Commands
&lt;/h3&gt;

&lt;p&gt;Run commands on a remote server without opening a full session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh user@server &lt;span class="s2"&gt;"whoami"&lt;/span&gt;                    &lt;span class="c"&gt;# Run whoami on remote&lt;/span&gt;
ssh user@server &lt;span class="s2"&gt;"mkdir ~/test_dir"&lt;/span&gt;          &lt;span class="c"&gt;# Create dir on remote&lt;/span&gt;
ssh user@server &lt;span class="s2"&gt;"cat /etc/hostname"&lt;/span&gt;         &lt;span class="c"&gt;# Read remote file&lt;/span&gt;
ssh user@server &lt;span class="s2"&gt;"systemctl restart apache2"&lt;/span&gt; &lt;span class="c"&gt;# Restart service remotely&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔥 EXAM TIP:&lt;/strong&gt; Non-interactive SSH is key for scripting — you can loop over servers: &lt;code&gt;for server in list; do ssh server "command"; done&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Disabling Root Login &amp;amp; Password Auth
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Edit /etc/ssh/sshd_config:&lt;/span&gt;
PermitRootLogin no              &lt;span class="c"&gt;# Block root from logging in via SSH&lt;/span&gt;
PasswordAuthentication no       &lt;span class="c"&gt;# Force key-based auth only&lt;/span&gt;

&lt;span class="c"&gt;# Restart to apply:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart ssh

&lt;span class="c"&gt;# Test: trying ssh root@server should now be DENIED&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Apache Web Server
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation &amp;amp; Service Management
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;apache2           &lt;span class="c"&gt;# Install Apache&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start apache2       &lt;span class="c"&gt;# Start the service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop apache2        &lt;span class="c"&gt;# Stop the service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart apache2     &lt;span class="c"&gt;# Restart (apply changes)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload apache2      &lt;span class="c"&gt;# Reload config without downtime&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status apache2      &lt;span class="c"&gt;# Check if running&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;apache2      &lt;span class="c"&gt;# Start on boot&lt;/span&gt;

curl localhost                     &lt;span class="c"&gt;# Test: should show Apache default page&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Apache runs on Port 80 (HTTP) or Port 443 (HTTPS)
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Apache Default Paths
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/www/html/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default web root (put your website files here)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/apache2/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Main configuration directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/apache2/sites-available/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Virtual host config files (available)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/apache2/sites-enabled/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Symlinks to active virtual hosts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/apache2/apache2.conf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Main Apache configuration file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/apache2/ports.conf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Which ports Apache listens on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/log/apache2/error.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Error log file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/log/apache2/access.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Access log file&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Deploying a Static Website
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 1: Clone or copy your website files&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;git clone https://github.com/user/repo.git /var/www/html/mysite

&lt;span class="c"&gt;# Step 2: Set correct ownership&lt;/span&gt;
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/html/mysite

&lt;span class="c"&gt;# Step 3: Set correct permissions&lt;/span&gt;
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 755 /var/www/html/mysite/                        &lt;span class="c"&gt;# Directories&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;find /var/www/html/mysite &lt;span class="nt"&gt;-type&lt;/span&gt; f &lt;span class="nt"&gt;-exec&lt;/span&gt; &lt;span class="nb"&gt;chmod &lt;/span&gt;644 &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;   &lt;span class="c"&gt;# Files&lt;/span&gt;

&lt;span class="c"&gt;# Step 4: Verify&lt;/span&gt;
curl localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Virtual Hosts (Multiple Websites)
&lt;/h3&gt;

&lt;p&gt;Virtual hosts let you run MULTIPLE websites on one server, each on a different port or domain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 1: Create config file in sites-available&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/apache2/sites-available/mysite.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Content of &lt;code&gt;mysite.conf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;VirtualHost&lt;/span&gt;&lt;span class="sr"&gt; *:8080&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;ServerName&lt;/span&gt; mysite.local
    &lt;span class="nc"&gt;DocumentRoot&lt;/span&gt; /var/www/mysite
    &lt;span class="nc"&gt;ErrorLog&lt;/span&gt; /var/log/apache2/mysite-error.log
    &lt;span class="nc"&gt;CustomLog&lt;/span&gt; /var/log/apache2/mysite-access.log combined
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;VirtualHost&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 2: Add Listen directive for new port&lt;/span&gt;
&lt;span class="c"&gt;# Edit /etc/apache2/ports.conf and add: Listen 8080&lt;/span&gt;

&lt;span class="c"&gt;# Step 3: Enable the site&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;a2ensite mysite.conf

&lt;span class="c"&gt;# Step 4: Test config and reload&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apache2ctl configtest         &lt;span class="c"&gt;# Check for syntax errors&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload apache2

&lt;span class="c"&gt;# Step 5: Verify&lt;/span&gt;
curl localhost:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔥 EXAM TIP:&lt;/strong&gt; &lt;code&gt;sites-available&lt;/code&gt; = config files stored here. &lt;code&gt;sites-enabled&lt;/code&gt; = symlinks to active configs. Use &lt;code&gt;a2ensite&lt;/code&gt;/&lt;code&gt;a2dissite&lt;/code&gt; to enable/disable.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  7. Nginx Web Server
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation &amp;amp; Service Management
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx

&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status nginx
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nginx

curl localhost                     &lt;span class="c"&gt;# Test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Nginx Key Paths
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Default web root: &lt;code&gt;/var/www/html/&lt;/code&gt; (same as Apache)&lt;/li&gt;
&lt;li&gt;Config files: &lt;code&gt;/etc/nginx/sites-available/&lt;/code&gt; and &lt;code&gt;/etc/nginx/sites-enabled/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Main config: &lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Default site config: &lt;code&gt;/etc/nginx/sites-available/default&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Nginx Virtual Host (Server Block)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="c1"&gt;# File: /etc/nginx/sites-available/mysite&lt;/span&gt;
&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;mysite.local&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/var/www/mysite&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt;&lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable the site by creating a symlink:&lt;/span&gt;
&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/

&lt;span class="c"&gt;# Test config:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;

&lt;span class="c"&gt;# Reload:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📝 NOTE:&lt;/strong&gt; Both Apache and Nginx use port 80 by default. They CANNOT run on the same port at the same time!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  8. Port Debugging &amp;amp; Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Common Scenario: Port Conflict
&lt;/h3&gt;

&lt;p&gt;If Apache fails to start with &lt;strong&gt;"Address already in use"&lt;/strong&gt; error, another process (like Nginx) is already using port 80.&lt;/p&gt;

&lt;h3&gt;
  
  
  Debugging Commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check what's using a specific port&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :80                   &lt;span class="c"&gt;# Show process using port 80&lt;/span&gt;

&lt;span class="c"&gt;# Production-friendly command (all open network connections)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;lsof &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;-P&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt;
&lt;span class="c"&gt;# -i = open network connections&lt;/span&gt;
&lt;span class="c"&gt;# -P = show port numbers (not service names)&lt;/span&gt;
&lt;span class="c"&gt;# -n = don't resolve hostnames&lt;/span&gt;

&lt;span class="c"&gt;# Check service logs for errors&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-xe&lt;/span&gt;                &lt;span class="c"&gt;# Show recent system logs with details&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; apache2         &lt;span class="c"&gt;# Show only Apache logs&lt;/span&gt;

&lt;span class="c"&gt;# Monitor log files in real-time&lt;/span&gt;
&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/apache2/error.log
&lt;span class="nb"&gt;sudo tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/log/nginx/error.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fixing Port Conflicts Step by Step
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 1: Check which service is using port 80&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;lsof &lt;span class="nt"&gt;-i&lt;/span&gt; :80
&lt;span class="c"&gt;# Output shows: nginx (PID 1234)&lt;/span&gt;

&lt;span class="c"&gt;# Step 2: Stop the conflicting service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop nginx

&lt;span class="c"&gt;# Step 3: Start the service you want&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start apache2

&lt;span class="c"&gt;# Step 4: Verify&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status apache2
curl localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Common Web Server Errors &amp;amp; Fixes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;Likely Cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;403 Forbidden&lt;/td&gt;
&lt;td&gt;Wrong permissions/ownership&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;chown www-data:www-data&lt;/code&gt;, &lt;code&gt;chmod 755&lt;/code&gt;/&lt;code&gt;644&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;404 Not Found&lt;/td&gt;
&lt;td&gt;Wrong DocumentRoot path&lt;/td&gt;
&lt;td&gt;Check config file, verify path exists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Address in use&lt;/td&gt;
&lt;td&gt;Port conflict&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;lsof -i :80&lt;/code&gt;, stop conflicting service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service won't start&lt;/td&gt;
&lt;td&gt;Config syntax error&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;apache2ctl configtest&lt;/code&gt; or &lt;code&gt;nginx -t&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connection refused&lt;/td&gt;
&lt;td&gt;Service not running&lt;/td&gt;
&lt;td&gt;&lt;code&gt;systemctl start apache2/nginx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  9. Bash Scripting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Script Basics
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# The first line is the SHEBANG — tells the system to use bash&lt;/span&gt;
&lt;span class="c"&gt;# Every script MUST start with #!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;# Make script executable:&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x script.sh

&lt;span class="c"&gt;# Run script:&lt;/span&gt;
./script.sh
&lt;span class="c"&gt;# OR&lt;/span&gt;
bash script.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Variables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Daniyal"&lt;/span&gt;                     &lt;span class="c"&gt;# Assign (NO spaces around =)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Hello &lt;/span&gt;&lt;span class="nv"&gt;$NAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;                 &lt;span class="c"&gt;# Use variable with $&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Hello &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;               &lt;span class="c"&gt;# Curly braces version (safer)&lt;/span&gt;

&lt;span class="c"&gt;# Read user input&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Enter your name:"&lt;/span&gt;
&lt;span class="nb"&gt;read &lt;/span&gt;USERNAME                      &lt;span class="c"&gt;# Stores input in USERNAME&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Welcome &lt;/span&gt;&lt;span class="nv"&gt;$USERNAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Command substitution — store command output in variable&lt;/span&gt;
&lt;span class="nv"&gt;TODAY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;                      &lt;span class="c"&gt;# Run date command, store result&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Today is: &lt;/span&gt;&lt;span class="nv"&gt;$TODAY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nv"&gt;HOSTNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Machine: &lt;/span&gt;&lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔥 EXAM TIP:&lt;/strong&gt; NO SPACES around &lt;code&gt;=&lt;/code&gt; when assigning variables! &lt;code&gt;NAME='value'&lt;/code&gt; is correct. &lt;code&gt;NAME = 'value'&lt;/code&gt; is WRONG and will cause an error.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Command Line Arguments
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Script name itself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;$1&lt;/code&gt;, &lt;code&gt;$2&lt;/code&gt;, &lt;code&gt;$3&lt;/code&gt;...&lt;/td&gt;
&lt;td&gt;First, second, third argument...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Total number of arguments passed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$@&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All arguments as separate words&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$?&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Exit code of the LAST command (0=success, non-0=failure)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Example: ./myscript.sh hello world&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Script name: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;            &lt;span class="c"&gt;# ./myscript.sh&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"First arg: &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;              &lt;span class="c"&gt;# hello&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Second arg: &lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;             &lt;span class="c"&gt;# world&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Total args: $#"&lt;/span&gt;             &lt;span class="c"&gt;# 2&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"All args: &lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;               &lt;span class="c"&gt;# hello world&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exit Codes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Every command returns an exit code&lt;/span&gt;
&lt;span class="c"&gt;# 0 = SUCCESS, anything else = FAILURE&lt;/span&gt;

&lt;span class="nb"&gt;ls&lt;/span&gt; /tmp
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;    &lt;span class="c"&gt;# 0 (success — /tmp exists)&lt;/span&gt;

&lt;span class="nb"&gt;ls&lt;/span&gt; /nonexistent
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;    &lt;span class="c"&gt;# 2 (failure — directory doesn't exist)&lt;/span&gt;

&lt;span class="c"&gt;# Set your own exit code&lt;/span&gt;
&lt;span class="nb"&gt;exit &lt;/span&gt;0     &lt;span class="c"&gt;# Exit script with success&lt;/span&gt;
&lt;span class="nb"&gt;exit &lt;/span&gt;1     &lt;span class="c"&gt;# Exit script with failure&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conditionals (if/else)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Basic if/else&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"/var/www/html"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Directory exists"&lt;/span&gt;
&lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Directory does NOT exist"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Check if file exists&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"/etc/ssh/sshd_config"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SSH config found"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Compare strings&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"install"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing..."&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"remove"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Removing..."&lt;/span&gt;
&lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Usage: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; install|remove"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="c"&gt;# Check if command succeeded&lt;/span&gt;
apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installation successful"&lt;/span&gt;
&lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installation FAILED"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Common test operators:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-f file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;File exists and is a regular file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-d dir&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Directory exists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-e path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Path exists (file or directory)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-z string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String is empty (zero length)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-n string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String is NOT empty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;str1 == str2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Strings are equal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;str1 != str2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Strings are NOT equal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;num1 -eq num2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Numbers are equal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;num1 -ne num2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Numbers are NOT equal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;num1 -gt num2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Greater than&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;num1 -lt num2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Less than&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Case Statement (for Flags)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Great for handling command-line flags like -i, -r, -h&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
    &lt;span class="nt"&gt;-i&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;--install&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Installing..."&lt;/span&gt;
        &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;--remove&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Removing..."&lt;/span&gt;
        &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="nt"&gt;-h&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nt"&gt;--help&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Usage: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; [-i install] [-r remove] [-h help]"&lt;/span&gt;
        &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Invalid option: &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Use -h for help"&lt;/span&gt;
        &lt;span class="nb"&gt;exit &lt;/span&gt;1
        &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  For Loops
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Loop through a list&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;server &lt;span class="k"&gt;in &lt;/span&gt;server1 server2 server3&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Restarting &lt;/span&gt;&lt;span class="nv"&gt;$server&lt;/span&gt;&lt;span class="s2"&gt;..."&lt;/span&gt;
    ssh &lt;span class="nv"&gt;$server&lt;/span&gt; &lt;span class="s2"&gt;"systemctl restart apache2"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# Loop through files&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;file &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.sh&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Found script: &lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# Loop with numbers&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in &lt;/span&gt;1 2 3 4 5&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Number: &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# C-style loop&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; i&amp;lt;&lt;span class="o"&gt;=&lt;/span&gt;5&lt;span class="p"&gt;;&lt;/span&gt; i++&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Count: &lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The &lt;code&gt;tar&lt;/code&gt; Command (Archives/Backups)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a compressed archive&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-czf&lt;/span&gt; backup.tar.gz /path/to/directory
&lt;span class="c"&gt;# -c = create&lt;/span&gt;
&lt;span class="c"&gt;# -z = compress with gzip&lt;/span&gt;
&lt;span class="c"&gt;# -f = filename follows&lt;/span&gt;

&lt;span class="c"&gt;# Create with timestamp in name&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-czf&lt;/span&gt; backup_&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%Y%m%d_%H%M%S&lt;span class="si"&gt;)&lt;/span&gt;.tar.gz /var/www/html/

&lt;span class="c"&gt;# Extract an archive&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; backup.tar.gz
&lt;span class="c"&gt;# -x = extract&lt;/span&gt;

&lt;span class="c"&gt;# List contents without extracting&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-tzf&lt;/span&gt; backup.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The &lt;code&gt;awk&lt;/code&gt; Command
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# awk processes text line by line, splitting into fields&lt;/span&gt;
&lt;span class="c"&gt;# Default field separator is whitespace&lt;/span&gt;

&lt;span class="c"&gt;# Print second column of output&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $2}'&lt;/span&gt;

&lt;span class="c"&gt;# Print specific fields with custom format&lt;/span&gt;
free &lt;span class="nt"&gt;-m&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/Mem:/ {print "Total: "$2" MB, Used: "$3" MB"}'&lt;/span&gt;

&lt;span class="c"&gt;# Use custom field separator&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/passwd | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt;: &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt;   &lt;span class="c"&gt;# Print usernames (field 1, : separator)&lt;/span&gt;

&lt;span class="c"&gt;# Filter lines matching a pattern&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'!/tmpfs/ {print $0}'&lt;/span&gt;        &lt;span class="c"&gt;# Exclude lines containing tmpfs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Heredoc (Writing Multi-line Content)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Heredoc writes multi-line content to a file&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; /var/www/html/index.html
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;System Report&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Server: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;Date: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="c"&gt;# Variables inside heredoc get expanded!&lt;/span&gt;
&lt;span class="c"&gt;# Use &amp;lt;&amp;lt; 'EOF' (with quotes) to PREVENT variable expansion&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Redirection in Scripts
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Redirect command output to log file&lt;/span&gt;
apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; nginx.log 2&amp;gt;&amp;amp;1
&lt;span class="c"&gt;# &amp;gt; nginx.log    = redirect stdout to file&lt;/span&gt;
&lt;span class="c"&gt;# 2&amp;gt;&amp;amp;1           = redirect stderr (2) to same place as stdout (1)&lt;/span&gt;
&lt;span class="c"&gt;# Combined: ALL output (normal + errors) goes to nginx.log&lt;/span&gt;

&lt;span class="c"&gt;# Append to log&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; - Installation complete"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; nginx.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Lab Script Examples
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Script 1: &lt;code&gt;backup.sh&lt;/code&gt; — Automated Directory Backup
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Enter directory path to backup:"&lt;/span&gt;
&lt;span class="nb"&gt;read &lt;/span&gt;DIR_PATH

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$DIR_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"ERROR: Directory &lt;/span&gt;&lt;span class="nv"&gt;$DIR_PATH&lt;/span&gt;&lt;span class="s2"&gt; does not exist!"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nv"&gt;TIMESTAMP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%Y%m%d_%H%M%S&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;BACKUP_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"backup_&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TIMESTAMP&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz"&lt;/span&gt;

&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-czf&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BACKUP_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$DIR_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SUCCESS: Backup created: &lt;/span&gt;&lt;span class="nv"&gt;$BACKUP_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; - SUCCESS - &lt;/span&gt;&lt;span class="nv"&gt;$BACKUP_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; backup.log
&lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"FAILED: Backup failed!"&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; - FAILED"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; backup.log
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Script 2: Virtual Host Automator
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Enter domain/directory name:"&lt;/span&gt;
&lt;span class="nb"&gt;read &lt;/span&gt;DOMAIN

&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /var/www/&lt;span class="nv"&gt;$DOMAIN&lt;/span&gt;

&lt;span class="nb"&gt;sudo cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; /var/www/&lt;/span&gt;&lt;span class="nv"&gt;$DOMAIN&lt;/span&gt;&lt;span class="sh"&gt;/index.html
&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Welcome to &lt;/span&gt;&lt;span class="nv"&gt;$DOMAIN&lt;/span&gt;&lt;span class="sh"&gt;&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;sudo cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; /etc/apache2/sites-available/&lt;/span&gt;&lt;span class="nv"&gt;$DOMAIN&lt;/span&gt;&lt;span class="sh"&gt;.conf
&amp;lt;VirtualHost *:80&amp;gt;
    ServerName &lt;/span&gt;&lt;span class="nv"&gt;$DOMAIN&lt;/span&gt;&lt;span class="sh"&gt;
    DocumentRoot /var/www/&lt;/span&gt;&lt;span class="nv"&gt;$DOMAIN&lt;/span&gt;&lt;span class="sh"&gt;
    ErrorLog /var/log/apache2/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DOMAIN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;-error.log
    CustomLog /var/log/apache2/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DOMAIN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;-access.log combined
&amp;lt;/VirtualHost&amp;gt;
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; www-data:www-data /var/www/&lt;span class="nv"&gt;$DOMAIN&lt;/span&gt;
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 755 /var/www/&lt;span class="nv"&gt;$DOMAIN&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;a2ensite &lt;span class="nv"&gt;$DOMAIN&lt;/span&gt;.conf
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload apache2
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Website &lt;/span&gt;&lt;span class="nv"&gt;$DOMAIN&lt;/span&gt;&lt;span class="s2"&gt; deployed successfully!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Script 3: &lt;code&gt;wserver.sh&lt;/code&gt; — Nginx Install/Remove with Flags
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
    &lt;span class="nt"&gt;-i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;dpkg &lt;span class="nt"&gt;-l&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; nginx&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Nginx is already installed."&lt;/span&gt;
            &lt;span class="nb"&gt;exit &lt;/span&gt;0
        &lt;span class="k"&gt;fi
        &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; nginx.log 2&amp;gt;&amp;amp;1
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Nginx installed successfully."&lt;/span&gt;
        &lt;span class="k"&gt;else
            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"ERROR: Installation failed. Check nginx.log"&lt;/span&gt;
            &lt;span class="nb"&gt;exit &lt;/span&gt;1
        &lt;span class="k"&gt;fi&lt;/span&gt;
        &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; dpkg &lt;span class="nt"&gt;-l&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; nginx&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Nginx is not installed."&lt;/span&gt;
            &lt;span class="nb"&gt;exit &lt;/span&gt;0
        &lt;span class="k"&gt;fi
        &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt remove nginx &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; nginx.log 2&amp;gt;&amp;amp;1
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Nginx removed successfully."&lt;/span&gt;
        &lt;span class="k"&gt;else
            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"ERROR: Removal failed. Check nginx.log"&lt;/span&gt;
            &lt;span class="nb"&gt;exit &lt;/span&gt;1
        &lt;span class="k"&gt;fi&lt;/span&gt;
        &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Usage: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; [-i install] [-r remove]"&lt;/span&gt;
        &lt;span class="nb"&gt;exit &lt;/span&gt;1
        &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Script 4: &lt;code&gt;system_health.sh&lt;/code&gt; — HTML Report
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;TOTAL_MEM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;free &lt;span class="nt"&gt;-m&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/Mem:/ {print $2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;USED_MEM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;free &lt;span class="nt"&gt;-m&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/Mem:/ {print $3}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;AVAIL_MEM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;free &lt;span class="nt"&gt;-m&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/Mem:/ {print $7}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;TOTAL_SWAP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;free &lt;span class="nt"&gt;-m&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/Swap:/ {print $2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;USED_SWAP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;free &lt;span class="nt"&gt;-m&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/Swap:/ {print $3}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;DISK_TOTAL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; &lt;span class="nt"&gt;--total&lt;/span&gt; &lt;span class="nt"&gt;--exclude-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tmpfs | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/total/ {print $2}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;DISK_USED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; &lt;span class="nt"&gt;--total&lt;/span&gt; &lt;span class="nt"&gt;--exclude-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tmpfs | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/total/ {print $3}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;DISK_AVAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; &lt;span class="nt"&gt;--total&lt;/span&gt; &lt;span class="nt"&gt;--exclude-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tmpfs | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/total/ {print $4}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; system_health.html
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;System Health Report&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;System Health Report&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;Date: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;&amp;lt;/p&amp;gt;
&amp;lt;h2&amp;gt;Memory Usage&amp;lt;/h2&amp;gt;
&amp;lt;p&amp;gt;Total: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TOTAL_MEM&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;MB | Used: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USED_MEM&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;MB | Available: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;AVAIL_MEM&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;MB&amp;lt;/p&amp;gt;
&amp;lt;h2&amp;gt;Disk Usage&amp;lt;/h2&amp;gt;
&amp;lt;p&amp;gt;Total: &lt;/span&gt;&lt;span class="nv"&gt;$DISK_TOTAL&lt;/span&gt;&lt;span class="sh"&gt; | Used: &lt;/span&gt;&lt;span class="nv"&gt;$DISK_USED&lt;/span&gt;&lt;span class="sh"&gt; | Available: &lt;/span&gt;&lt;span class="nv"&gt;$DISK_AVAIL&lt;/span&gt;&lt;span class="sh"&gt;&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;sudo cp &lt;/span&gt;system_health.html /var/www/html/index.html
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"SUCCESS: Report hosted at http://localhost"&lt;/span&gt;
&lt;span class="k"&gt;else
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"ERROR: Failed to deploy report"&lt;/span&gt;
    &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Script 5: &lt;code&gt;systeminfo.sh&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Kernel Name: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Kernel Release: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Processor: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"OS: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/os-release | &lt;span class="nb"&gt;grep &lt;/span&gt;PRETTY_NAME | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;-f2&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nv"&gt;EDITOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"nano"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Favorite Editor: &lt;/span&gt;&lt;span class="nv"&gt;$EDITOR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Editor Location: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;which &lt;span class="nv"&gt;$EDITOR&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Documentation: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;whereis &lt;span class="nv"&gt;$EDITOR&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  10. Docker Containers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is Docker?
&lt;/h3&gt;

&lt;p&gt;Docker is a platform that lets you package, ship, and run applications in isolated environments called &lt;strong&gt;containers&lt;/strong&gt;. A container is like a lightweight virtual machine that shares the host OS kernel. Think of it as: your app + all its dependencies, packaged together so it runs the same everywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Concepts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image&lt;/strong&gt;: A blueprint/template for a container (like a class in OOP). Downloaded from Docker Hub.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container&lt;/strong&gt;: A running instance of an image (like an object). You can run multiple from one image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Hub&lt;/strong&gt;: Online registry of Docker images (like GitHub for images).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tag&lt;/strong&gt;: Version of an image. Example: &lt;code&gt;ubuntu:22.04&lt;/code&gt; vs &lt;code&gt;ubuntu:latest&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Verify Docker Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nt"&gt;--version&lt;/span&gt;           &lt;span class="c"&gt;# Check Docker version&lt;/span&gt;
docker version             &lt;span class="c"&gt;# Detailed client + server version&lt;/span&gt;
docker run hello-world     &lt;span class="c"&gt;# Test Docker works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Docker Container Lifecycle
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# PULL an image from Docker Hub&lt;/span&gt;
docker pull ubuntu                 &lt;span class="c"&gt;# Download ubuntu image (latest)&lt;/span&gt;
docker pull ubuntu:22.04           &lt;span class="c"&gt;# Download specific version&lt;/span&gt;
docker pull nginx                  &lt;span class="c"&gt;# Download nginx image&lt;/span&gt;

&lt;span class="c"&gt;# RUN a container from an image&lt;/span&gt;
docker run ubuntu                  &lt;span class="c"&gt;# Runs and exits immediately (no process)&lt;/span&gt;
docker run ubuntu &lt;span class="nb"&gt;sleep &lt;/span&gt;5          &lt;span class="c"&gt;# Runs, sleeps 5 seconds, then exits&lt;/span&gt;

&lt;span class="c"&gt;# RUN in interactive mode (get a shell inside container)&lt;/span&gt;
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; ubuntu bash         &lt;span class="c"&gt;# -i=interactive, -t=terminal&lt;/span&gt;
&lt;span class="c"&gt;# You are now INSIDE the container!&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Hello Docker"&lt;/span&gt;
&lt;span class="nb"&gt;ls
exit&lt;/span&gt;                               &lt;span class="c"&gt;# Exit container (container stops)&lt;/span&gt;

&lt;span class="c"&gt;# RUN with a custom name&lt;/span&gt;
docker run &lt;span class="nt"&gt;--name&lt;/span&gt; myubuntu ubuntu &lt;span class="nb"&gt;sleep &lt;/span&gt;30

&lt;span class="c"&gt;# RUN in detached mode (background)&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; ubuntu &lt;span class="nb"&gt;sleep &lt;/span&gt;300     &lt;span class="c"&gt;# -d = detached (runs in background)&lt;/span&gt;
docker run &lt;span class="nt"&gt;-dit&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;ubuntu bash  &lt;span class="c"&gt;# Detached + interactive&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Managing Containers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# LIST containers&lt;/span&gt;
docker ps                          &lt;span class="c"&gt;# Show RUNNING containers only&lt;/span&gt;
docker ps &lt;span class="nt"&gt;-a&lt;/span&gt;                       &lt;span class="c"&gt;# Show ALL containers (running + stopped)&lt;/span&gt;

&lt;span class="c"&gt;# STOP a container&lt;/span&gt;
docker stop &amp;lt;container_id&amp;gt;         &lt;span class="c"&gt;# Graceful stop&lt;/span&gt;
docker stop myubuntu               &lt;span class="c"&gt;# Stop by name&lt;/span&gt;

&lt;span class="c"&gt;# REMOVE a container&lt;/span&gt;
docker &lt;span class="nb"&gt;rm&lt;/span&gt; &amp;lt;container_id&amp;gt;           &lt;span class="c"&gt;# Remove stopped container&lt;/span&gt;
docker &lt;span class="nb"&gt;rm &lt;/span&gt;myubuntu                 &lt;span class="c"&gt;# Remove by name&lt;/span&gt;

&lt;span class="c"&gt;# STOP ALL containers at once&lt;/span&gt;
docker stop &lt;span class="si"&gt;$(&lt;/span&gt;docker ps &lt;span class="nt"&gt;-q&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;        &lt;span class="c"&gt;# -q = quiet (only IDs)&lt;/span&gt;

&lt;span class="c"&gt;# REMOVE ALL containers&lt;/span&gt;
docker &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;docker ps &lt;span class="nt"&gt;-aq&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;         &lt;span class="c"&gt;# Remove all (running + stopped)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔥 EXAM TIP:&lt;/strong&gt; &lt;code&gt;docker run ubuntu&lt;/code&gt; exits immediately because there is no long-running process. Use &lt;code&gt;sleep&lt;/code&gt;, &lt;code&gt;-it bash&lt;/code&gt;, or &lt;code&gt;-d&lt;/code&gt; to keep it alive.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Managing Images
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# LIST downloaded images&lt;/span&gt;
docker images

&lt;span class="c"&gt;# REMOVE an image&lt;/span&gt;
docker rmi ubuntu                  &lt;span class="c"&gt;# Remove ubuntu image&lt;/span&gt;
docker rmi &amp;lt;image_id&amp;gt;              &lt;span class="c"&gt;# Remove by ID&lt;/span&gt;
&lt;span class="c"&gt;# Note: Must remove all containers using that image first!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Attach vs Exec (IMPORTANT DIFFERENCE!)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ATTACH to a running container (connects to main process)&lt;/span&gt;
docker attach &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="c"&gt;# CTRL+P then CTRL+Q = detach WITHOUT stopping container&lt;/span&gt;
&lt;span class="c"&gt;# If you type 'exit', container STOPS&lt;/span&gt;

&lt;span class="c"&gt;# EXEC runs a NEW process inside a running container&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;bash
&lt;span class="c"&gt;# If you type 'exit', only the exec process ends&lt;/span&gt;
&lt;span class="c"&gt;# The container keeps running!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📝 NOTE:&lt;/strong&gt; Use &lt;code&gt;exec&lt;/code&gt; when you want to inspect a running container without affecting it. Use &lt;code&gt;attach&lt;/code&gt; to reconnect to the main process.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Container Logs &amp;amp; Inspect
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker logs &amp;lt;container_id&amp;gt;                          &lt;span class="c"&gt;# View container logs&lt;/span&gt;
docker logs myubuntu

docker inspect &lt;span class="nb"&gt;test&lt;/span&gt;                                  &lt;span class="c"&gt;# Full container details (JSON)&lt;/span&gt;
docker inspect &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{{.State.Status}}'&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt;     &lt;span class="c"&gt;# Get specific info&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Port Mapping (&lt;code&gt;-p&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Port mapping connects a port on your HOST machine to a port inside the container.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Map host port 8081 to container port 80&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8081:80 nginx
&lt;span class="c"&gt;#                ^     ^&lt;/span&gt;
&lt;span class="c"&gt;#                |     +-- container port (nginx listens on 80)&lt;/span&gt;
&lt;span class="c"&gt;#                +-------- host port (access via localhost:8081)&lt;/span&gt;

&lt;span class="c"&gt;# Run multiple web servers on different ports&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; web1 &lt;span class="nt"&gt;-p&lt;/span&gt; 8081:80 ubuntu/apache2
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; web2 &lt;span class="nt"&gt;-p&lt;/span&gt; 8082:80 ubuntu/apache2

&lt;span class="c"&gt;# Access in browser:&lt;/span&gt;
&lt;span class="c"&gt;# http://localhost:8081  --&amp;gt;  web1&lt;/span&gt;
&lt;span class="c"&gt;# http://localhost:8082  --&amp;gt;  web2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🔥 EXAM TIP:&lt;/strong&gt; Format is &lt;code&gt;-p HOST_PORT:CONTAINER_PORT&lt;/code&gt;. The HOST port is what you type in the browser. The CONTAINER port is what the app listens on inside.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Volume Mounts (&lt;code&gt;-v&lt;/code&gt;) / Bind Mounts
&lt;/h3&gt;

&lt;p&gt;Volumes let you share files between your host machine and the container.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Mount current directory into container&lt;/span&gt;
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/scripts ubuntu bash
&lt;span class="c"&gt;# $(pwd) = your current directory on host&lt;/span&gt;
&lt;span class="c"&gt;# /scripts = path inside the container&lt;/span&gt;

&lt;span class="c"&gt;# Mount a specific file into nginx&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;h1&amp;gt;Hello Docker!&amp;lt;/h1&amp;gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; index.html
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8081:80 &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/index.html:/usr/share/nginx/html/index.html nginx
&lt;span class="c"&gt;# You have just hosted a simple web app!&lt;/span&gt;

&lt;span class="c"&gt;# Mount a Python script&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'print("Hello, world!")'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; hello.py
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/hello.py:/hello.py python:3.10-slim bash
&lt;span class="c"&gt;# Then inside: python hello.py&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📝 NOTE:&lt;/strong&gt; The &lt;code&gt;--rm&lt;/code&gt; flag automatically removes the container when it exits. Great for temporary containers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Complete Docker Command Reference
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check Docker client and server version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker run &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start a container from an image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker run --name &amp;lt;n&amp;gt; &amp;lt;img&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run with a custom name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker run &amp;lt;img&amp;gt;:&amp;lt;tag&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run a specific version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker run -it &amp;lt;img&amp;gt; bash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run interactively with terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker run -d &amp;lt;img&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run in detached (background) mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker run -p H:C &amp;lt;img&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Map host port H to container port C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker run -v H:C &amp;lt;img&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mount host path H to container path C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker run --rm &amp;lt;img&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Auto-remove container on exit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List running containers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker ps -a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List ALL containers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker stop &amp;lt;id/name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stop a running container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker rm &amp;lt;id/name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove a stopped container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker images&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List downloaded images&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker rmi &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove an image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker pull &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Download image from Docker Hub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker exec -it &amp;lt;id&amp;gt; bash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open shell in running container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker attach &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Attach to main process of container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker logs &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;View container output logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker inspect &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Detailed container info (JSON)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker stop $(docker ps -q)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stop ALL running containers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker rm $(docker ps -aq)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove ALL containers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;— list, create, add to sudo, switch user, create group&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Quick Reference Cheat Sheet
&lt;/h2&gt;

&lt;h3&gt;
  
  
  systemctl Commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl start &amp;lt;service&amp;gt;     &lt;span class="c"&gt;# Start a service NOW&lt;/span&gt;
systemctl stop &amp;lt;service&amp;gt;      &lt;span class="c"&gt;# Stop a service NOW&lt;/span&gt;
systemctl restart &amp;lt;service&amp;gt;   &lt;span class="c"&gt;# Restart a service&lt;/span&gt;
systemctl reload &amp;lt;service&amp;gt;    &lt;span class="c"&gt;# Reload config without stopping&lt;/span&gt;
systemctl status &amp;lt;service&amp;gt;    &lt;span class="c"&gt;# Check if service is running&lt;/span&gt;
systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &amp;lt;service&amp;gt;    &lt;span class="c"&gt;# Start on boot&lt;/span&gt;
systemctl disable &amp;lt;service&amp;gt;   &lt;span class="c"&gt;# Don't start on boot&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key File Paths
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SSH server configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.ssh/id_rsa&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Your SSH private key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.ssh/id_rsa.pub&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Your SSH public key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Public keys allowed to login&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.ssh/config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Client SSH shortcuts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/www/html/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default web root (Apache + Nginx)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/apache2/sites-available/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Apache virtual host configs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/apache2/sites-enabled/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Active Apache sites (symlinks)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/nginx/sites-available/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nginx server block configs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/nginx/sites-enabled/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Active Nginx sites (symlinks)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/log/apache2/error.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Apache error log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/log/nginx/error.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nginx error log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/passwd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User account information&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/group&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Group definitions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/etc/shadow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Encrypted passwords (root only)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Permission Quick Reference
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;644 &lt;span class="o"&gt;=&lt;/span&gt; rw-r--r--   &lt;span class="c"&gt;# Standard file permission&lt;/span&gt;
755 &lt;span class="o"&gt;=&lt;/span&gt; rwxr-xr-x   &lt;span class="c"&gt;# Standard directory / script permission&lt;/span&gt;
700 &lt;span class="o"&gt;=&lt;/span&gt; rwx------   &lt;span class="c"&gt;# Private (owner only)&lt;/span&gt;
600 &lt;span class="o"&gt;=&lt;/span&gt; rw-------   &lt;span class="c"&gt;# SSH keys&lt;/span&gt;
777 &lt;span class="o"&gt;=&lt;/span&gt; rwxrwxrwx   &lt;span class="c"&gt;# NEVER USE (security risk)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Docker Quick Reference
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; ubuntu bash        &lt;span class="c"&gt;# Interactive shell&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 nginx    &lt;span class="c"&gt;# Background + port map&lt;/span&gt;
docker run &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/app ubuntu  &lt;span class="c"&gt;# Volume mount&lt;/span&gt;
docker ps &lt;span class="nt"&gt;-a&lt;/span&gt;                      &lt;span class="c"&gt;# List all containers&lt;/span&gt;
docker stop &lt;span class="si"&gt;$(&lt;/span&gt;docker ps &lt;span class="nt"&gt;-q&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;       &lt;span class="c"&gt;# Stop all running&lt;/span&gt;
docker &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;docker ps &lt;span class="nt"&gt;-aq&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;        &lt;span class="c"&gt;# Remove all containers&lt;/span&gt;
docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; bash         &lt;span class="c"&gt;# Shell into running container&lt;/span&gt;
CTRL+P &lt;span class="k"&gt;then &lt;/span&gt;CTRL+Q               &lt;span class="c"&gt;# Detach without stopping&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Bash Scripting Quick Reference
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash                        # Shebang (always first line)&lt;/span&gt;
&lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="nv"&gt;$2&lt;/span&gt; &lt;span class="nv"&gt;$# $@&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;                    &lt;span class="c"&gt;# Args, count, all, exit code&lt;/span&gt;
&lt;span class="nb"&gt;read &lt;/span&gt;VAR                           &lt;span class="c"&gt;# Read user input&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; condition &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; ... &lt;span class="k"&gt;fi&lt;/span&gt;      &lt;span class="c"&gt;# Conditional&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;pattern&lt;span class="p"&gt;)&lt;/span&gt; ... &lt;span class="p"&gt;;;&lt;/span&gt; &lt;span class="k"&gt;esac&lt;/span&gt;  &lt;span class="c"&gt;# Flag handling&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;item &lt;span class="k"&gt;in &lt;/span&gt;list&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; ... &lt;span class="k"&gt;done&lt;/span&gt;      &lt;span class="c"&gt;# Loop&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-czf&lt;/span&gt; name.tar.gz &lt;span class="nb"&gt;dir&lt;/span&gt;/         &lt;span class="c"&gt;# Create archive&lt;/span&gt;
&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt; file             &lt;span class="c"&gt;# Text processing&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; file ... EOF          # Heredoc
command &amp;gt; file 2&amp;gt;&amp;amp;1               # Redirect all output
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Good luck on your exam! Practice these commands in the terminal — reading is not enough, you need muscle memory!&lt;/strong&gt; 🚀&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>cli</category>
      <category>devops</category>
      <category>linux</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
