Every seasoned sysadmin knows the moment of panic when you realize you just ran rm -rf /tmp/*
on your production database server instead of the staging environment. The solution? Color-coded terminal prompts that instantly identify which machine you're working on.
Here's how to implement machine-specific prompt coloring in your ~/.bashrc
or ~/.bash_profile
:
# Color definitions BLUE='$$\e[0;34m$$' PURPLE='$$\e[0;35m$$' RED='$$\e[0;31m$$' GREEN='$$\e[0;32m$$' YELLOW='$$\e[0;33m$$' RESET='$$\e[0m$$' # Machine-specific prompts case $(hostname) in desktop1*) PS1="${BLUE}[\u@\h \W]\$${RESET} " ;; laptop*) PS1="${PURPLE}[\u@\h \W]\$${RESET} " ;; db-server*) PS1="${RED}[\u@\h \W]\$${RESET} " ;; *) PS1="${GREEN}[\u@\h \W]\$${RESET} " ;; esac
For environments where you frequently SSH between machines, this enhanced version detects remote sessions:
if [ -n "$SSH_CONNECTION" ]; then PS1="${RED}[SSH:\h \W]\$${RESET} " else PS1="${GREEN}[\u@\h \W]\$${RESET} " fi
Combine colors with other visual indicators for maximum effect:
# Add emoji indicators PROD_EMOJI=$'\U26A0' # Warning symbol DEV_EMOJI=$'\U1F41B' # Bug symbol case $(hostname) in prod*) PS1="${RED}${PROD_EMOJI} [\u@\h \W]\$${RESET} " ;; dev*) PS1="${YELLOW}${DEV_EMOJI} [\u@\h \W]\$${RESET} " ;; esac
For tmux users, set window titles along with colors:
# In ~/.tmux.conf set -g window-status-format "#I:#W#F" set -g window-status-current-format "#[fg=red]#I:#W#F"
Remember that:
- Use high-contrast colors that are visible in both light and dark terminal themes
- Consider colorblind-friendly palettes (avoid red/green combinations)
- Test your colors with
echo -e "\e[0;31mTest\e[0m"
To make these changes permanent:
# For all users (system-wide): sudo nano /etc/bash.bashrc # For current user: nano ~/.bashrc source ~/.bashrc
Working with multiple remote servers via SSH can quickly become confusing. When you have terminal tabs or windows open to different machines, it's frighteningly easy to execute commands on the wrong server - potentially with disastrous consequences. The standard monochrome prompts don't help distinguish between environments.
Here's a robust solution using your shell's PS1 variable and SSH configuration to give each server a distinct colored prompt. We'll implement this for bash (works similarly for zsh):
# In your ~/.bashrc or server's /etc/bashrc: function set_ssh_prompt() { case $(hostname) in desktop1*) PS1="$$\e[1;34m$$[\u@\h \W]\$ $$\e[0m$$" # Blue ;; laptop*) PS1="$$\e[1;35m$$[\u@\h \W]\$ $$\e[0m$$" # Purple ;; server*) PS1="$$\e[1;31m$$[\u@\h \W]\$ $$\e[0m$$" # Red ;; *) PS1="$$\e[1;32m$$[\u@\h \W]\$ $$\e[0m$$" # Default green ;; esac } PROMPT_COMMAND=set_ssh_prompt
For this to work when SSHing into machines, we need to ensure the remote server executes our bashrc. Add this to your local SSH config (~/.ssh/config):
Host desktop1 HostName desktop1.example.com User yourusername RequestTTY yes RemoteCommand bash --login Host laptop HostName 192.168.1.100 User devuser RequestTTY yes RemoteCommand bash --login
For even better visual distinction, combine colors with these techniques:
# Environment-specific emoji in prompt PS1="$$\e[1;31m$$?️ [\u@\h \W]\$ $$\e[0m$$" # Server PS1="$$\e[1;34m$$? [\u@\h \W]\$ $$\e[0m$$" # Laptop # Background colors for immediate recognition PS1="$$\e[30;47m$$[PROD] $$\e[0m$$$$\e[1;31m$$[\u@\h \W]\$ $$\e[0m$$"
While we're improving our terminal experience:
# Colorized man pages (add to ~/.bashrc or ~/.zshrc) export LESS_TERMCAP_mb=$'\e[1;32m' export LESS_TERMCAP_md=$'\e[1;32m' export LESS_TERMCAP_me=$'\e[0m' export LESS_TERMCAP_se=$'\e[0m' export LESS_TERMCAP_so=$'\e[01;33m' export LESS_TERMCAP_ue=$'\e[0m' export LESS_TERMCAP_us=$'\e[1;4;31m' # Immediate visual feedback for dangerous commands alias rm='rm -i' alias cp='cp -i' alias mv='mv -i'
If colors aren't appearing:
- Ensure your terminal supports ANSI colors (most modern terminals do)
- Check that your remote shell is actually loading the rc file (bash --login helps)
- Verify the hostname matches your case statements exactly