Your complete guide from beginner to Linux mastery
๐ฏ Learning Paths
๐ฑ Beginner Path (Essential Commands)
Start here if you’re new to Linux:
- Basic Navigation โ Learn to move around
- File Operations โ Create, copy, move files
- Text Viewing โ Read file contents
- Basic Permissions โ File security basics
- Essential Commands โ Must-know commands
๐ Intermediate Path (System Management)
Ready for more? Continue with:
- Process Management โ Control running programs
- System Monitoring โ Watch system health
- Network Basics โ Network commands
- Package Management โ Install software
- File System โ Disk and mount operations
๐ช Advanced Path (Professional Skills)
Master these for system administration:
- Security & Hardening โ Secure your system
- Performance Tuning โ Optimize performance
- Advanced Scripting โ Automation
- System Administration โ Full system control
- Troubleshooting โ Problem solving
Table of Contents
- ๐ฑ Beginner Essentials
- ๐ File & Directory Operations
- ๐ File Permissions & Ownership
- ๐ Text Processing
- ๐ System Information
- โ๏ธ Process Management
- ๐ Network Operations
- ๐ฆ Archive & Compression
- ๐ ๏ธ Package Management
- ๐ฅ User Management
- ๐ง System Control
- ๐พ File System
- ๐ Environment Variables
- ๐ Redirection & Pipes
- ๐ Search & Find
- ๐ System Monitoring
- ๐ SSH & Remote Access
- โฐ Cron Jobs
- ๐ Git Commands
- โจ๏ธ Keyboard Shortcuts
- ๐ Advanced Topics
- ๐ก๏ธ Security & Hardening
- โก Performance Tuning
- ๐ Advanced Scripting
- ๐ง System Administration
- ๐ฉบ Troubleshooting & Diagnostics
- ๐ Learning Resources
๐ฑ Beginner Essentials
First Steps in Linux
๐ก Tip: Start with these commands. Practice each one until it becomes natural!
# Get help for any command
man command_name # Detailed manual (press 'q' to quit)
command_name --help # Quick help
info command_name # Info documentation
# Your safety net
history # See previous commands
!! # Repeat last command
!n # Repeat command number n from historyBashMust-Know Commands for Day 1
# Essential for survival
pwd # "Where am I?" - shows current directory
ls # "What's here?" - lists files
cd # "Take me home" - go to home directory
clear # "Clean slate" - clear terminal screen
exit # "I'm done" - close terminalBashCommon Beginner Mistakes & Solutions
# โ WRONG: Typing commands in caps
LS # Linux is case-sensitive!
# โ
CORRECT:
ls
# โ WRONG: Forgetting sudo for system changes
apt install package # Permission denied
# โ
CORRECT:
sudo apt install package
# โ WRONG: Using rm without thinking
rm -rf * # NEVER do this in wrong directory!
# โ
SAFE: Always check where you are first
pwd && ls -la # Check location and contents firstBash๐ File & Directory Operations
Basic Navigation
๐ Learning Tip: Think of directories as folders in a filing cabinet
# Navigation basics
pwd # Print working directory (where you are)
ls # List directory contents
ls -l # Long format (permissions, size, date)
ls -la # Include hidden files (starting with .)
ls -lh # Human-readable sizes (KB, MB, GB)
ls -ltr # Sort by time, newest last
ls -S # Sort by size
# Directory shortcuts
cd ~ # Home directory (~username)
cd / # Root directory
cd .. # Parent directory (one level up)
cd ../.. # Two levels up
cd - # Previous directory (toggle)
cd /path/to/directory # Absolute path
cd relative/path # Relative pathBashCreating & Removing
โ ๏ธ Warning: Be very careful with rm commands – deleted files are hard to recover!
# Creating
mkdir dirname # Create single directory
mkdir -p path/to/dir # Create parent directories if needed
mkdir {dir1,dir2,dir3} # Create multiple directories
touch filename # Create empty file or update timestamp
touch file{1..5}.txt # Create file1.txt through file5.txt
# Removing (be careful!)
rmdir dirname # Remove empty directory only
rm filename # Remove file (prompts if write-protected)
rm -i filename # Interactive removal (asks for confirmation)
rm -r dirname # Remove directory and contents recursively
rm -f filename # Force remove (no prompts)
rm -rf dirname # Force remove directory (DANGEROUS!)
# Safer alternatives
mkdir -p ~/.trash # Create personal trash
mv unwanted ~/.trash/ # Move to trash instead of rmBashCopying & Moving
๐ก Pro Tip: Use -i flag to avoid accidentally overwriting files
# Basic copying
cp source dest # Copy file
cp source1 source2 dest_dir/ # Copy multiple files to directory
cp -r source_dir dest_dir # Copy directory recursively
cp -i source dest # Interactive (ask before overwrite)
cp -u source dest # Update (copy only if newer)
cp -a source dest # Archive mode (preserves everything)
# Advanced copying
cp -p source dest # Preserve timestamps and permissions
cp --backup source dest # Create backup of destination if exists
rsync -av src/ dest/ # Better for large files/directories
# Moving/Renaming
mv source dest # Move file or rename
mv *.txt ~/documents/ # Move all .txt files to documents
mv oldname newname # Rename file or directory
mv -i source dest # Interactive mode
mv -u source dest # Update mode (move only if newer)BashFile Linking
๐ Understanding: Hard links vs Symbolic links
# Hard links (same file, different names)
ln target linkname # Create hard link
# - Both names point to same data
# - Deleting one doesn't affect the other
# - Can't cross filesystem boundaries
# Symbolic links (shortcuts)
ln -s target linkname # Create symbolic link
ln -sf target linkname # Force create (overwrite if exists)
# - Points to original file
# - Breaks if original is moved/deleted
# - Can cross filesystem boundaries
# Link management
readlink linkname # Show what link points to
find . -type l # Find all symbolic links
ls -l linkname # Shows link target in listingBash๐ File Permissions & Ownership
Understanding Permissions
๐ Core Concept: Every file has permissions for User, Group, and Others
# Permission format: drwxrwxrwx
# d = directory (- for files)
# rwx = read, write, execute for user
# rwx = read, write, execute for group
# rwx = read, write, execute for others
# Numeric representation
# r = 4, w = 2, x = 1
# rwx = 4+2+1 = 7
# r-x = 4+0+1 = 5
# r-- = 4+0+0 = 4BashCommon Permission Patterns
# Files
644 (rw-r--r--) # Standard file: owner read/write, others read
600 (rw-------) # Private file: owner only
755 (rwxr-xr-x) # Executable: owner full, others read/execute
700 (rwx------) # Private executable: owner only
# Directories
755 (rwxr-xr-x) # Standard directory: owner full, others browse
700 (rwx------) # Private directory: owner only
775 (rwxrwxr-x) # Group writable: owner+group full, others browseBashPermission Commands
# Numeric mode (fastest)
chmod 755 filename # Set specific permissions
chmod 644 *.txt # Set permissions for all .txt files
# Symbolic mode (clearer)
chmod u+x filename # Add execute for user
chmod g-w filename # Remove write for group
chmod o+r filename # Add read for others
chmod a+x filename # Add execute for all (user, group, others)
chmod u=rwx,g=rx,o=r filename # Set exact permissions
# Recursive permissions
chmod -R 755 directory # Apply to directory and all contents
find /path -type f -exec chmod 644 {} \; # Files only
find /path -type d -exec chmod 755 {} \; # Directories onlyBashOwnership
# Basic ownership
chown user filename # Change file owner
chown user:group file # Change owner and group
chgrp group filename # Change group only
chown -R user:group dir # Change recursively
# Advanced ownership
chown --reference=ref_file target_file # Copy ownership from another file
chown $(whoami) filename # Change to current userBashSpecial Permissions
# Setuid (runs with owner's permissions)
chmod u+s executable # Set setuid bit
chmod 4755 executable # Numeric with setuid
# Setgid (inherits group ownership)
chmod g+s directory # Set setgid on directory
chmod 2755 directory # Numeric with setgid
# Sticky bit (only owner can delete)
chmod +t directory # Set sticky bit
chmod 1755 directory # Numeric with sticky bitBash๐ Text Processing
Text Viewing Commands
๐ก Choose the right tool: cat for small files, less for large files
# Basic viewing
cat filename # Display entire file
cat -n filename # Show line numbers
cat -b filename # Number non-empty lines only
cat -A filename # Show all characters (tabs, line endings)
# Paged viewing (better for large files)
less filename # View file page by page
# In less: Space=next page, b=previous page, q=quit, /=search
more filename # Simple pager (less features than less)
# Partial viewing
head filename # First 10 lines
head -n 20 filename # First 20 lines
head -c 100 filename # First 100 characters
tail filename # Last 10 lines
tail -n 50 filename # Last 50 lines
tail -f filename # Follow file (great for logs)
tail -F filename # Follow file, handle rotationBashText Editing
๐ Editor Choice: nano for beginners, vim for power users
# Simple editors
nano filename # User-friendly editor
# Ctrl+X to exit, Ctrl+O to save
gedit filename # GUI text editor (if available)
# Advanced editors
vim filename # Powerful modal editor
emacs filename # Feature-rich editor
# Quick inline editing
echo "new content" > file # Overwrite file
echo "append this" >> file # Append to fileBashText Search & Filtering
๐ช Power Tool: grep is your best friend for finding text
# Basic grep
grep "pattern" file # Search for pattern
grep -i "pattern" file # Case insensitive
grep -n "pattern" file # Show line numbers
grep -v "pattern" file # Invert match (exclude lines)
grep -c "pattern" file # Count matching lines
grep -l "pattern" *.txt # List files containing pattern
# Advanced grep
grep -r "pattern" directory # Recursive search
grep -E "pat1|pat2" file # Extended regex (OR)
grep -w "word" file # Match whole words only
grep -A 3 "pattern" file # Show 3 lines after match
grep -B 3 "pattern" file # Show 3 lines before match
grep -C 3 "pattern" file # Show 3 lines around match
# Regex patterns
grep "^start" file # Lines starting with "start"
grep "end$" file # Lines ending with "end"
grep "[0-9]" file # Lines containing digits
grep "^$" file # Empty linesBashText Manipulation & Processing
โก Power Combo: Combine these tools with pipes for complex processing
# Stream editing with sed
sed 's/old/new/' file # Replace first occurrence per line
sed 's/old/new/g' file # Replace all occurrences
sed 's/old/new/gi' file # Case insensitive replacement
sed '5d' file # Delete line 5
sed '1,5d' file # Delete lines 1-5
sed -n '10,20p' file # Print only lines 10-20
# Column processing with awk
awk '{print $1}' file # Print first column
awk '{print $NF}' file # Print last column
awk '{print $1, $3}' file # Print columns 1 and 3
awk -F: '{print $1}' /etc/passwd # Use : as delimiter
awk 'NR>1' file # Skip first line
awk 'length($0) > 80' file # Lines longer than 80 characters
# Sorting and uniqueness
sort filename # Sort lines alphabetically
sort -n filename # Sort numerically
sort -r filename # Reverse sort
sort -k2 filename # Sort by second column
sort -u filename # Sort and remove duplicates
uniq filename # Remove adjacent duplicates
uniq -c filename # Count occurrences
uniq -d filename # Show only duplicates
# Text manipulation
cut -d: -f1 /etc/passwd # Cut by delimiter, field 1
cut -c1-10 file # Cut characters 1-10
tr 'a-z' 'A-Z' < file # Convert to uppercase
tr -d ' ' < file # Delete spaces
tr -s ' ' < file # Squeeze repeated spacesBashFile Comparison
# Compare files
diff file1 file2 # Show differences
diff -u file1 file2 # Unified diff format
diff -y file1 file2 # Side-by-side comparison
cmp file1 file2 # Binary comparison
comm file1 file2 # Compare sorted filesBashWord & Character Counting
wc filename # Lines, words, characters
wc -l filename # Count lines only
wc -w filename # Count words only
wc -c filename # Count characters only
wc -m filename # Count multibyte charactersBash๐ System Information
System Overview
๐ฏ Quick Health Check: Use these commands to get system status
# System identity
hostname # System name
hostnamectl # Detailed hostname info
uname -a # Complete system information
uname -s # Kernel name
uname -r # Kernel release
uname -m # Machine hardware
arch # Architecture
uptime # System uptime and loadBashHardware Information
๐ก Pro Tip: These commands help with capacity planning and troubleshooting
# CPU information
lscpu # Detailed CPU info
nproc # Number of processing units
cat /proc/cpuinfo # Raw CPU information
lscpu | grep MHz # CPU frequencies
# Memory information
free -h # Memory usage (human readable)
free -m # Memory in MB
cat /proc/meminfo # Detailed memory info
vmstat # Virtual memory statisticsBashStorage & Disk Information
# Disk usage
df -h # Filesystem disk usage
df -i # Inode usage
du -h directory # Directory size
du -sh * # Size of all items in current directory
du -ah . | sort -hr | head -20 # Top 20 largest files/dirs
# Disk and partition info
lsblk # Block devices tree view
lsblk -f # Include filesystem info
fdisk -l # Partition table (requires sudo)
parted -l # Alternative partition viewerBashHardware Devices
# PCI devices
lspci # PCI devices
lspci -v # Verbose PCI info
lspci | grep -i network # Network devices
# USB devices
lsusb # USB devices
lsusb -v # Verbose USB info
# Other hardware
lshw # Complete hardware info (requires sudo)
lshw -short # Summary format
dmidecode # Hardware information from BIOSBashDistribution & Software Information
# OS information
cat /etc/os-release # Standard OS info
lsb_release -a # LSB distribution info
cat /etc/*release # All release files
hostnamectl # System information
# Kernel information
cat /proc/version # Kernel version details
dmesg # Kernel ring buffer
dmesg | tail # Recent kernel messages
# Installed software
dpkg -l # Installed packages (Debian/Ubuntu)
rpm -qa # Installed packages (Red Hat/CentOS)
snap list # Snap packages
flatpak list # Flatpak packagesBashUser & Session Information
# Current user info
whoami # Current username
id # User and group IDs
groups # Groups for current user
finger username # User information
# Logged in users
who # Currently logged in users
w # What users are doing
users # Simple list of users
last # Login history
last username # Specific user's logins
lastlog # Last login for all usersBashโ๏ธ Process Management
Viewing Processes
๐ฏ Choose Your Tool: ps for snapshots, top for real-time monitoring
# Basic process listing
ps # Current user's processes
ps aux # All processes, detailed
ps -ef # All processes, different format
ps -u username # Processes for specific user
ps -C program_name # Processes by program name
# Process tree
pstree # Process tree visualization
pstree -p # Include process IDs
pstree username # Process tree for user
# Finding processes
pgrep process_name # Find process ID by name
pgrep -f "command line" # Search in full command line
pidof program_name # Get PID of programBashReal-time Process Monitoring
# Interactive monitors
top # Classic process monitor
# In top: k=kill, r=renice, q=quit, M=sort by memory
htop # Enhanced process monitor (if installed)
# In htop: F9=kill, F7/F8=nice, F6=sort, F10=quit
# Specialized monitoring
iotop # I/O usage by processes (requires sudo)
nethogs # Network usage by processes
powertop # Power consumption analysisBashProcess Control
โ ๏ธ Kill Signal Guide: Use appropriate signals for clean shutdowns
# Terminating processes
kill PID # Terminate process (SIGTERM)
kill -9 PID # Force kill (SIGKILL) - last resort
kill -15 PID # Graceful termination (SIGTERM)
kill -1 PID # Hangup signal (SIGHUP)
killall process_name # Kill all processes by name
pkill process_name # Kill processes by name (pattern)
pkill -f "command line" # Kill by command line pattern
# Signal reference
kill -l # List all available signals
# Common signals:
# 1 HUP Hangup (reload config)
# 2 INT Interrupt (Ctrl+C)
# 9 KILL Force kill (cannot be caught)
# 15 TERM Terminate gracefully (default)
# 18 CONT Continue process
# 19 STOP Stop processBashBackground Jobs & Job Control
๐ก Workflow: Start jobs in background for long-running tasks
# Job control
command & # Run command in background
nohup command & # Run immune to hangups
nohup command > output.log 2>&1 & # Background with output capture
# Managing jobs
jobs # List active jobs
jobs -l # List with process IDs
fg # Bring last job to foreground
fg %1 # Bring job 1 to foreground
bg # Continue last job in background
bg %1 # Continue job 1 in background
# Suspending/resuming
Ctrl+Z # Suspend current process
Ctrl+C # Interrupt current process
disown %1 # Remove job from shell's job tableBashProcess Priorities
๐ Understanding: Nice values range from -20 (highest) to 19 (lowest)
# Running with different priorities
nice command # Run with default lower priority (+10)
nice -n 10 command # Run with nice value 10
nice -n -5 command # Run with nice value -5 (higher priority)
# Changing priority of running processes
renice 10 PID # Change nice value to 10
renice +5 PID # Increase nice value by 5
renice -5 -p PID # Decrease nice value by 5BashAdvanced Process Management
# Process relationships
ps -eo pid,ppid,cmd # Show parent-child relationships
ps --forest # Show process tree
lsof -p PID # Files opened by process
lsof filename # Processes using file
# System resource usage
pidstat 1 # Per-process statistics
pidstat -p PID 1 # Statistics for specific process
sar -u 1 5 # CPU utilization statisticsBash๐ Network Operations
Network Interface Information
๐ First Step: Always check your network configuration
# Modern network tools (preferred)
ip addr show # Show all network interfaces
ip addr show eth0 # Show specific interface
ip route show # Show routing table
ip link show # Show network devices
# Legacy tools (still widely used)
ifconfig # Show network interfaces
ifconfig eth0 # Show specific interface
route -n # Show routing table
netstat -rn # Show routing tableBashNetwork Connectivity Testing
๐ฏ Troubleshooting Order: ping โ traceroute โ port testing
# Basic connectivity
ping hostname # Test connectivity
ping -c 4 hostname # Ping 4 times only
ping -i 0.5 hostname # Ping every 0.5 seconds
ping6 hostname # IPv6 ping
# Path tracing
traceroute hostname # Trace route to destination
tracepath hostname # Alternative route tracing
mtr hostname # Dynamic traceroute (if installed)
# DNS resolution
nslookup hostname # Basic DNS lookup
dig hostname # Advanced DNS lookup
dig @8.8.8.8 hostname # Use specific DNS server
host hostname # Simple DNS lookupBashPort and Service Information
๐ง Network Diagnostics: Identify what’s running on which ports
# Listening ports and connections
netstat -tuln # Show listening ports
netstat -tulnp # Include process names
ss -tuln # Modern alternative to netstat
ss -tulnp # Include process names
ss -s # Socket statistics summary
# Process-port relationships
lsof -i # All network connections
lsof -i :80 # What's using port 80
lsof -i TCP:22 # TCP connections on port 22
lsof -i @hostname # Connections to specific host
fuser -n tcp 80 # Process using TCP port 80BashNetwork File Transfer
๐ Choose Your Tool: scp for simple, rsync for complex transfers
# Secure copy (scp)
scp file user@host:/path # Copy file to remote host
scp user@host:/path/file . # Copy file from remote host
scp -r directory user@host:/path # Copy directory recursively
scp -P 2222 file user@host:/path # Use specific port
# Remote sync (rsync)
rsync -av local/ user@host:remote/ # Sync directories
rsync -av --delete local/ remote/ # Delete extra files in destination
rsync -av --exclude='*.tmp' src/ dst/ # Exclude patterns
rsync -avz src/ dst/ # Compress during transfer
rsync --progress src/ dst/ # Show progressBashDownload Tools
# Web downloads
wget URL # Download file
wget -O filename URL # Save with specific name
wget -c URL # Continue partial download
wget -r URL # Recursive download
# Advanced downloads
curl URL # Display content
curl -o filename URL # Save to file
curl -L URL # Follow redirects
curl -H "Header: value" URL # Custom headers
curl -d "data" URL # POST dataBashFirewall Management
๐ก๏ธ Security First: Always understand firewall rules before changing them
# UFW (Uncomplicated Firewall) - Ubuntu/Debian
sudo ufw status # Check firewall status
sudo ufw enable # Enable firewall
sudo ufw disable # Disable firewall
sudo ufw allow 22 # Allow SSH
sudo ufw allow 80/tcp # Allow HTTP
sudo ufw deny 23 # Deny telnet
sudo ufw delete allow 80 # Remove rule
sudo ufw reset # Reset to defaults
# iptables (advanced)
sudo iptables -L # List rules
sudo iptables -L -n # List rules with numbers
sudo iptables -F # Flush all rulesBashNetwork Monitoring
# Real-time monitoring
iftop # Network interface monitoring
nethogs # Network usage by process
nload # Network load monitoring
vnstat # Network statistics
# Bandwidth testing
speedtest-cli # Internet speed test (if installed)
iperf3 -s # Start iperf server
iperf3 -c server_ip # Test bandwidth to serverBash๐ฆ Archive & Compression
Tar Archives
๐ฏ Most Common: tar.gz for general use, tar.xz for maximum compression
# Creating archives
tar -cvf archive.tar files # Create tar archive
tar -czvf archive.tar.gz files # Create gzip compressed archive
tar -cjvf archive.tar.bz2 files # Create bzip2 compressed archive
tar -cJvf archive.tar.xz files # Create xz compressed archive
# Extracting archives
tar -xvf archive.tar # Extract tar archive
tar -xzvf archive.tar.gz # Extract gzip archive
tar -xjvf archive.tar.bz2 # Extract bzip2 archive
tar -xJvf archive.tar.xz # Extract xz archive
# Archive information
tar -tvf archive.tar # List archive contents
tar -tzvf archive.tar.gz # List compressed archive contents
# Advanced tar options
tar -czf backup.tar.gz --exclude='*.tmp' /path # Exclude patterns
tar -czf backup.tar.gz -C /path . # Change to directory first
tar -xzf archive.tar.gz -C /destination # Extract to specific locationBashIndividual File Compression
# Gzip compression
gzip filename # Compress file (replaces original)
gzip -k filename # Keep original file
gzip -9 filename # Maximum compression
gunzip filename.gz # Decompress file
zcat filename.gz # View compressed file without extracting
# Bzip2 compression (better compression)
bzip2 filename # Compress file
bzip2 -k filename # Keep original
bunzip2 filename.bz2 # Decompress file
bzcat filename.bz2 # View compressed file
# XZ compression (best compression)
xz filename # Compress file
xz -k filename # Keep original
unxz filename.xz # Decompress file
xzcat filename.xz # View compressed fileBashZip Archives
๐ Cross-platform: Use zip for compatibility with Windows/Mac
# Creating zip archives
zip archive.zip files # Create zip archive
zip -r archive.zip directory # Include directories
zip -9 archive.zip files # Maximum compression
zip -e archive.zip files # Encrypted zip (prompts for password)
# Extracting zip archives
unzip archive.zip # Extract all files
unzip archive.zip -d /path # Extract to specific directory
unzip -l archive.zip # List contents without extracting
unzip -t archive.zip # Test archive integrity
# Advanced zip options
zip -x "*.log" -r archive.zip /path # Exclude patterns
unzip "*.txt" archive.zip # Extract only specific filesBashArchive Management & Information
# File information
file archive.tar.gz # Identify file type
ls -lh *.tar.gz # List archive sizes
# Compression comparison
du -sh directory # Original size
tar -czf - directory | wc -c # Gzip compressed size
tar -cjf - directory | wc -c # Bzip2 compressed size
tar -cJf - directory | wc -c # XZ compressed sizeBashBackup Strategies
๐ก Best Practice: Regular, automated backups with rotation
# Simple backup script
tar -czf backup-$(date +%Y%m%d).tar.gz /important/data
# Incremental backups
find /path -newer /path/to/last-backup -type f | tar -czf incremental.tar.gz -T -
# Remote backup
tar -czf - /important/data | ssh user@backup-server "cat > backup-$(date +%Y%m%d).tar.gz"Bash๐ ๏ธ Package Management
๐ฏ Know Your System: Different distributions use different package managers
Debian/Ubuntu (APT)
๐ก Best Practice: Always update before installing packages
# Repository management
sudo apt update # Update package list
sudo apt upgrade # Upgrade all packages
sudo apt full-upgrade # Upgrade with dependency resolution
sudo apt dist-upgrade # Distribution upgrade
# Package installation
sudo apt install package_name # Install package
sudo apt install package1 package2 # Install multiple packages
sudo apt install -y package_name # Install without prompting
sudo apt reinstall package_name # Reinstall package
# Package removal
sudo apt remove package_name # Remove package (keep config)
sudo apt purge package_name # Remove package and config
sudo apt autoremove # Remove unused dependencies
sudo apt autoclean # Clean package cache
# Package information
apt search package_name # Search for packages
apt show package_name # Show package details
apt list --installed # List installed packages
apt list --upgradable # List upgradable packages
apt depends package_name # Show dependencies
apt rdepends package_name # Show reverse dependenciesBashRed Hat/CentOS/Fedora (YUM/DNF)
๐ Evolution: DNF is the modern replacement for YUM
# YUM (older systems)
sudo yum update # Update all packages
sudo yum install package_name # Install package
sudo yum remove package_name # Remove package
sudo yum search package_name # Search packages
yum list installed # List installed packages
yum info package_name # Package information
# DNF (newer systems - Fedora, RHEL 8+)
sudo dnf update # Update all packages
sudo dnf install package_name # Install package
sudo dnf remove package_name # Remove package
sudo dnf search package_name # Search packages
dnf list installed # List installed packages
dnf info package_name # Package information
sudo dnf autoremove # Remove unused dependenciesBashArch Linux (Pacman)
sudo pacman -Syu # Update system
sudo pacman -S package_name # Install package
sudo pacman -R package_name # Remove package
sudo pacman -Rs package_name # Remove with dependencies
pacman -Ss package_name # Search packages
pacman -Q # List installed packages
pacman -Qi package_name # Package infoBashUniversal Package Managers
Snap Packages
๐ Universal: Works across distributions
snap list # List installed snaps
sudo snap install package_name # Install snap package
sudo snap remove package_name # Remove snap package
snap search package_name # Search snap packages
snap info package_name # Show snap info
sudo snap refresh # Update all snaps
sudo snap refresh package_name # Update specific snapBashFlatpak
flatpak list # List installed flatpaks
sudo flatpak install package_name # Install flatpak
sudo flatpak uninstall package_name # Remove flatpak
flatpak search package_name # Search flatpaks
flatpak update # Update all flatpaksBashAppImage
# Download and run
wget https://url.to/app.AppImage
chmod +x app.AppImage
./app.AppImage # Run directlyBashDevelopment Package Managers
Python (pip)
pip install package_name # Install Python package
pip install --user package_name # Install for current user only
pip install -r requirements.txt # Install from requirements file
pip uninstall package_name # Uninstall package
pip list # List installed packages
pip show package_name # Show package info
pip freeze > requirements.txt # Export package listBashNode.js (npm/yarn)
# NPM
npm install package_name # Install package locally
npm install -g package_name # Install globally
npm uninstall package_name # Uninstall package
npm list # List installed packages
npm update # Update packages
# Yarn
yarn add package_name # Add package
yarn remove package_name # Remove package
yarn global add package_name # Install globally
yarn list # List packagesBashPackage Management Best Practices
๐ก๏ธ Security First: Keep your system updated and verify package sources
# Security updates
sudo apt list --upgradable | grep security # Security updates (Ubuntu)
sudo dnf updateinfo list security # Security updates (Fedora)
# Package verification
apt-cache policy package_name # Check package sources
sudo apt-key list # List GPG keysBash๐ฅ User Management
Current User Information
๐ Know Yourself: Understanding your current context
# Basic user info
whoami # Current username
id # User and group IDs
id username # Specific user's IDs
groups # Current user's groups
groups username # Specific user's groups
# Detailed user information
finger username # User information (if available)
getent passwd username # User database entry
w # Current users and activities
who # Who is logged in
users # Simple list of logged usersBashUser Account Management
๐ Admin Required: Most user management requires sudo privileges
# Adding users
sudo useradd username # Add user (basic)
sudo useradd -m username # Add user with home directory
sudo useradd -m -s /bin/bash username # Add user with specific shell
sudo useradd -m -G group1,group2 username # Add user to groups
# User modification
sudo usermod -aG groupname username # Add user to group
sudo usermod -s /bin/zsh username # Change user shell
sudo usermod -d /new/home username # Change home directory
sudo usermod -l newname oldname # Rename user
sudo usermod -L username # Lock user account
sudo usermod -U username # Unlock user account
# Removing users
sudo userdel username # Delete user (keep home)
sudo userdel -r username # Delete user and home directoryBashGroup Management
# Group operations
sudo groupadd groupname # Create group
sudo groupdel groupname # Delete group
sudo gpasswd -a username groupname # Add user to group
sudo gpasswd -d username groupname # Remove user from group
# Group information
getent group # List all groups
getent group groupname # Specific group info
lid -g groupname # List group membersBashPassword Management
๐ Security: Use strong passwords and consider password policies
# Password changes
passwd # Change own password
sudo passwd username # Change user's password
sudo passwd -l username # Lock user password
sudo passwd -u username # Unlock user password
sudo passwd -e username # Expire password (force change)
# Password information
sudo chage -l username # Password aging info
sudo chage username # Interactive password aging
chage -M 90 username # Set max password ageBashUser Sessions & Login
# Login history
last # Recent logins
last username # Specific user's logins
lastlog # Last login for all users
lastlog -u username # Last login for specific user
# Current sessions
w # Detailed who information
who -a # All login information
who -b # Last system boot timeBashSwitching Users
โก Quick Switch: Efficient user switching methods
# User switching
su username # Switch to user (requires password)
su - # Switch to root with environment
su - username # Switch with user's environment
sudo -u username command # Run command as user
sudo -i # Interactive root shell
sudo -s # Shell as root
# Exit user sessions
exit # Exit current shell/user
logout # Logout (bash specific)
Ctrl+D # EOF signal (exit)Bash๐ง System Control
Service Management (systemd)
๐ฏ Modern Standard: systemd is used by most modern Linux distributions
# Service control
sudo systemctl start service_name # Start service
sudo systemctl stop service_name # Stop service
sudo systemctl restart service_name # Restart service
sudo systemctl reload service_name # Reload configuration
sudo systemctl enable service_name # Enable at boot
sudo systemctl disable service_name # Disable at boot
# Service status
systemctl status service_name # Detailed service status
systemctl is-active service_name # Check if service is running
systemctl is-enabled service_name # Check if service is enabled
systemctl is-failed service_name # Check if service failed
# Service listing
systemctl list-units --type=service # List all services
systemctl list-units --failed # List failed services
systemctl list-unit-files --type=service # List all service filesBashLegacy Service Management (SysV Init)
๐ Legacy Systems: Still found on older distributions
# SysV service control
sudo service service_name start # Start service
sudo service service_name stop # Stop service
sudo service service_name restart # Restart service
sudo service service_name status # Service status
# Update-rc.d (Debian/Ubuntu)
sudo update-rc.d service_name enable # Enable service
sudo update-rc.d service_name disable # Disable service
# chkconfig (Red Hat/CentOS)
sudo chkconfig service_name on # Enable service
sudo chkconfig service_name off # Disable service
chkconfig --list # List servicesBashSystem Power Management
โ ๏ธ Critical: These commands affect the entire system
# Shutdown and restart
sudo shutdown -h now # Shutdown immediately
sudo shutdown -h +10 # Shutdown in 10 minutes
sudo shutdown -r now # Restart immediately
sudo shutdown -r +5 # Restart in 5 minutes
sudo shutdown -c # Cancel scheduled shutdown
# Alternative commands
sudo halt # Halt the system
sudo poweroff # Power off the system
sudo reboot # Restart the system
# Modern systemd commands
sudo systemctl poweroff # Power off
sudo systemctl reboot # Restart
sudo systemctl suspend # Suspend to RAM
sudo systemctl hibernate # Hibernate to disk
sudo systemctl hybrid-sleep # Hybrid suspendBashSystem Runlevels/Targets
๐ฏ System States: Different modes of operation
# Systemd targets (modern)
systemctl get-default # Show default target
sudo systemctl set-default multi-user.target # Set default target
systemctl list-units --type=target # List all targets
sudo systemctl isolate rescue.target # Switch to rescue mode
# Common targets:
# poweroff.target - System shutdown
# rescue.target - Single user mode
# multi-user.target - Multi-user, no GUI
# graphical.target - Multi-user with GUI
# reboot.target - System restartBashSystem Logs & Journaling
# Systemd journal
journalctl # View all logs
journalctl -f # Follow logs in real-time
journalctl -u service_name # Logs for specific service
journalctl --since "2024-01-01" # Logs since date
journalctl --until "1 hour ago" # Logs until time
journalctl -p err # Error priority and above
journalctl --disk-usage # Journal disk usage
# Traditional logs
tail -f /var/log/syslog # Follow system log
tail -f /var/log/messages # Follow messages log
less /var/log/auth.log # Authentication log
dmesg # Kernel ring buffer
dmesg -T # Human-readable timestampsBash๐พ File System
๐๏ธ Foundation: Understanding the filesystem is crucial for Linux mastery
Filesystem Hierarchy
๐ Navigation Map: Standard Linux directory structure
/ # Root directory - everything starts here
โโโ bin/ # Essential command binaries
โโโ boot/ # Boot loader files, kernel images
โโโ dev/ # Device files (hardware interfaces)
โโโ etc/ # Configuration files
โโโ home/ # User home directories
โโโ lib/ # Essential shared libraries
โโโ media/ # Removable media mount points
โโโ mnt/ # Temporary mount points
โโโ opt/ # Optional software packages
โโโ proc/ # Process and kernel information
โโโ root/ # Root user's home directory
โโโ run/ # Runtime data
โโโ sbin/ # System administration binaries
โโโ srv/ # Service data
โโโ sys/ # Device and kernel interface
โโโ tmp/ # Temporary files
โโโ usr/ # User programs and data
โโโ var/ # Variable data (logs, cache, etc.)BashMounting and Unmounting
๐ Connection: Connecting storage devices to the filesystem
# View mounted filesystems
mount # Show all mounted filesystems
mount | grep ext4 # Show only ext4 filesystems
findmnt # Tree view of mounted filesystems
findmnt / # Show root filesystem info
df -h # Disk usage of mounted filesystems
# Manual mounting
sudo mount /dev/sdb1 /mnt # Mount device to /mnt
sudo mount -t ext4 /dev/sdb1 /mnt # Specify filesystem type
sudo mount -o ro /dev/sdb1 /mnt # Mount read-only
sudo mount -o rw,noexec /dev/sdb1 /mnt # Mount with options
# Unmounting
sudo umount /mnt # Unmount by mount point
sudo umount /dev/sdb1 # Unmount by device
sudo umount -l /mnt # Lazy unmount (when busy)
sudo umount -f /mnt # Force unmount (dangerous)
# Check what's keeping filesystem busy
lsof /mnt # List open files in /mnt
fuser -v /mnt # Show processes using /mntBashFilesystem Types & Creation
๐ง Formatting: Different filesystems for different needs
# Identify filesystem type
file -s /dev/sdb1 # Identify filesystem
blkid /dev/sdb1 # Show filesystem UUID and type
lsblk -f # Show all block devices with filesystem info
# Create filesystems
sudo mkfs.ext4 /dev/sdb1 # Create ext4 filesystem
sudo mkfs.xfs /dev/sdb1 # Create XFS filesystem
sudo mkfs.btrfs /dev/sdb1 # Create Btrfs filesystem
sudo mkfs.ntfs /dev/sdb1 # Create NTFS filesystem
# Filesystem options
sudo mkfs.ext4 -L "MyDisk" /dev/sdb1 # Create with label
sudo mkfs.ext4 -b 4096 /dev/sdb1 # Specify block size
sudo tune2fs -L "NewLabel" /dev/sdb1 # Change ext4 labelBashDisk Partitioning
โ ๏ธ Dangerous: Always backup data before partitioning
# View disk information
lsblk # List block devices
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT # Custom columns
sudo fdisk -l # List all disk partitions
sudo parted -l # Alternative partition viewer
# Partition management
sudo fdisk /dev/sdb # Interactive partition editor
sudo parted /dev/sdb # GNU parted (more advanced)
sudo cfdisk /dev/sdb # Curses-based partition editor
# Partition table types
sudo parted /dev/sdb mklabel msdos # Create MBR partition table
sudo parted /dev/sdb mklabel gpt # Create GPT partition tableBashFilesystem Checking & Repair
๐ฉบ Health Check: Regular filesystem maintenance
# Check filesystem integrity
sudo fsck /dev/sdb1 # Check and repair filesystem
sudo fsck -n /dev/sdb1 # Check only (no repairs)
sudo fsck -y /dev/sdb1 # Auto-answer yes to repairs
sudo fsck -f /dev/sdb1 # Force check even if clean
# Ext4 specific tools
sudo e2fsck /dev/sdb1 # Check ext4 filesystem
sudo tune2fs -l /dev/sdb1 # Display ext4 parameters
sudo tune2fs -c 30 /dev/sdb1 # Set max mount count check
sudo tune2fs -i 180d /dev/sdb1 # Set check interval (180 days)
# XFS specific tools
sudo xfs_check /dev/sdb1 # Check XFS filesystem
sudo xfs_repair /dev/sdb1 # Repair XFS filesystemBashFilesystem Usage & Monitoring
# Disk usage analysis
du -h /path # Directory size
du -sh /path/* # Size of each item in directory
du -ah /path | sort -hr | head -20 # Top 20 largest files/dirs
ncdu /path # Interactive disk usage analyzer
# Inode usage
df -i # Show inode usage
ls -i filename # Show file inode number
find /path -printf "%i %p\n" # List files with inode numbers
# Real-time monitoring
watch -n 1 'df -h' # Monitor disk usage
iostat -x 1 # I/O statistics
iotop # I/O usage by processBashAdvanced Filesystem Operations
# Loop devices (mount files as filesystems)
sudo mount -o loop disk.img /mnt # Mount disk image
sudo losetup -a # List loop devices
sudo losetup /dev/loop0 disk.img # Attach loop device
sudo losetup -d /dev/loop0 # Detach loop device
# Network filesystems
sudo mount -t nfs server:/path /mnt # Mount NFS
sudo mount -t cifs //server/share /mnt -o username=user # Mount SMB/CIFS
# Filesystem quotas
sudo quotacheck -cug / # Initialize quotas
sudo quotaon / # Enable quotas
quota -u username # Check user quota
sudo edquota username # Edit user quotaBashAutomatic Mounting (/etc/fstab)
โ๏ธ Automation: Configure filesystems to mount at boot
# Edit fstab
sudo nano /etc/fstab
# Fstab format:
# device mountpoint filesystem options dump pass
/dev/sdb1 /data ext4 defaults 0 2
UUID=1234-5678 /backup xfs defaults,noatime 0 2
# Test fstab without rebooting
sudo mount -a # Mount all fstab entries
sudo findmnt --verify # Verify fstab syntax
# Common fstab options:
# defaults - rw,suid,dev,exec,auto,nouser,async
# noatime - Don't update access times (performance)
# ro - Read only
# noexec - Don't allow execution
# user - Allow users to mountBash๐ Environment Variables
Understanding Environment Variables
๐ง System Configuration: Variables that control system and application behavior
# View environment variables
env # Show all environment variables
printenv # Alternative to env
printenv PATH # Show specific variable
echo $PATH # Display PATH variable
echo $HOME # Display home directory
set # Show all variables (including shell variables)BashCommon Environment Variables
# System variables
$HOME # User's home directory
$USER # Current username
$PATH # Executable search path
$PWD # Current working directory
$OLDPWD # Previous working directory
$SHELL # Current shell
$TERM # Terminal type
$LANG # System language
$TZ # Timezone
# Process variables
$PID # Current process ID
$PPID # Parent process ID
$? # Exit status of last command
$$ # Current shell process IDBashSetting Environment Variables
โก Scope Matters: Understand temporary vs permanent variables
# Temporary variables (current session only)
export VAR=value # Set environment variable
VAR=value # Set shell variable (not exported)
export PATH=$PATH:/new/path # Add to PATH
unset VAR # Remove variable
# Permanent variables (various scopes)
# User-specific (add to ~/.bashrc or ~/.profile)
echo 'export MYVAR=value' >> ~/.bashrc
source ~/.bashrc # Reload configuration
# System-wide (add to /etc/environment)
echo 'MYVAR=value' | sudo tee -a /etc/environment
# Session-specific profile
nano ~/.bash_profile # Login shell configuration
nano ~/.bashrc # Non-login shell configurationBashPATH Management
๐ฃ๏ธ Command Discovery: How the system finds executable programs
# View current PATH
echo $PATH # Display PATH
echo $PATH | tr ':' '\n' # Show PATH entries line by line
# Modify PATH
export PATH=$PATH:/new/directory # Add directory to end
export PATH=/new/directory:$PATH # Add directory to beginning
export PATH=/usr/local/bin:/usr/bin:/bin # Replace entire PATH
# Persistent PATH changes
echo 'export PATH=$PATH:~/bin' >> ~/.bashrc # Add to bashrcBashShell Configuration Files
๐ Load Order: Understanding which files are loaded when
# Bash configuration files (load order)
/etc/profile # System-wide login profile
~/.bash_profile # User login profile
~/.bash_login # Alternative login profile
~/.profile # POSIX compatible profile
~/.bashrc # Non-login shell configuration
~/.bash_logout # Executed on logout
# Reload configurations
source ~/.bashrc # Reload bashrc
. ~/.bashrc # Alternative to source
exec bash # Restart bash shellBashAdvanced Variable Operations
# Variable expansion
echo ${VAR} # Same as $VAR but clearer
echo ${VAR:-default} # Use default if VAR is unset
echo ${VAR:=default} # Set VAR to default if unset
echo ${VAR:+alternate} # Use alternate if VAR is set
echo ${#VAR} # Length of variable
# String manipulation
echo ${VAR#pattern} # Remove shortest match from beginning
echo ${VAR##pattern} # Remove longest match from beginning
echo ${VAR%pattern} # Remove shortest match from end
echo ${VAR%%pattern} # Remove longest match from end
echo ${VAR/old/new} # Replace first occurrence
echo ${VAR//old/new} # Replace all occurrencesBash๐ Redirection & Pipes
Understanding Streams
๐ Data Flow: Every process has three default streams
# Standard streams
stdin (0) # Standard input (keyboard)
stdout (1) # Standard output (screen)
stderr (2) # Standard error (screen)BashOutput Redirection
๐ Capture Output: Send command output to files
# Basic redirection
command > file # Redirect stdout to file (overwrite)
command >> file # Redirect stdout to file (append)
command 2> file # Redirect stderr to file
command 2>> file # Redirect stderr to file (append)
command &> file # Redirect both stdout and stderr
command > file 2>&1 # Redirect stderr to stdout, then to file
# Advanced redirection
command > /dev/null # Discard output
command 2> /dev/null # Discard errors
command &> /dev/null # Discard all output
command > output.txt 2> error.txt # Separate stdout and stderrBashInput Redirection
๐ฅ Feed Input: Provide input to commands from files
# Input redirection
command < file # Use file as input
command <<< "string" # Use string as input
# Here documents
command << EOF
line 1
line 2
EOF
# Here strings
grep "pattern" <<< "$variable"BashPipes
๐ Chain Commands: Connect output of one command to input of another
# Basic pipes
command1 | command2 # Pipe stdout of command1 to stdin of command2
command1 | command2 | command3 # Chain multiple commands
# Useful pipe combinations
ls -la | grep "txt" # List .txt files
ps aux | grep "process" # Find specific process
cat file | sort | uniq # Sort and remove duplicates
history | grep "command" # Search command historyBashAdvanced Piping
๐ช Power Tools: Advanced pipe operations
# Tee (write to file AND pass through)
command | tee file # Write to file and display
command | tee -a file # Append to file and display
command | tee file1 file2 # Write to multiple files
# Named pipes (FIFOs)
mkfifo mypipe # Create named pipe
echo "data" > mypipe & # Write to pipe (background)
cat < mypipe # Read from pipe
# Process substitution
diff <(command1) <(command2) # Compare outputs of two commands
command < <(other_command) # Use command output as inputBashPipe Utilities
# Useful pipe utilities
xargs # Convert stdin to command arguments
find . -name "*.txt" | xargs grep "pattern"
parallel # Run commands in parallel
ls *.txt | parallel gzip # Compress files in parallel
pv # Pipe viewer (show progress)
cat large_file | pv | gzip > output.gzBashError Handling in Pipes
๐ Debugging: Understanding pipe behavior
# Pipe failure handling
set -o pipefail # Make pipe fail if any command fails
command1 | command2; echo $? # Check exit status
command1 | command2 || echo "Pipe failed"
# Multiple streams in pipes
command 2>&1 | grep "error" # Include stderr in pipe
command |& grep "pattern" # Bash shorthand for 2>&1 |Bash๐ Search & Find
File Finding with find
๐ Most Powerful: find can locate files by any criteria
# Basic find usage
find /path -name "filename" # Find by exact name
find /path -name "*.txt" # Find by pattern
find /path -iname "*.TXT" # Case insensitive search
find . -name "*config*" # Find files containing "config"
# Find by type
find /path -type f # Files only
find /path -type d # Directories only
find /path -type l # Symbolic links only
find /path -type f -name "*.log" # Log files only
# Find by size
find /path -size +100M # Files larger than 100MB
find /path -size -1k # Files smaller than 1KB
find /path -size 50c # Files exactly 50 bytes
find /path -empty # Empty files and directories
# Find by time
find /path -mtime -7 # Modified in last 7 days
find /path -mtime +30 # Modified more than 30 days ago
find /path -atime -1 # Accessed in last day
find /path -ctime -1 # Changed in last day
find /path -newer reference_file # Newer than reference fileBashAdvanced find Operations
โก Power Features: Execute actions on found files
# Find with actions
find /path -name "*.tmp" -delete # Delete found files
find /path -name "*.txt" -exec rm {} \; # Delete using exec
find /path -name "*.txt" -exec ls -l {} \; # List details of found files
find /path -type f -exec chmod 644 {} \; # Change permissions
# Find with conditions
find /path -name "*.log" -and -size +10M # AND condition
find /path -name "*.txt" -or -name "*.doc" # OR condition
find /path ! -name "*.tmp" # NOT condition (exclude)
find /path \( -name "*.txt" -or -name "*.doc" \) -and -size +1M
# Find by permissions
find /path -perm 755 # Exact permissions
find /path -perm -755 # At least these permissions
find /path -perm /755 # Any of these permissions
find /path -perm -u+x # User executableBashlocate Command
โก Lightning Fast: Pre-indexed file search
# Basic locate usage
locate filename # Find files by name
locate -i filename # Case insensitive search
locate "*.conf" # Pattern matching
locate -c filename # Count matches only
locate -e filename # Only show existing files
# Update locate database
sudo updatedb # Update file database
sudo updatedb --localpaths=/path # Update specific path only
# Locate configuration
cat /etc/updatedb.conf # View updatedb configurationBashwhich and whereis
๐ฏ Command Location: Find executables and documentation
# Find command location
which command # Find executable in PATH
which -a command # Find all instances in PATH
whereis command # Find binary, source, and manual
whereis -b command # Binary only
whereis -m command # Manual only
whereis -s command # Source only
# Command type information
type command # Show how command would be interpreted
type -a command # Show all interpretations
command -v command # POSIX way to find commandBashContent Search with grep
๐ Text Search: Find text within files
# Basic grep searches
grep "pattern" file # Search in single file
grep "pattern" file1 file2 # Search in multiple files
grep -r "pattern" directory # Recursive search
grep -R "pattern" directory # Recursive with symlinks
# Grep options
grep -i "pattern" file # Case insensitive
grep -v "pattern" file # Invert match (exclude)
grep -n "pattern" file # Show line numbers
grep -H "pattern" file # Show filename (useful with multiple files)
grep -l "pattern" *.txt # List matching files only
grep -L "pattern" *.txt # List non-matching files
grep -c "pattern" file # Count matching lines
# Advanced grep
grep -E "pattern1|pattern2" file # Extended regex (OR)
grep -F "literal string" file # Fixed string (no regex)
grep -w "word" file # Match whole words only
grep -x "exact line" file # Match entire line
grep -A 3 "pattern" file # Show 3 lines after match
grep -B 3 "pattern" file # Show 3 lines before match
grep -C 3 "pattern" file # Show 3 lines around matchBashRegular Expressions in Search
๐ฏ Pattern Power: Master regex for complex searches
# Basic regex patterns
grep "^start" file # Lines starting with "start"
grep "end$" file # Lines ending with "end"
grep "." file # Any character
grep ".*" file # Any number of any characters
grep "[abc]" file # Any of a, b, or c
grep "[a-z]" file # Any lowercase letter
grep "[0-9]" file # Any digit
grep "[^0-9]" file # Anything except digits
# Extended regex (grep -E or egrep)
grep -E "pattern1|pattern2" file # OR operator
grep -E "pattern+" file # One or more occurrences
grep -E "pattern?" file # Zero or one occurrence
grep -E "pattern{3}" file # Exactly 3 occurrences
grep -E "pattern{2,5}" file # 2 to 5 occurrencesBashFile Content Analysis
# Search and count
grep -c "pattern" file # Count matches
grep -o "pattern" file | wc -l # Count pattern occurrences
grep -rn "TODO" . # Find TODO comments with line numbers
# Multiple pattern searches
grep -f patterns.txt file # Search patterns from file
grep -E "(error|warning|critical)" logs/ # Multiple patterns
# Context searches
grep -B5 -A5 "ERROR" logfile # Show context around errors
grep -r --include="*.py" "import" . # Search only Python files
grep -r --exclude="*.log" "pattern" . # Exclude log filesBash๐ System Monitoring
๐ Keep Watch: Monitor system health and performance continuously
Real-time System Monitoring
๐ฏ Live Dashboard: Tools for real-time system observation
# Process and CPU monitoring
top # Classic process monitor
htop # Enhanced process monitor (colored, interactive)
atop # Advanced system monitor
btop # Modern resource monitor
# Memory monitoring
free -h # Memory usage summary
free -h -s 5 # Update every 5 seconds
vmstat 5 # Virtual memory statistics
vmstat 5 10 # Update 5 seconds, 10 times
# I/O monitoring
iotop # I/O usage by process (requires sudo)
iostat 5 # I/O statistics
iostat -x 5 # Extended I/O statistics
iotop -a # Accumulated I/O statisticsBashNetwork Monitoring
# Network interface monitoring
iftop # Network bandwidth usage
iftop -i eth0 # Monitor specific interface
nethogs # Network usage by process
nload # Network load monitor
vnstat # Network traffic logger
# Connection monitoring
netstat -tuln # Show listening ports
ss -tuln # Modern netstat replacement
ss -tulpn # Include process information
watch -n 1 'netstat -tuln' # Continuous monitoringBashSystem Load and Performance
โก Performance Metrics: Understanding system load
# Load average
uptime # System uptime and load
cat /proc/loadavg # Raw load average
w # Load and user activity
# CPU usage
lscpu # CPU information
cat /proc/cpuinfo # Detailed CPU info
mpstat 5 # Multi-processor statistics
sar -u 5 10 # CPU utilization statistics
# System statistics
sar -A # All system statistics
sar -r 5 # Memory utilization
sar -d 5 # Disk activity
sar -n DEV 5 # Network statisticsBashDisk and Storage Monitoring
# Disk usage monitoring
df -h # Filesystem usage
df -i # Inode usage
du -sh /path/* # Directory sizes
ncdu /path # Interactive disk usage
# Real-time disk monitoring
watch -n 1 'df -h' # Monitor disk usage
iotop # Disk I/O by process
iostat -x 1 # Detailed I/O statisticsBashLog File Monitoring
๐ System Logs: Keep track of system events
# System logs
tail -f /var/log/syslog # Follow system log
tail -f /var/log/messages # Follow messages log
tail -f /var/log/secure # Follow security log
journalctl -f # Follow systemd journal
# Application logs
tail -f /var/log/apache2/access.log # Web server access log
tail -f /var/log/nginx/error.log # Nginx error log
find /var/log -name "*.log" -exec tail -f {} + # Follow all log files
# Log analysis
grep "ERROR" /var/log/syslog # Find errors
grep -i "failed" /var/log/auth.log # Find failed authentications
journalctl -p err # Show error priority logsBashProcess Monitoring and Analysis
# Process tree and relationships
pstree # Process tree
pstree -p # Include PIDs
ps auxf # Process tree with ps
# Resource usage by process
pidstat 1 # Per-process statistics
pidstat -r 1 # Memory usage statistics
pidstat -d 1 # Disk I/O statistics
pidstat -u 1 5 # CPU usage, 5 updates
# Process tracking
strace -p PID # Trace system calls
ltrace -p PID # Trace library calls
lsof -p PID # Files opened by processBashSystem Health Checks
๐ฉบ Health Diagnosis: Quick system health assessment
# System overview script
#!/bin/bash
echo "=== System Health Check ==="
echo "Date: $(date)"
echo "Uptime: $(uptime)"
echo "Load Average: $(cat /proc/loadavg)"
echo "Memory: $(free -h | grep Mem)"
echo "Disk Usage: $(df -h / | tail -1)"
echo "Top CPU Processes:"
ps aux --sort=-%cpu | head -5
echo "Top Memory Processes:"
ps aux --sort=-%mem | head -5BashPerformance Monitoring Tools
# Comprehensive monitoring
glances # All-in-one monitoring tool
nmon # IBM's performance monitor
sysstat # System statistics package
dstat # Versatile resource statistics
# Specialized monitoring
powertop # Power consumption analysis
bandwhich # Network utilization by process
bottom # Cross-platform system monitorBash๐ SSH & Remote Access
Basic SSH Operations
๐ Secure Access: Encrypted remote connections
# Basic SSH connection
ssh username@hostname # Connect to remote host
ssh -p 2222 username@hostname # Connect on specific port
ssh -l username hostname # Alternative login syntax
# SSH with options
ssh -v username@hostname # Verbose output (debugging)
ssh -4 username@hostname # Force IPv4
ssh -6 username@hostname # Force IPv6
ssh -C username@hostname # Enable compression
ssh -X username@hostname # Enable X11 forwarding
ssh -Y username@hostname # Trusted X11 forwardingBashSSH Key Authentication
๐ Key-based Security: More secure than passwords
# Generate SSH key pair
ssh-keygen # Generate default RSA key
ssh-keygen -t ed25519 # Generate Ed25519 key (recommended)
ssh-keygen -t rsa -b 4096 # Generate 4096-bit RSA key
ssh-keygen -f ~/.ssh/custom_key # Custom key filename
# Copy public key to remote host
ssh-copy-id username@hostname # Copy default public key
ssh-copy-id -i ~/.ssh/custom_key.pub username@hostname # Copy specific key
# Manual key installation
cat ~/.ssh/id_rsa.pub | ssh username@hostname "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"BashSSH Configuration
โ๏ธ Streamline Access: Configure SSH for convenience
# User SSH config (~/.ssh/config)
Host shortname
HostName full.hostname.com
User username
Port 2222
IdentityFile ~/.ssh/custom_key
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
# Usage after configuration
ssh shortname # Uses configuration aboveBashSSH Tunneling and Port Forwarding
๐ Secure Tunnels: Access services through SSH
# Local port forwarding
ssh -L 8080:localhost:80 username@hostname # Forward local 8080 to remote 80
ssh -L 3306:database:3306 username@gateway # Access database through gateway
# Remote port forwarding
ssh -R 8080:localhost:80 username@hostname # Forward remote 8080 to local 80
# Dynamic port forwarding (SOCKS proxy)
ssh -D 1080 username@hostname # Create SOCKS proxy on port 1080
# Background tunneling
ssh -f -N -L 8080:localhost:80 username@hostname # Run in backgroundBashFile Transfer with SSH
๐ Secure Transfer: Move files securely over SSH
# SCP (Secure Copy)
scp file.txt username@hostname:/path/ # Copy file to remote
scp username@hostname:/path/file.txt . # Copy file from remote
scp -r directory/ username@hostname:/path/ # Copy directory recursively
scp -P 2222 file.txt username@hostname:/path/ # Use specific port
# SFTP (SSH File Transfer Protocol)
sftp username@hostname # Interactive SFTP session
# SFTP commands: get, put, ls, cd, mkdir, rm
# Rsync over SSH
rsync -avz -e ssh local/ username@hostname:remote/ # Sync directories
rsync -avz --delete local/ username@hostname:remote/ # Delete extra files
rsync -avz --progress local/ username@hostname:remote/ # Show progressBashSSH Security and Hardening
๐ก๏ธ Secure Configuration: Harden SSH for production
# Client security
ssh -o StrictHostKeyChecking=yes username@hostname # Strict host checking
ssh -o UserKnownHostsFile=/dev/null username@hostname # Ignore known hosts
# Server configuration (/etc/ssh/sshd_config)
# Recommended security settings:
Port 2222 # Change default port
PermitRootLogin no # Disable root login
PasswordAuthentication no # Use keys only
PubkeyAuthentication yes # Enable key authentication
MaxAuthTries 3 # Limit auth attempts
ClientAliveInterval 300 # Timeout idle connectionsBashSSH Agent and Key Management
๐ Key Management: Efficiently manage SSH keys
# SSH Agent
eval $(ssh-agent) # Start SSH agent
ssh-add # Add default key to agent
ssh-add ~/.ssh/custom_key # Add specific key
ssh-add -l # List loaded keys
ssh-add -D # Remove all keys from agent
# Key management
ssh-keygen -l -f ~/.ssh/id_rsa.pub # Show key fingerprint
ssh-keygen -y -f ~/.ssh/id_rsa # Generate public key from private
ssh-keygen -p -f ~/.ssh/id_rsa # Change key passphraseBashAdvanced SSH Features
# SSH escape sequences (during active session)
~. # Disconnect
~^Z # Suspend SSH
~# # List forwarded connections
~? # Help
# SSH multiplexing (connection sharing)
ssh -M -S ~/.ssh/control-%r@%h:%p username@hostname # Master connection
ssh -S ~/.ssh/control-%r@%h:%p username@hostname # Shared connection
# SSH jump hosts (ProxyJump)
ssh -J jump_host target_host # Connect through jump host
ssh -J user1@host1,user2@host2 target_host # Multiple jumpsBashโฐ Cron Jobs
Understanding Cron
โฑ๏ธ Task Scheduler: Automate recurring tasks
# Cron time format
# โโโโโโโโโโโโโโ minute (0 - 59)
# โ โโโโโโโโโโโโโโ hour (0 - 23)
# โ โ โโโโโโโโโโโโโโ day of month (1 - 31)
# โ โ โ โโโโโโโโโโโโโโ month (1 - 12)
# โ โ โ โ โโโโโโโโโโโโโโ day of week (0 - 6) (Sunday to Saturday)
# โ โ โ โ โ
# * * * * * commandBashCron Management
๐ง Setup Tasks: Create and manage scheduled jobs
# Crontab commands
crontab -e # Edit current user's crontab
crontab -l # List current user's cron jobs
crontab -r # Remove all cron jobs
crontab -u username -e # Edit another user's crontab (requires sudo)
# System-wide cron
sudo nano /etc/crontab # System crontab
ls /etc/cron.{hourly,daily,weekly,monthly}/ # System cron directoriesBashCommon Cron Patterns
# Time examples
0 5 * * * # Daily at 5:00 AM
*/15 * * * * # Every 15 minutes
0 2 * * 0 # Every Sunday at 2:00 AM
0 0 1 * * # First day of every month
0 0 1 1 * # January 1st every year
30 6 * * 1-5 # Weekdays at 6:30 AM
# Special strings (if supported)
@reboot # Run at startup
@yearly or @annually # Run once a year (0 0 1 1 *)
@monthly # Run once a month (0 0 1 * *)
@weekly # Run once a week (0 0 * * 0)
@daily or @midnight # Run once a day (0 0 * * *)
@hourly # Run once an hour (0 * * * *)BashPractical Cron Examples
๐ก Real World: Common automation scenarios
# System maintenance
0 2 * * * /usr/bin/updatedb # Update locate database daily
0 3 * * 0 /usr/bin/apt update && /usr/bin/apt upgrade -y # Weekly updates
*/10 * * * * df -h > /tmp/disk_usage.log # Monitor disk usage
# Backup jobs
0 1 * * * tar -czf /backup/home-$(date +\%Y\%m\%d).tar.gz /home
0 23 * * * rsync -av /important/ user@backup:/backups/
# Log rotation and cleanup
0 0 * * * find /var/log -name "*.log" -mtime +30 -delete
0 4 * * * gzip /var/log/app.log
# Application specific
*/5 * * * * /path/to/script.sh > /dev/null 2>&1 # Run script every 5 minutes
0 */2 * * * curl -s http://localhost/health > /dev/null # Health check every 2 hoursBashCron Environment and Best Practices
โ ๏ธ Important: Cron runs with minimal environment
# Set environment variables in crontab
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com
HOME=/home/username
# Best practices for cron jobs
0 2 * * * /usr/bin/flock -n /tmp/backup.lock /path/to/backup.sh # Prevent overlapping
*/5 * * * * cd /app && ./script.sh >> /var/log/script.log 2>&1 # Proper logging
0 3 * * * [ -x /path/to/script.sh ] && /path/to/script.sh # Check if executableBashDebugging Cron Jobs
๐ Troubleshooting: When cron jobs don’t work
# Check cron service
sudo systemctl status cron # Check cron daemon status
sudo systemctl restart cron # Restart cron daemon
# Check cron logs
grep CRON /var/log/syslog # View cron execution logs
tail -f /var/log/cron # Follow cron log (if exists)
journalctl -u cron # Systemd cron logs
# Test cron job manually
* * * * * echo "Test: $(date)" >> /tmp/crontest.log # Test every minuteBashAlternative Scheduling Tools
# Systemd timers (modern alternative)
sudo systemctl list-timers # List active timers
sudo systemd-analyze calendar "*:0/15" # Test timer expression
# At command (one-time scheduling)
echo "command" | at 15:30 # Run command at 3:30 PM today
echo "backup.sh" | at 2am tomorrow # Run script tomorrow at 2 AM
atq # List pending at jobs
atrm job_number # Remove at jobBash๐ Git Commands
Git Basics
๐ Version Control: Essential for any developer
# Repository setup
git init # Initialize new repository
git clone URL # Clone remote repository
git clone URL directory # Clone to specific directory
git clone --depth 1 URL # Shallow clone (latest commit only)
# Configuration
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
git config --list # Show all configuration
git config --global init.defaultBranch main # Set default branch nameBashBasic Git Workflow
๐ Daily Operations: Common git operations
# Check status and changes
git status # Show repository status
git status -s # Short status format
git diff # Show unstaged changes
git diff --staged # Show staged changes
git diff HEAD~1 # Compare with previous commit
# Staging and committing
git add filename # Stage specific file
git add . # Stage all changes
git add -u # Stage modified files only
git add -A # Stage all changes (including new files)
git reset filename # Unstage file
git commit -m "commit message" # Commit with message
git commit -am "message" # Stage and commit modified files
git commit --amend # Amend last commitBashBranch Management
๐ฟ Branching: Parallel development workflows
# Branch operations
git branch # List local branches
git branch -a # List all branches (local and remote)
git branch branch_name # Create new branch
git checkout branch_name # Switch to branch
git checkout -b branch_name # Create and switch to branch
git switch branch_name # Modern way to switch branches
git switch -c branch_name # Create and switch (modern)
# Branch management
git branch -d branch_name # Delete merged branch
git branch -D branch_name # Force delete branch
git branch -m old_name new_name # Rename branch
git push origin --delete branch_name # Delete remote branchBashRemote Repository Operations
๐ Collaboration: Working with remote repositories
# Remote management
git remote -v # Show remote repositories
git remote add origin URL # Add remote repository
git remote set-url origin URL # Change remote URL
git remote remove origin # Remove remote
# Synchronization
git fetch # Fetch from all remotes
git fetch origin # Fetch from specific remote
git pull # Fetch and merge
git pull --rebase # Fetch and rebase
git push # Push to remote
git push origin branch_name # Push specific branch
git push -u origin branch_name # Push and set upstream
git push --force-with-lease # Safer force pushBashGit History and Logs
๐ History: Understanding project evolution
# View history
git log # Show commit history
git log --oneline # Compact log format
git log --graph # Show branch graph
git log --author="Author Name" # Filter by author
git log --since="2 weeks ago" # Filter by date
git log --grep="pattern" # Search commit messages
git log -p # Show patches (diffs)
git log --stat # Show file statistics
# Show specific commits
git show HEAD # Show last commit
git show commit_hash # Show specific commit
git show HEAD~3 # Show commit 3 steps backBashMerging and Rebasing
๐ Integration: Combining changes from different branches
# Merging
git merge branch_name # Merge branch into current
git merge --no-ff branch_name # No fast-forward merge
git merge --squash branch_name # Squash merge
# Rebasing
git rebase main # Rebase current branch onto main
git rebase -i HEAD~3 # Interactive rebase (last 3 commits)
git rebase --continue # Continue after resolving conflicts
git rebase --abort # Abort rebase operationBashUndoing Changes
โฉ๏ธ Time Travel: Fixing mistakes and reverting changes
# Working directory changes
git checkout -- filename # Discard changes to file
git restore filename # Modern way to discard changes
git clean -fd # Remove untracked files and directories
# Commit-level operations
git reset --soft HEAD~1 # Undo commit, keep changes staged
git reset --mixed HEAD~1 # Undo commit and staging
git reset --hard HEAD~1 # Undo commit and all changes
git revert commit_hash # Create new commit that undoes changes
# Advanced recovery
git reflog # Show reference log
git cherry-pick commit_hash # Apply specific commitBashGit Stashing
๐ฆ Temporary Storage: Save work in progress
# Stash operations
git stash # Stash current changes
git stash save "description" # Stash with description
git stash list # List all stashes
git stash show # Show stash contents
git stash apply # Apply latest stash
git stash apply stash@{2} # Apply specific stash
git stash pop # Apply and remove stash
git stash drop stash@{1} # Delete specific stash
git stash clear # Delete all stashesBashAdvanced Git Features
# Tagging
git tag # List tags
git tag v1.0.0 # Create lightweight tag
git tag -a v1.0.0 -m "Version 1.0.0" # Create annotated tag
git push origin v1.0.0 # Push tag to remote
git push origin --tags # Push all tags
# Searching
git grep "pattern" # Search in tracked files
git log -S "function_name" # Search for code changes
git blame filename # Show who changed each line
git bisect start # Binary search for bugs
# Submodules
git submodule add URL path # Add submodule
git submodule update --init # Initialize submodules
git submodule update --recursive # Update all submodulesBashโจ๏ธ Keyboard Shortcuts
โก Efficiency: Master these shortcuts for lightning-fast terminal work
Terminal Shortcuts
๐ฏ Essential: These shortcuts work in most terminals
# Navigation
Ctrl + A # Move cursor to beginning of line
Ctrl + E # Move cursor to end of line
Ctrl + F # Move cursor forward one character
Ctrl + B # Move cursor backward one character
Alt + F # Move cursor forward one word
Alt + B # Move cursor backward one word
# Editing
Ctrl + U # Delete from cursor to beginning of line
Ctrl + K # Delete from cursor to end of line
Ctrl + W # Delete word before cursor
Alt + D # Delete word after cursor
Ctrl + Y # Paste (yank) previously deleted text
Ctrl + T # Transpose (swap) characters
Alt + T # Transpose words
# Process control
Ctrl + C # Interrupt/terminate current process
Ctrl + Z # Suspend current process (use 'fg' to resume)
Ctrl + D # Send EOF signal (exit shell or end input)
Ctrl + S # Pause terminal output
Ctrl + Q # Resume terminal output
# Screen management
Ctrl + L # Clear screen (same as 'clear' command)
Ctrl + Shift + C # Copy selected text (in most terminals)
Ctrl + Shift + V # Paste from clipboard (in most terminals)BashCommand History Shortcuts
๐ History Navigation: Efficiently reuse previous commands
# History navigation
Ctrl + P # Previous command in history (same as Up arrow)
Ctrl + N # Next command in history (same as Down arrow)
Ctrl + R # Reverse search through history
Ctrl + G # Escape from history search
Alt + . # Insert last argument of previous command
Alt + _ # Insert last argument of previous command (alternative)
# History expansion
!! # Repeat last command
!n # Repeat command number n from history
!string # Repeat last command starting with 'string'
!?string? # Repeat last command containing 'string'
^old^new # Replace 'old' with 'new' in last commandBashAdvanced Terminal Shortcuts
# Tab completion
Tab # Auto-complete command/filename
Tab Tab # Show all possible completions
Alt + ? # Show possible completions (alternative)
Alt + * # Insert all possible completions
# Terminal multiplexing (if using tmux/screen)
Ctrl + B # tmux prefix key (then use tmux commands)
Ctrl + A # screen prefix key (then use screen commands)BashVim Shortcuts
๐ Text Editor: Essential vim commands for file editing
# Mode switching
i # Insert mode (insert before cursor)
a # Insert mode (insert after cursor)
o # Insert mode (new line below)
O # Insert mode (new line above)
Esc # Return to normal mode
# Basic movement
h, j, k, l # Left, down, up, right
w # Move to next word
b # Move to previous word
0 # Move to beginning of line
$ # Move to end of line
gg # Go to first line
G # Go to last line
:n # Go to line number n
# Editing
x # Delete character under cursor
dd # Delete current line
yy # Copy (yank) current line
p # Paste after cursor
P # Paste before cursor
u # Undo
Ctrl + R # Redo
# Search and replace
/pattern # Search forward for pattern
?pattern # Search backward for pattern
n # Next search result
N # Previous search result
:%s/old/new/g # Replace all occurrences in file
# File operations
:w # Save file
:q # Quit
:wq # Save and quit
:q! # Quit without saving
:e filename # Open fileBashBash Shortcuts
๐ Shell Specific: Bash-specific keyboard shortcuts
# Command line editing
Alt + U # Convert word to uppercase
Alt + L # Convert word to lowercase
Alt + C # Capitalize word
Ctrl + X, Ctrl + E # Edit command in $EDITOR
# Directory navigation
cd - # Change to previous directory
pushd directory # Push directory onto stack and change to it
popd # Pop directory from stack and change to it
dirs # Show directory stack
# Job control
jobs # List active jobs
fg %n # Bring job n to foreground
bg %n # Send job n to backgroundBash๐ Advanced Topics
Shell Scripting Fundamentals
๐ง Automation: Write scripts to automate tasks
#!/bin/bash
# Variables
name="value"
readonly constant="fixed_value"
local local_var="function_scope"
# Arrays
arr=("item1" "item2" "item3")
echo ${arr[0]} # First element
echo ${arr[@]} # All elements
echo ${#arr[@]} # Array length
# Conditionals
if [ condition ]; then
echo "true"
elif [ other_condition ]; then
echo "other"
else
echo "false"
fi
# Loops
for file in *.txt; do
echo "Processing $file"
done
while read line; do
echo "Line: $line"
done < input.txt
# Functions
function my_function() {
local param=$1
echo "Parameter: $param"
return 0
}
# Error handling
set -e # Exit on error
set -u # Exit on undefined variable
set -o pipefail # Exit on pipe failureBashSystem Performance Optimization
โก Speed Up: Optimize system performance
# CPU optimization
nice -n -10 important_process # Higher priority
ionice -c 1 -n 4 io_intensive # I/O priority
taskset -c 0,1 process # Bind to specific CPU cores
# Memory optimization
echo 3 | sudo tee /proc/sys/vm/drop_caches # Clear cache
sysctl vm.swappiness=10 # Reduce swap usage
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
# Disk optimization
sudo hdparm -tT /dev/sda # Test disk speed
sudo tune2fs -m 1 /dev/sda1 # Reduce reserved space
sudo fstrim -av # TRIM SSDBashNetwork Configuration
๐ Networking: Advanced network management
# Interface configuration
sudo ip addr add 192.168.1.100/24 dev eth0 # Add IP address
sudo ip route add 192.168.2.0/24 via 192.168.1.1 # Add route
sudo ip link set eth0 up # Bring interface up
sudo ip link set eth0 down # Bring interface down
# Network namespaces
sudo ip netns add testns # Create network namespace
sudo ip netns exec testns bash # Execute in namespace
sudo ip netns delete testns # Delete namespace
# Traffic control
sudo tc qdisc add dev eth0 root handle 1: htb default 12
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbitBashContainer and Virtualization Basics
# Docker basics (if installed)
docker run -it ubuntu:latest bash # Run interactive container
docker ps # List running containers
docker images # List images
docker build -t myapp . # Build image from Dockerfile
# System virtualization info
cat /proc/cpuinfo | grep -E "(vmx|svm)" # Check virtualization support
lscpu | grep Virtualization # Virtualization info
dmesg | grep -i hypervisor # Hypervisor detectionBash๐ก๏ธ Security & Hardening
User Security
๐ User Protection: Secure user accounts and access
# Password policies
sudo chage -M 90 username # Max password age
sudo chage -m 7 username # Min password age
sudo chage -W 7 username # Warning days
sudo passwd -l username # Lock user account
sudo passwd -u username # Unlock user account
# Account monitoring
sudo lastlog # Last login times
sudo last | head -20 # Recent logins
sudo faillog # Failed login attempts
who -a # Current users detailed
# Sudo configuration
sudo visudo # Edit sudoers file safely
# Add: username ALL=(ALL) NOPASSWD: /specific/commandBashFile System Security
๐ File Protection: Secure files and directories
# File attributes
sudo chattr +i important_file # Make file immutable
sudo chattr -i important_file # Remove immutable
lsattr filename # List file attributes
# Access Control Lists (ACLs)
getfacl filename # Get file ACL
sudo setfacl -m u:username:rwx filename # Set user ACL
sudo setfacl -m g:groupname:rx filename # Set group ACL
sudo setfacl -x u:username filename # Remove user ACL
# Find security issues
find / -perm -4000 2>/dev/null # Find SUID files
find / -perm -2000 2>/dev/null # Find SGID files
find / -perm -002 2>/dev/null # Find world-writable files
find / -nouser -o -nogroup 2>/dev/null # Find orphaned filesBashNetwork Security
๐ Network Protection: Secure network services
# Firewall with iptables
sudo iptables -L # List rules
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # Allow SSH
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT # Allow HTTP
sudo iptables -A INPUT -j DROP # Drop all other input
sudo iptables-save > /etc/iptables/rules.v4 # Save rules
# Network monitoring
sudo netstat -tulpn | grep LISTEN # Listening services
sudo ss -tulpn | grep LISTEN # Modern alternative
sudo lsof -i # Network connectionsBashSystem Auditing
๐ Security Monitoring: Track system activities
# System logs analysis
sudo grep "Failed password" /var/log/auth.log | tail -10
sudo grep "sudo" /var/log/auth.log | tail -10
sudo journalctl -u ssh --since "1 hour ago"
# Process monitoring
ps aux | grep -v "]$" | awk '{print $11}' | sort | uniq -c | sort -rn
sudo lsof +L1 # Find deleted but open files
sudo find /proc -name exe -exec ls -l {} \; 2>/dev/null | grep deletedBashโก Performance Tuning
CPU Performance
๐ CPU Optimization: Maximize CPU efficiency
# CPU frequency scaling
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
# Process scheduling
ps -eo pid,nice,comm # Show process nice values
sudo renice -10 PID # Increase priority
sudo ionice -c 1 -n 4 PID # Set I/O priority
# CPU affinity
taskset -cp 0,1 PID # Bind process to CPU cores
numactl --cpubind=0 --membind=0 command # NUMA optimizationBashMemory Optimization
๐พ Memory Management: Optimize memory usage
# Memory analysis
cat /proc/meminfo # Detailed memory info
sudo slabtop # Kernel slab allocation
vmstat -s # Memory statistics
# Memory tuning
echo 10 | sudo tee /proc/sys/vm/swappiness # Reduce swapping
echo 1 | sudo tee /proc/sys/vm/overcommit_memory # Conservative memory allocation
echo 50 | sudo tee /proc/sys/vm/vfs_cache_pressure # Reduce cache pressure
# Huge pages
echo 128 | sudo tee /proc/sys/vm/nr_hugepages # Reserve huge pages
cat /proc/meminfo | grep Huge # Check huge page usageBashI/O Performance
๐ฟ Disk Optimization: Improve disk performance
# I/O schedulers
cat /sys/block/sda/queue/scheduler # Current scheduler
echo deadline | sudo tee /sys/block/sda/queue/scheduler # Set scheduler
# Filesystem tuning
sudo tune2fs -o journal_data_writeback /dev/sda1 # Ext4 optimization
sudo mount -o remount,noatime / # Disable access time updates
# I/O monitoring and tuning
sudo iotop -o # Show only active I/O
sudo iostat -x 1 # Extended I/O statistics
echo cfq | sudo tee /sys/block/sda/queue/scheduler # CFQ scheduler for desktopBashNetwork Performance
๐ Network Optimization: Enhance network performance
# Network buffer tuning
echo 'net.core.rmem_max = 16777216' | sudo tee -a /etc/sysctl.conf
echo 'net.core.wmem_max = 16777216' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p # Apply changes
# TCP tuning
echo 'net.ipv4.tcp_window_scaling = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv4.tcp_congestion_control = bbr' | sudo tee -a /etc/sysctl.conf
# Network interface tuning
sudo ethtool -G eth0 rx 4096 tx 4096 # Ring buffer size
sudo ethtool -K eth0 gso on tso on # Enable offloadingBash๐ Advanced Scripting
Advanced Bash Scripting
๐ง Professional Scripts: Write robust, maintainable scripts
#!/bin/bash
set -euo pipefail # Strict error handling
# Script metadata
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly SCRIPT_NAME="$(basename "$0")"
readonly LOG_FILE="/var/log/${SCRIPT_NAME}.log"
# Logging function
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}
# Error handling
error_exit() {
log "ERROR: $1" >&2
exit 1
}
# Cleanup function
cleanup() {
log "Cleaning up..."
# Add cleanup code here
}
trap cleanup EXIT
# Command line argument parsing
while getopts ":hvf:" opt; do
case $opt in
h) show_help; exit 0 ;;
v) VERBOSE=true ;;
f) FILE="$OPTARG" ;;
\?) error_exit "Invalid option: -$OPTARG" ;;
:) error_exit "Option -$OPTARG requires an argument" ;;
esac
done
# Configuration validation
[[ -f "$FILE" ]] || error_exit "File $FILE does not exist"
[[ -r "$FILE" ]] || error_exit "File $FILE is not readable"
# Main script logic
main() {
log "Starting $SCRIPT_NAME"
# Your code here
log "Completed successfully"
}
# Only run main if script is executed directly
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fiBashSystem Automation Scripts
โ๏ธ Automation: Common system administration scripts
# System backup script
#!/bin/bash
backup_system() {
local backup_dir="/backup/$(date +%Y%m%d)"
local exclude_list="/etc/backup-exclude.txt"
mkdir -p "$backup_dir"
tar -czf "$backup_dir/system-backup.tar.gz" \
--exclude-from="$exclude_list" \
/etc /home /var/www 2>/dev/null
find /backup -name "system-backup.tar.gz" -mtime +30 -delete
}
# Log rotation script
#!/bin/bash
rotate_logs() {
local log_dir="/var/log/myapp"
local max_age=7
find "$log_dir" -name "*.log" -type f | while read -r logfile; do
if [[ -s "$logfile" ]]; then
gzip "$logfile"
mv "${logfile}.gz" "${logfile}.$(date +%Y%m%d).gz"
touch "$logfile"
chmod 644 "$logfile"
fi
done
find "$log_dir" -name "*.gz" -mtime +$max_age -delete
}
# System health check script
#!/bin/bash
health_check() {
local alert_email="admin@example.com"
local cpu_threshold=80
local memory_threshold=90
local disk_threshold=85
# CPU check
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
if (( $(echo "$cpu_usage > $cpu_threshold" | bc -l) )); then
echo "HIGH CPU USAGE: ${cpu_usage}%" | mail -s "CPU Alert" "$alert_email"
fi
# Memory check
memory_usage=$(free | grep Mem | awk '{printf("%.0f", $3/$2 * 100.0)}')
if [[ $memory_usage -gt $memory_threshold ]]; then
echo "HIGH MEMORY USAGE: ${memory_usage}%" | mail -s "Memory Alert" "$alert_email"
fi
# Disk check
while read -r line; do
usage=$(echo "$line" | awk '{print $5}' | cut -d'%' -f1)
partition=$(echo "$line" | awk '{print $6}')
if [[ $usage -gt $disk_threshold ]]; then
echo "HIGH DISK USAGE: ${partition} at ${usage}%" | mail -s "Disk Alert" "$alert_email"
fi
done < <(df -h | grep -vE '^Filesystem|tmpfs|cdrom')
}Bash๐ง System Administration
Service Management
โ๏ธ Service Control: Advanced service administration
# Systemd service creation
sudo tee /etc/systemd/system/myapp.service << EOF
[Unit]
Description=My Application
After=network.target
[Service]
Type=simple
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/myapp
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
# Service monitoring
sudo systemctl status myapp
journalctl -u myapp -f
systemctl list-dependencies myappBashUser and Group Administration
๐ฅ User Management: Advanced user administration
# Advanced user creation
sudo useradd -m -s /bin/bash -G sudo,docker,www-data -c "Full Name" username
sudo usermod -aG additional_group username
sudo usermod -L username # Lock account
sudo usermod -U username # Unlock account
# Bulk user operations
while IFS=: read -r username password uid gid gecos home shell; do
sudo useradd -u "$uid" -g "$gid" -c "$gecos" -d "$home" -s "$shell" -m "$username"
echo "$username:$password" | sudo chpasswd
done < users.txt
# Group management
sudo groupadd -g 1500 developers
sudo gpasswd -a username developers
sudo gpasswd -d username developers
getent group developersBashSystem Monitoring and Alerting
๐ Monitoring: Set up comprehensive system monitoring
# Resource monitoring script
#!/bin/bash
monitor_resources() {
# CPU usage
cpu_usage=$(awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1); }' \
<(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat))
# Memory usage
memory_usage=$(free | awk 'NR==2{printf "%.2f", $3*100/$2}')
# Disk usage
disk_usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
# Load average
load_avg=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//')
echo "$(date): CPU=${cpu_usage}% MEM=${memory_usage}% DISK=${disk_usage}% LOAD=${load_avg}"
}
# Alert thresholds
check_thresholds() {
if (( $(echo "$cpu_usage > 80" | bc -l) )); then
echo "CPU usage alert: ${cpu_usage}%"
fi
if (( $(echo "$memory_usage > 90" | bc -l) )); then
echo "Memory usage alert: ${memory_usage}%"
fi
if [[ $disk_usage -gt 85 ]]; then
echo "Disk usage alert: ${disk_usage}%"
fi
}BashBackup and Recovery
๐พ Data Protection: Implement robust backup strategies
# Automated backup with rotation
#!/bin/bash
backup_with_rotation() {
local source_dirs=("/etc" "/home" "/var/www")
local backup_root="/backup"
local retention_days=30
local date_stamp=$(date +%Y%m%d_%H%M%S)
for dir in "${source_dirs[@]}"; do
local dir_name=$(basename "$dir")
local backup_file="${backup_root}/${dir_name}_${date_stamp}.tar.gz"
tar -czf "$backup_file" -C "$(dirname "$dir")" "$(basename "$dir")" \
--exclude='*.tmp' --exclude='*.log' 2>/dev/null
if [[ $? -eq 0 ]]; then
echo "Backup successful: $backup_file"
else
echo "Backup failed: $dir" >&2
fi
done
# Cleanup old backups
find "$backup_root" -name "*.tar.gz" -mtime +$retention_days -delete
}
# Database backup
backup_mysql_databases() {
local backup_dir="/backup/mysql/$(date +%Y%m%d)"
mkdir -p "$backup_dir"
mysql -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema)" | while read -r database; do
mysqldump --single-transaction --routines --triggers "$database" > "$backup_dir/${database}.sql"
gzip "$backup_dir/${database}.sql"
done
}Bash๐ฉบ Troubleshooting & Diagnostics
System Troubleshooting
๐ Problem Solving: Systematic approach to diagnosing issues
# System health overview
system_overview() {
echo "=== SYSTEM OVERVIEW ==="
echo "Hostname: $(hostname)"
echo "Uptime: $(uptime)"
echo "Kernel: $(uname -r)"
echo "Load Average: $(cat /proc/loadavg)"
echo ""
echo "=== MEMORY ==="
free -h
echo ""
echo "=== DISK USAGE ==="
df -h
echo ""
echo "=== NETWORK ==="
ip addr show | grep -E "(inet|UP|DOWN)"
echo ""
echo "=== PROCESSES ==="
ps aux --sort=-%cpu | head -10
}
# Process troubleshooting
debug_process() {
local process_name="$1"
local pids=$(pgrep "$process_name")
if [[ -z "$pids" ]]; then
echo "Process $process_name not found"
return 1
fi
for pid in $pids; do
echo "=== Process $pid ==="
echo "Command: $(ps -p $pid -o cmd=)"
echo "Status: $(cat /proc/$pid/status | grep -E '(State|VmRSS|VmSize)')"
echo "Open files: $(lsof -p $pid | wc -l)"
echo "Network connections: $(lsof -i -p $pid | wc -l)"
echo ""
done
}BashNetwork Troubleshooting
๐ Network Diagnosis: Identify and resolve network issues
# Network connectivity test
network_test() {
local target="$1"
echo "Testing connectivity to $target"
# DNS resolution
if nslookup "$target" >/dev/null 2>&1; then
echo "โ DNS resolution successful"
else
echo "โ DNS resolution failed"
return 1
fi
# Ping test
if ping -c 3 "$target" >/dev/null 2>&1; then
echo "โ Ping successful"
else
echo "โ Ping failed"
fi
# Port test (if port specified)
if [[ "$target" =~ :([0-9]+)$ ]]; then
local host="${target%:*}"
local port="${target##*:}"
if timeout 5 bash -c "</dev/tcp/$host/$port" 2>/dev/null; then
echo "โ Port $port accessible"
else
echo "โ Port $port not accessible"
fi
fi
}
# Network interface diagnostics
interface_diagnostics() {
local interface="$1"
echo "=== Interface $interface ==="
echo "Status: $(cat /sys/class/net/$interface/operstate)"
echo "Speed: $(cat /sys/class/net/$interface/speed 2>/dev/null || echo 'Unknown')"
echo "MTU: $(cat /sys/class/net/$interface/mtu)"
echo "Statistics:"
cat /sys/class/net/$interface/statistics/rx_packets
cat /sys/class/net/$interface/statistics/tx_packets
cat /sys/class/net/$interface/statistics/rx_errors
cat /sys/class/net/$interface/statistics/tx_errors
}BashPerformance Diagnostics
โก Performance Issues: Identify and resolve performance bottlenecks
# Performance analysis script
performance_analysis() {
echo "=== PERFORMANCE ANALYSIS ==="
# CPU analysis
echo "Top CPU consuming processes:"
ps aux --sort=-%cpu | head -10 | awk '{printf "%-10s %-8s %-8s %s\n", $1, $2, $3, $11}'
echo ""
# Memory analysis
echo "Top memory consuming processes:"
ps aux --sort=-%mem | head -10 | awk '{printf "%-10s %-8s %-8s %s\n", $1, $2, $4, $11}'
echo ""
# I/O analysis
echo "I/O statistics:"
iostat -x 1 1 | grep -v "^$"
echo ""
# Network analysis
echo "Network connections:"
ss -tuln | grep LISTEN | wc -l
echo "Active connections: $(ss -tu | grep ESTAB | wc -l)"
}
# System bottleneck detection
detect_bottlenecks() {
# CPU bottleneck
local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
if (( $(echo "$cpu_usage > 80" | bc -l) )); then
echo "โ ๏ธ CPU bottleneck detected: ${cpu_usage}%"
fi
# Memory bottleneck
local memory_usage=$(free | awk 'NR==2{printf "%.0f", $3/$2 * 100.0}')
if [[ $memory_usage -gt 90 ]]; then
echo "โ ๏ธ Memory bottleneck detected: ${memory_usage}%"
fi
# I/O wait
local iowait=$(top -bn1 | grep "Cpu(s)" | awk '{print $5}' | cut -d'%' -f1)
if (( $(echo "$iowait > 20" | bc -l) )); then
echo "โ ๏ธ I/O bottleneck detected: ${iowait}% iowait"
fi
}BashLog Analysis
๐ Log Investigation: Analyze system logs for issues
# Automated log analysis
analyze_logs() {
echo "=== LOG ANALYSIS ==="
# System errors
echo "Recent system errors:"
journalctl -p err --since "1 hour ago" --no-pager | tail -10
echo ""
# Authentication failures
echo "Recent authentication failures:"
grep "Failed password" /var/log/auth.log | tail -5
echo ""
# Disk space issues
echo "Disk space warnings:"
dmesg | grep -i "no space left" | tail -5
echo ""
# Network issues
echo "Network-related errors:"
dmesg | grep -i "network\|eth\|wifi" | grep -i "error\|fail" | tail -5
}
# Custom log monitoring
monitor_application_logs() {
local log_file="$1"
local error_patterns=("ERROR" "FATAL" "Exception" "failed")
echo "Monitoring $log_file for errors..."
tail -f "$log_file" | while read -r line; do
for pattern in "${error_patterns[@]}"; do
if echo "$line" | grep -qi "$pattern"; then
echo "[$(date)] ALERT: $line"
# Add notification logic here
break
fi
done
done
}Bash๐ Learning Resources
๐ Beginner Learning Path
Essential Skills Roadmap
- Week 1-2: Foundation
- Terminal navigation and basic commands
- File operations and permissions
- Text viewing and editing with nano
- Week 3-4: System Basics
- Process management
- System information commands
- Package management for your distribution
- Week 5-6: Text Processing
- grep, sed, awk basics
- Pipes and redirection
- Regular expressions
- Week 7-8: System Administration
- User management
- Service control
- Log file analysis
Practice Exercises
# Beginner exercises to try:
# 1. Create a directory structure for a project
mkdir -p ~/projects/web/{css,js,images,docs}
# 2. Find all .txt files larger than 1MB
find ~/Documents -name "*.txt" -size +1M
# 3. Count lines in all Python files
find . -name "*.py" -exec wc -l {} + | tail -1
# 4. Create a simple backup script
tar -czf backup-$(date +%Y%m%d).tar.gz ~/important_files
# 5. Monitor system resources
watch -n 5 'free -h && df -h'Bash๐ Intermediate Learning Path
Advanced Topics
- Shell Scripting
- Variables and conditionals
- Loops and functions
- Error handling
- Network Administration
- SSH configuration and tunneling
- Network troubleshooting
- Firewall management
- System Monitoring
- Performance analysis
- Log management
- Automation with cron
- Security Fundamentals
- File permissions and ACLs
- User account security
- Basic hardening
๐ช Advanced Learning Path
Professional Skills
- System Administration
- Service creation and management
- Performance tuning
- Backup and recovery strategies
- Security and Hardening
- Advanced permission systems
- Network security
- Audit and compliance
- Automation and Scripting
- Complex shell scripts
- System monitoring tools
- Infrastructure automation
๐ Recommended Resources
Books
- “The Linux Command Line” by William Shotts – Excellent for beginners
- “Unix and Linux System Administration Handbook” by Evi Nemeth – Comprehensive reference
- “Linux Performance Tools” by Brendan Gregg – Advanced performance analysis
- “Bash Cookbook” by Carl Albing – Advanced shell scripting
Online Resources
- Linux Journey (linuxjourney.com) – Interactive learning
- OverTheWire (overthewire.org) – Security challenges
- Linux Academy/A Cloud Guru – Structured courses
- Red Hat Learning – Enterprise-focused training
Practice Environments
# Set up practice environment
# 1. Virtual machines with VirtualBox/VMware
# 2. Cloud instances (AWS EC2, Google Cloud, DigitalOcean)
# 3. Docker containers for isolated practice
docker run -it ubuntu:latest bash
# 4. WSL (Windows Subsystem for Linux) for Windows users
# 5. Raspberry Pi for hardware practiceBashCommunity and Support
- r/linux4noobs – Reddit community for beginners
- Stack Overflow – Programming and scripting questions
- Unix & Linux Stack Exchange – System administration questions
- Linux.org Forums – General Linux discussions
- Local Linux User Groups (LUGs) – In-person meetups
๐ฏ Certification Paths
Industry Certifications
- CompTIA Linux+ – Vendor-neutral foundation
- LPIC-1, LPIC-2, LPIC-3 – Linux Professional Institute
- Red Hat Certified System Administrator (RHCSA) – Enterprise Linux
- Linux Foundation Certified System Administrator (LFCS) – Cloud-native focus
Specialization Areas
- DevOps: Docker, Kubernetes, CI/CD
- Security: Penetration testing, hardening
- Cloud: AWS, Azure, Google Cloud Linux instances
- Embedded: IoT, Raspberry Pi, real-time systems
๐ง Building Your Home Lab
Virtual Lab Setup
# Create practice VMs with different distributions
# - Ubuntu Server (beginner-friendly)
# - CentOS/RHEL (enterprise focus)
# - Arch Linux (advanced users)
# - Debian (stable server environment)
# Practice scenarios:
# 1. Web server setup (Apache/Nginx + SSL)
# 2. Database server (MySQL/PostgreSQL)
# 3. File server (Samba/NFS)
# 4. Network services (DNS, DHCP)
# 5. Monitoring stack (Prometheus, Grafana)Bash๐ Skill Assessment Checklist
Beginner Level โ
- Navigate filesystem confidently
- Create, modify, and delete files/directories
- Understand file permissions (rwx)
- Use basic text processing tools (grep, sort, uniq)
- Manage processes (ps, top, kill)
- Install software packages
- Read and understand basic shell scripts
Intermediate Level โ
- Write functional shell scripts
- Configure SSH and use key authentication
- Manage users and groups
- Set up and manage services
- Understand network basics and troubleshooting
- Implement basic security measures
- Automate tasks with cron jobs
- Analyze system performance and logs
Advanced Level โ
- Design and implement backup strategies
- Tune system performance
- Implement comprehensive security hardening
- Write complex automation scripts
- Troubleshoot complex system issues
- Configure advanced networking
- Manage enterprise-level systems
- Mentor others and document procedures
๐ก Quick Tips & Best Practices
๐ Productivity Boosters
# Create useful aliases in ~/.bashrc
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias grep='grep --color=auto'
alias ..='cd ..'
alias ...='cd ../..'
alias h='history'
alias c='clear'
alias df='df -h'
alias du='du -h'
alias free='free -h'
alias ps='ps auxf'
alias mkdir='mkdir -pv'
alias mount='mount | column -t'
alias ports='netstat -tulanp'
# Useful functions
extract() {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xjf $1 ;;
*.tar.gz) tar xzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) unrar e $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xf $1 ;;
*.tbz2) tar xjf $1 ;;
*.tgz) tar xzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*) echo "'$1' cannot be extracted via extract()" ;;
esac
else
echo "'$1' is not a valid file"
fi
}Bashโ ๏ธ Safety Guidelines
# NEVER do these (dangerous commands):
rm -rf / # Deletes everything
dd if=/dev/zero of=/dev/sda # Wipes hard drive
:(){ :|:& };: # Fork bomb
chmod -R 777 / # Makes everything world-writable
# ALWAYS do these (safety practices):
cp important_file important_file.bak # Backup before editing
ls -la before running rm -rf # Check what you're deleting
use "rm -i" for interactive deletion # Prompt before deletion
test scripts in VM before production # Safe testing environmentBash๐ฏ Professional Habits
- Document Everything: Keep notes of configurations and procedures
- Use Version Control: Track changes to scripts and configs
- Test Before Deploy: Always test in non-production environment
- Monitor Systems: Set up alerting for critical services
- Regular Backups: Automate backup procedures and test restores
- Stay Updated: Keep systems patched and follow security advisories
- Learn Continuously: Technology evolves; keep learning new tools
๐ง Happy Linux Adventures!
Remember: The best way to learn Linux is by doing. Start with simple tasks, make mistakes, learn from them, and gradually take on more complex challenges. Every expert was once a beginner!
๐ Keep This Cheatsheet Handy: Bookmark this page, print sections you use frequently, and most importantly – practice these commands in a safe environment.
๐ค Community: Join Linux communities, ask questions, and help others. The Linux community is known for being helpful and welcoming to newcomers.
Last updated: October 2025 | Beginner to Advanced Linux Reference
Discover more from Altgr Blog
Subscribe to get the latest posts sent to your email.
