The Open Machine, 1991
The Unix model from 1969 still runs most of the internet. This era puts you in a working shell where ls, grep, sed, awk, pipes and systemd all behave, so the habits you build here transfer straight to a real server.
Classic shells track · 43 missions · boss mission, no written exam · free, no signup. Everything below runs in the browser terminal on the SERVBG home page.
What you will do
- list directory contents
lsLinus Torvalds wrote Linux v0.01 in 1991, age 21. Based on Unix, 1969.
- show current directory
pwdUnix filesystem: one tree rooted at /. Everything, even devices, is a file.
- show your username
whoamiUnix was designed for multiple users from day one. Identity always mattered.
- show system information
uname -aThe kernel is the core. Linus Torvalds still personally reviews patches.
- list with permissions
ls -larwxrwxrwx: Unix permission bits from 1969. Same model secures the internet today.
- display file contents
cat READMEcat = concatenate. Unix: small tools that do one thing well, combined with pipes.
- list running processes
psEverything is a process. Fork, exec, wait — the Unix lifecycle since 1969.
- read the manual
man lsman pages exist since 1971. RTFM (Read The Fine Manual) is a real Unix tradition.
- search text recursively
grep -r "error" /var/loggrep: Global Regular Expression Print. One of the first UNIX tools, 1974. Still unmatched.
- find files by name or attribute
find . -name "*.log"find -exec {} \; pipes each result to a command. -delete nukes matches. Combine with xargs for speed.
- extract and transform text fields
awk '{print $1}' /etc/passwdawk: Aho, Weinberger, Kernighan — three Bell Labs legends, 1977. $1 $NF BEGIN/END still standard.
- stream-edit text with substitution
sed 's/old/new/g' filesed: stream editor, 1974. sed 's/foo/bar/g' rewrites millions of config files to this day.
- build and execute command lines from stdin
find . -name "*.tmp" | xargs rmxargs -P 8 parallelises across 8 CPUs. -n 1 feeds one arg per invocation. Classic Unix composition.
- create or extract tar archives
tar czf backup.tar.gz /etctar: Tape ARchive, 1979. --strip-components and --exclude still used in Docker image layers today.
- sync files efficiently over SSH
rsync -av --delete src/ dst/rsync transfers only changed blocks. --delete mirrors deletions. The backbone of backup scripts since 1996.
- generate SSH key pair
ssh-keygen -t ed25519Ed25519 keys are 256-bit elliptic curve — faster and smaller than RSA 4096, equally secure. 2013 onward.
- manage systemd services
systemctl status nginxsystemd replaced SysVinit in 2011. Controversial then, universal now. Units replaced rc.d scripts.
- query the systemd journal
journalctl -u nginxjournalctl -f follows live. journalctl -u <unit> filters by service. Binary logs survived reboots.
- show socket and listening port state
ss -tnlpss replaced netstat in 2003. -tnlp: TCP, numeric, listening, with process. Fast via kernel socket API.
- list open files and network sockets
lsof -i :80lsof: List Open Files. In Linux everything is a file. 'lsof -i :PORT' reveals what owns a port.
- trace system calls of a running process
strace -p 1337strace shows every kernel call a process makes. Invaluable for debugging without source code.
- view kernel ring buffer messages
dmesg -T | taildmesg -T shows human timestamps. Hardware errors, OOM kills, and driver noise all live here.
- list scheduled cron jobs
crontab -lcron syntax: minute hour dom month dow. @reboot runs once at boot. The scheduler unchanged since 1975.
- loop over a list in bash
for i in 1 2 3; do echo $i; doneBash is a real language. for / while / until turn the repetitive into one line.
- branch on a condition
if [ -f /etc/hosts ]; then echo found; fi[ ] is the test command. Exit codes drive control flow: 0 = true, non-zero = false.
- set an environment variable
export EDITOR=vimexport makes a variable visible to child processes. The shell IS your configuration.
- make a shortcut for a command
alias ll='ls -la'Aliases + functions in ~/.bashrc are how power users bend the shell to their own hands.
- reach for Python when the shell is not enough
python3 -c 'print(2**10)'When a one-liner grows hairy, drop into Python. The shell launches it; the two compose.
- match a literal phrase with extended regex
grep -E 'Failed password' /var/log/auth.log-E turns on Extended Regular Expressions (classic egrep). POSIX split basic/extended grep in 1992 — extended is what everyone reaches for today.
- match one digit with a character class
grep -E 'user[0-9]' /var/log/auth.log[0-9] is a bracket expression — one character from the set. [a-z], [^0-9] (negated) work the same way. Bracket expressions predate grep itself, from ed in the 1970s.
- anchor a match to the start of the line
grep -E '^Jan 14 04' /var/log/auth.log^ anchors to start-of-line, $ to end-of-line. Anchor a timestamp prefix and a noisy log becomes an exact time-window filter.
- bridge two phrases with the .* quantifier
grep -E 'Failed password.*root' /var/log/auth.log.* means "any character, zero or more times" — the most-used, most-abused regex quantifier. + means one-or-more, ? means zero-or-one.
- group and alternate with (a|b)
grep -E '(Accepted publickey|Accepted password)' /var/log/auth.log(a|b) groups and alternates. In grep -E the match is still the whole line, not the group — captures only pay off once sed, awk or a real language can reference them.
- assign a variable, then chain a second command with ;
NAME=servbg; echo $NAMENAME=value has no spaces around = — bash is strict about that, unlike most languages. ; runs commands in sequence, exactly like pressing Enter between them.
- substitute a command's output with $(...)
echo $(whoami)$(command) runs the command and drops its output in as text. Old scripts used `backticks`; $() nests cleanly, so modern bash prefers it.
- trigger a non-zero exit code on purpose
cd /nonexistentEvery command exits 0 (success) or 1-255 (failure) — no exceptions, no output required. A missing directory is the cheapest way to see a real failure.
- read the last command's exit code
echo $?$? holds the exit status of the last command. It is the entire foundation if/&&/|| control flow is built on — no magic, just an integer.
- compose two programs with a pipe
grep -E 'Failed password' /var/log/auth.log | wc -l| hands one program's stdout to the next program's stdin. grep and wc know nothing about each other — composability, not integration, is the Unix trick.
- open a file in vim and see the modal-editing split
vim notes.txtBill Joy wrote vi in 1976 for a 300-baud modem — every keystroke had to earn its place. Vim (1991) extended it. Two modes rule everything: NORMAL (commands) and INSERT (text).
- switch to INSERT mode and start typing
ii inserts before the cursor, a appends after, o opens a line below. In INSERT mode keys are text again — real vim shows -- INSERT -- on the status line so you never lose track.
- save and quit — from NORMAL mode only
:wq:w writes (saves), :q quits, :wq does both in one command. :q! discards changes and quits anyway — the command every vim beginner googles first.
- search forward for text with /
/servbg/pattern searches forward, ?pattern searches backward, n repeats the last search. Vim search accepts full regex — the same grammar you just used in grep.
- Boss missionrun a shell script — automation, sealed
bash backup.shA script is a shell session you can repeat, share and schedule. Here sysadmin becomes engineering.
Certificate
This is one of the original eras, so it ends at the boss mission: there is no written exam and no certificate for it. Clearing the boss marks the era complete and banks the XP. The expansion tracks (networking, Cisco IOS, FortiOS, containers, Kubernetes, cloud, operations, defence, models and the nine graphics eras) are the ones that carry exams.