# user-add **Add a user with Fish shell and tools** ## Purpose This cube creates a new user account with a modern shell environment (Fish), SSH key authentication, and enhanced productivity tools pre-configured. ## What This Cube Does 1. **Creates a new user account** - Sets up home directory with proper permissions - Configures password authentication - Adds user to specified groups (e.g., `docker`, `sudo`) - Sets Fish as the default login shell 2. **Configures SSH access** - Deploys the specified SSH public key for passwordless authentication - Creates `.ssh` directory with proper permissions - Sets up SSH config file - Configures SSH agent auto-loading for Fish shell 3. **Installs Fish shell enhancements** - Installs **Oh My Fish** (OMF) - Fish shell framework with themes and plugins - Deploys custom Fish configuration (`config.fish`) - Sets up Fish rc directory for modular configurations 4. **Creates workspace directories** - Creates `/home/{USER}/tmp` directory for temporary files ## Configuration ### Parameters - **USER** (string, auto-generated) - Username for the new user account - Default: `userXXXXX` (randomly generated 5-character suffix) - **PASSWORD** (string, **secret**) - Password for the new user account - Default: the literal `changeme` — a placeholder, not a credential. Change it on first login, or pass a real one. - Declared in the manifest's `secrets`, so it is never written to a session or history file and is masked in printed commands. A replay asks for it again. - It used to default to a randomly generated password. That was removed: since the value is not recorded, an unattended run created an account with a credential nobody had seen, and replaying that run produced a different one. - **GROUPS** (string, default: `''`) - Comma-separated list of additional groups (e.g., `"docker,sudo"`) - Common groups: - `docker` - Run Docker without sudo - `sudo` - Administrative privileges - `www-data` - Web server file access - **PUBKEY** (string, **required** — no default) - SSH public key to authorize for the user - Should be your public key for passwordless SSH access - There is deliberately no default. It used to be a specific personal key, so accepting the default authorized *someone else's* key on the new account. No key would be a sensible guess, so the cube asks instead. - Because it is required, `--use-defaults` refuses to run this cube unless `PUBKEY` comes from `env` in `.nopyrc.json`, a dependency, or a hook. - Submitting an empty value at the prompt authorizes no key at all (the account is still created, with password login only). ## Dependencies - **apt:essentials** - Provides Fish shell and basic tools ## What is Fish? Fish (Friendly Interactive Shell) is a modern command-line shell that focuses on usability: - **Smart autosuggestions**: Suggests commands as you type based on history - **Syntax highlighting**: Color-codes commands in real-time - **Tab completions**: Comprehensive, discoverable command completions - **No configuration needed**: Works great out of the box ## Post-Installation After deployment: - SSH into the server as the new user: `ssh {USER}@server` - Your SSH key will be pre-authorized (no password needed if using key) - Fish shell will start automatically with OMF installed - SSH agent auto-loads to manage your SSH keys ## Notes - The user's home directory is created at `/home/{USER}` - Fish configuration is stored in `/home/{USER}/.config/fish/` - Oh My Fish provides package management: `omf install ` - To switch shells: `chsh -s /bin/bash` (or back to fish: `chsh -s /usr/bin/fish`) --- # 📌 Most Useful Fish Key Bindings (with Fisher Extensions) ## 🐟 Default Fish Key Bindings - `Ctrl + C` → Cancel the current command - `Ctrl + D` → Exit the shell (or logout if in SSH) - `Ctrl + L` → Clear the terminal - `Ctrl + R` → Search command history (enhanced by `fzf.fish`) - `Ctrl + U` → Delete the entire command line - `Ctrl + W` → Delete the last word - `Alt + ← / →` → Move backward/forward by a word ## 🔍 Enhanced with `fzf.fish` - `Ctrl + R` → **Fuzzy search command history** - `Ctrl + T` → **Fuzzy search and insert file path** - `Alt + C` → **Fuzzy search directories (`cd` with `z`)** ## 📂 Directory Navigation (with `z`) - `z ` → Jump to a frequently used directory - `z -l` → List most-used directories - `z -c` → Remove a directory from `z`'s database ## 🔄 Process & Job Management - `Ctrl + Z` → Suspend the current process - `fg` → Bring a suspended process back to foreground - `jobs` → List background jobs ## 🎨 Other Handy Shortcuts - `fish_vi_key_bindings` → Enable Vi mode (press `Esc` for normal mode) - `Ctrl + G` → Show Git status (if using `fzf.fish`) - `Ctrl + E` → Edit command line in `$EDITOR` ## ⚙️ Useful Commands for Key Binding ```fish # Set Fish default key bindings fish_default_key_bindings # Enable Vi mode fish_vi_key_bindings # Rebind a custom key (Example: Ctrl + G for git status) bind \cg 'git status'