P on a lab in the TUI records the session's terminal and publishes it
here while it runs.
Read-only: you see what the learner sees, at the speed they typed it, and
every file they change is a diff.
Real sessions against real VMs, recorded with the same recorder. Until you press play each screen lists the commands it is about to run; skipping to the next three commands pauses. Click a command in the logs to jump to it. Long pauses are squeezed; nothing else is edited.
13 Sep 2026 · 16:57 → 17:01 UTC
| At | Command | Took |
|---|---|---|
| 0:02 | cat /etc/os-release | head -2 | 0.6 s |
| 0:02 | id | 2.2 s |
| 0:04 | ls -l /usr/local/bin/backup-data | 2.1 s |
| 0:06 | cat /usr/local/bin/backup-data | 1.5 s |
| 0:08 | ls -la /var/backups | 3.9 s |
| 0:12 | tail -5 /var/log/backup-data.log 2>/dev/null || echo "no log yet" | 1.7 s |
| 0:14 | find /srv/data -type f | 2.1 s |
| 0:16 | find /srv/data -type f | wc -l | 1.4 s |
| 0:17 | du -sh /srv/data | 2.2 s |
| 0:19 | sudo /usr/local/bin/backup-data | 1.7 s |
| 0:21 | echo "exit status: $?" | 2.2 s |
| 0:23 | tail -3 /var/log/backup-data.log | 2.1 s |
| 0:25 | ls -lt /var/backups | head -5 | 3.8 s |
| 0:29 | NEWEST=$(ls -t /var/backups/*.tar.gz | head -1); echo "$NEWEST" | 1.5 s |
| 0:30 | tar -tzf "$NEWEST" | 1.9 s |
| 0:32 | tar -tzf "$NEWEST" | wc -l | 2.1 s |
| 0:34 | cd /srv/data && find . -type f | 0.7 s |
| 0:35 | cd | 3.1 s |
| 0:38 | bash -x /usr/local/bin/backup-data 2>&1 | head -20 | 3.4 s |
| 0:42 | sudo bash -x /usr/local/bin/backup-data 2>&1 | tail -8 | 2.8 s |
| 0:44 | mkdir -p /tmp/t/src/'with space' /tmp/t/dest | 2.7 s |
| 0:47 | echo one > '/tmp/t/src/with space/a b.txt' | 2.2 s |
| 0:49 | echo two > /tmp/t/src/plain.txt | 6.2 s |
| 0:56 | BACKUP_SRC=/tmp/t/src BACKUP_DEST=/tmp/t/dest BACKUP_LOG=/tmp/t/log /usr/local/bin/backup-data; echo "exit $?" | 1.3 s |
| 0:57 | cat /tmp/t/log | 2.1 s |
| 0:59 | tar -tzf /tmp/t/dest/*.tar.gz | 6.4 s |
| 1:05 | BACKUP_SRC=/nonexistent BACKUP_DEST=/tmp/t/dest BACKUP_LOG=/tmp/t/log /usr/local/bin/backup-data; echo "exit $?" | 1.5 s |
| 1:07 | tail -1 /tmp/t/log | 6.2 s |
| 1:13 | BACKUP_SRC=/tmp/t/src BACKUP_DEST=/nonexistent BACKUP_LOG=/tmp/t/log /usr/local/bin/backup-data; echo "exit $?" | 1.5 s |
| 1:14 | tail -1 /tmp/t/log | 2.0 s |
| 1:16 | sudo cat /etc/crontabs/root | 1.4 s |
| 1:18 | ls /etc/periodic/ | 1.8 s |
| 1:20 | rc-service crond status | 5.0 s |
| 1:25 | sudo sh -c 'env -i sh -c "command -v backup-data || echo not found on an empty PATH"' | 1.2 s |
| 1:26 | echo "$PATH" | 3.5 s |
| 1:29 | sudo cp /usr/local/bin/backup-data /root/backup-data.orig | 31.3 s |
| 2:01 | cat > /tmp/backup-data <<'SCRIPT' | 2.8 s |
| 2:03 | bash -n /tmp/backup-data && echo "syntax ok" | 1.8 s |
| 2:05 | head -4 /tmp/backup-data | 2.1 s |
| 2:07 | rm -rf /tmp/t/dest/* /tmp/t/log | 6.0 s |
| 2:13 | BACKUP_SRC=/tmp/t/src BACKUP_DEST=/tmp/t/dest BACKUP_LOG=/tmp/t/log bash /tmp/backup-data; echo "exit $?" | 2.1 s |
| 2:15 | tar -tzf /tmp/t/dest/*.tar.gz | 1.3 s |
| 2:17 | cat /tmp/t/log | 6.1 s |
| 2:23 | BACKUP_SRC=/nonexistent BACKUP_DEST=/tmp/t/dest BACKUP_LOG=/tmp/t/log bash /tmp/backup-data; echo "exit $?" | 1.5 s |
| 2:24 | tail -1 /tmp/t/log | 6.0 s |
| 2:30 | BACKUP_SRC=/tmp/t/src BACKUP_DEST=/nonexistent BACKUP_LOG=/tmp/t/log bash /tmp/backup-data; echo "exit $?" | 1.5 s |
| 2:32 | tail -1 /tmp/t/log | 2.1 s |
| 2:34 | grep -c 'backup OK' /tmp/t/log | 3.9 s |
| 2:38 | sudo install -m 0755 /tmp/backup-data /usr/local/bin/backup-data | 2.2 s |
| 2:40 | ls -l /usr/local/bin/backup-data | 4.7 s |
| 2:45 | sudo sed -i 's#\* backup-data$#* /usr/local/bin/backup-data#' /etc/crontabs/root | 1.9 s |
| 2:46 | sudo cat /etc/crontabs/root | 2.1 s |
| 2:49 | sudo rc-service crond restart | 1.7 s |
| 2:50 | rc-service crond status | 3.0 s |
| 2:53 | sudo /usr/local/bin/backup-data; echo "exit $?" | 3.8 s |
| 2:57 | NEWEST=$(ls -t /var/backups/*.tar.gz | head -1); echo "$NEWEST" | 1.5 s |
| 2:58 | tar -tzf "$NEWEST" | 2.1 s |
| 3:01 | tar -tzf "$NEWEST" | grep -c . | 2.1 s |
| 3:03 | find /srv/data -type f | wc -l | 3.5 s |
| 3:06 | tar -xzf "$NEWEST" -O './contracts/Acme Corp — signed.pdf' | 3.3 s |
| 3:10 | tar -xzf "$NEWEST" -O './invoices/2026 Q3 summary.csv' | 2.2 s |
| 3:12 | tail -2 /var/log/backup-data.log | 4.1 s |
| 3:16 | sudo BACKUP_DEST=/root/nope /usr/local/bin/backup-data; echo "exit $?" | 2.2 s |
| 3:18 | tail -1 /var/log/backup-data.log | 4.2 s |
| 3:22 | sudo BACKUP_SRC=/srv/missing /usr/local/bin/backup-data; echo "exit $?" | 2.2 s |
| 3:25 | tail -1 /var/log/backup-data.log | 5.7 s |
| 3:30 | sudo sh -c 'cd / && env -i PATH=/usr/bin:/bin /usr/local/bin/backup-data'; echo "cron-like exit $?" | 2.1 s |
| 3:32 | ls -lt /var/backups | head -4 | 3.4 s |
| 3:36 | (cd /srv/data && find . -type f | sort) > /tmp/src.list | 5.2 s |
| 3:41 | tar -tzf "$(ls -t /var/backups/*.tar.gz | head -1)" | grep -v '/$' | sort > /tmp/tar.list | 3.9 s |
| 3:45 | diff /tmp/src.list /tmp/tar.list && echo "archive matches source" | 3.6 s |
| 3:48 | rm -rf /tmp/t /tmp/backup-data /tmp/src.list /tmp/tar.list | 4.4 s |
| 3:53 | echo "backup-data: strict mode, quoted, fails loudly, and cron can find it" | 0.6 s |
13 Sep 2026 · 17:07 → 17:10 UTC
| At | Command | Took |
|---|---|---|
| 0:02 | export SYSTEMD_PAGER= PAGER=cat | 1.8 s |
| 0:03 | cat /etc/redhat-release | 1.1 s |
| 0:05 | id kmorris | 1.1 s |
| 0:06 | id apatel | 1.0 s |
| 0:07 | id rsingh | 2.3 s |
| 0:09 | getent group devops developers ops | 1.3 s |
| 0:10 | groups kmorris | 2.4 s |
| 0:13 | getent passwd kmorris apatel rsingh | 3.3 s |
| 0:16 | chage -l kmorris 2>/dev/null || sudo chage -l kmorris | 1.6 s |
| 0:18 | ls -ld /srv/project | 1.5 s |
| 0:19 | ls -l /srv/project | 3.1 s |
| 0:22 | stat -c '%A %U:%G %n' /srv/project /srv/project/* | 2.0 s |
| 0:24 | namei -l /srv/project/README | 3.7 s |
| 0:28 | getfacl /srv/project 2>/dev/null || sudo getfacl /srv/project | 1.6 s |
| 0:30 | ls -Zd /srv/project | 3.0 s |
| 0:33 | sudo -u kmorris touch /srv/project/kmorris-test | 2.9 s |
| 0:35 | sudo -u apatel touch /srv/project/apatel-test | 2.2 s |
| 0:38 | sudo -u kmorris ls /srv/project | 2.3 s |
| 0:40 | sudo -u apatel ls -l /srv/project | 3.1 s |
| 0:43 | find / -xdev -group developers 2>/dev/null | head | 3.7 s |
| 0:47 | sudo find / -xdev -group developers 2>/dev/null | head | 1.9 s |
| 0:49 | sudo ls -la /home/kmorris | 2.4 s |
| 0:51 | sudo cat /home/kmorris/.bash_profile | 1.7 s |
| 0:53 | sudo -iu kmorris umask | 2.2 s |
| 0:55 | grep -i '^umask' /etc/login.defs | 4.6 s |
| 1:00 | grep -rn umask /etc/profile /etc/bashrc /etc/profile.d/ 2>/dev/null | head -5 | 1.7 s |
| 1:01 | sudo -iu apatel umask | 4.7 s |
| 1:06 | sudo -iu kmorris bash -lc 'touch /tmp/kmorris-umask && ls -l /tmp/kmorris-umask' | 2.0 s |
| 1:08 | sudo ls -l /etc/sudoers.d/ | 2.1 s |
| 1:10 | sudo cat /etc/sudoers.d/devops | 1.5 s |
| 1:12 | sudo -l -U kmorris | 1.4 s |
| 1:13 | sudo -l -U apatel | 1.5 s |
| 1:15 | sudo -l -U rsingh | 3.1 s |
| 1:18 | sudo grep -rn nginx /etc/sudoers /etc/sudoers.d/ | 2.4 s |
| 1:20 | sudo grep -n includedir /etc/sudoers | 3.8 s |
| 1:24 | sudo -u apatel sudo -n systemctl restart nginx; echo "exit $?" | 3.0 s |
| 1:27 | grep -E '^(devops|developers|ops):' /etc/group | 2.2 s |
| 1:29 | sudo usermod -G devops kmorris | 1.1 s |
| 1:30 | id kmorris | 2.9 s |
| 1:33 | grep -E '^(devops|developers|ops):' /etc/group | 1.5 s |
| 1:35 | sudo -u kmorris id | 2.0 s |
| 1:37 | sudo chmod 2770 /srv/project | 3.6 s |
| 1:40 | sudo find /srv/project -maxdepth 1 -printf '%m %u:%g %p\n' | 1.6 s |
| 1:42 | ls -ld /srv/project | 2.4 s |
| 1:44 | stat -c '%a %A %U:%G' /srv/project | 3.0 s |
| 1:47 | sudo -u kmorris touch /srv/project/kmorris-test | 2.9 s |
| 1:50 | sudo -u apatel touch /srv/project/apatel-test | 1.5 s |
| 1:51 | ls -l /srv/project | 3.3 s |
| 1:55 | sudo -u rsingh ls /srv/project; echo "rsingh exit $?" | 2.8 s |
| 1:58 | sudo -u kmorris mkdir /srv/project/releases | 2.0 s |
| 2:00 | ls -ld /srv/project/releases | 4.0 s |
| 2:04 | sudo cp /home/kmorris/.bash_profile /root/kmorris.bash_profile.bak | 3.0 s |
| 2:07 | sudo grep -n umask /home/kmorris/.bash_profile | 4.0 s |
| 2:11 | sudo sed -i 's/^umask 077$/umask 002/' /home/kmorris/.bash_profile | 2.9 s |
| 2:14 | sudo grep -n umask /home/kmorris/.bash_profile | 1.7 s |
| 2:15 | sudo -iu kmorris umask | 5.3 s |
| 2:21 | sudo -iu kmorris bash -lc 'echo draft > /srv/project/plan.txt; ls -l /srv/project/plan.txt' | 3.8 s |
| 2:24 | sudo -u apatel sh -c 'echo reviewed >> /srv/project/plan.txt' | 1.9 s |
| 2:26 | cat /srv/project/plan.txt | 4.2 s |
| 2:30 | sudo -u kmorris sh -c 'echo edit-by-kmorris >> /srv/project/plan.txt' | 2.7 s |
| 2:33 | stat -c '%A %U:%G %n' /srv/project/plan.txt | 2.0 s |
| 2:35 | ls -l /srv/project/plan.txt | 3.4 s |
| 2:38 | sudo cp /etc/sudoers.d/devops /root/sudoers.devops.bak | 3.4 s |
| 2:42 | sudo sed -i 's/^%ops /%devops /' /etc/sudoers.d/devops | 2.1 s |
| 2:44 | sudo cat /etc/sudoers.d/devops | 2.5 s |
| 2:46 | sudo visudo -cf /etc/sudoers.d/devops | 1.3 s |
| 2:48 | sudo visudo -c | 2.4 s |
| 2:50 | sudo grep -c . /etc/sudoers.d/devops | 2.0 s |
| 2:52 | ls -l /etc/sudoers.d/devops | 1.5 s |
| 2:54 | sudo -l -U kmorris | 1.5 s |
| 2:55 | sudo -l -U rsingh | 3.4 s |
| 2:59 | systemctl is-active nginx || sudo systemctl start nginx | 4.3 s |
| 3:03 | sudo -u kmorris sudo -n systemctl restart nginx; echo "kmorris exit $?" | 4.3 s |
| 3:07 | sudo -u apatel sudo -n systemctl restart nginx; echo "apatel exit $?" | 4.2 s |
| 3:11 | sudo -u rsingh sudo -n systemctl restart nginx; echo "rsingh exit $?" | 4.8 s |
| 3:16 | sudo -u kmorris sudo -n systemctl stop nginx; echo "stop is not allowed: exit $?" | 1.9 s |
| 3:18 | systemctl is-active nginx | 2.8 s |
| 3:21 | systemctl status nginx --no-pager | head -5 | 2.7 s |
| 3:23 | sudo journalctl -n 6 --no-pager _COMM=sudo | 4.7 s |
| 3:28 | sudo rm -f /srv/project/kmorris-test /srv/project/apatel-test /tmp/kmorris-umask | 2.8 s |
| 3:31 | sudo -u kmorris rmdir /srv/project/releases | 1.6 s |
| 3:33 | ls -la /srv/project | 1.1 s |
| 3:34 | id kmorris | 1.6 s |
| 3:35 | ls -ld /srv/project | 1.8 s |
| 3:37 | sudo -iu kmorris umask | 2.2 s |
| 3:39 | sudo cat /etc/sudoers.d/devops | 1.6 s |
| 3:41 | getent group devops | 5.1 s |
| 3:46 | echo "kmorris: devops only, setgid workspace, umask 002, nginx restart rule for %devops" | 0.6 s |
16 Sep 2026 · 02:48 → 02:49 UTC
| At | Command | Took |
|---|---|---|
| 0:01 | df -h /var/log/app | 1.6 s |
| 0:03 | du -sh /var/log/app | 3.0 s |
| 0:06 | ls -l /var/log/app | 2.5 s |
| 0:08 | sudo du -xh --max-depth=1 /var/log/app | 2.9 s |
| 0:11 | sudo lsof +L1 /var/log/app | 4.4 s |
| 0:15 | sudo lsof -nP /var/log/app | head -5 | 2.8 s |
| 0:18 | systemctl status ledger --no-pager | head -8 | 6.1 s |
| 0:24 | sudo ls -l /proc/$(systemctl show -p MainPID --value ledger)/fd | grep deleted | 4.1 s |
| 0:28 | sudo systemctl restart ledger | 1.5 s |
| 0:30 | df -h /var/log/app | 2.6 s |
| 0:32 | ls /etc/logrotate.d/ | 8.6 s |
| 0:41 | sudo tee /etc/logrotate.d/ledger >/dev/null <<'CONF' | 3.5 s |
| 0:45 | sudo logrotate --debug /etc/logrotate.d/ledger | head -12 | 3.0 s |
| 0:48 | df -h /var/log/app | 2.0 s |
| 0:49 | systemctl is-enabled ledger | 1.6 s |
12 Sep 2026 · 16:42 → 16:42 UTC
| At | Command | Took |
|---|---|---|
| 0:01 | cat /etc/norboten/base.json | 1.3 s |
| 0:03 | ls -l /srv/hello/ | 1.8 s |
| 0:04 | cat /srv/hello/message.txt | 2.0 s |
| 0:07 | sudo cat /srv/hello/message.txt | 4.2 s |
| 0:11 | stat -c '%A %U:%G %n' /srv/hello/message.txt | 2.3 s |
| 0:13 | sudo chmod o+r /srv/hello/message.txt | 1.9 s |
| 0:15 | ls -l /srv/hello/message.txt | 1.8 s |
| 0:17 | cat /srv/hello/message.txt | 5.3 s |
| 0:22 | cat /srv/hello/message.txt | sed -n 's/^The secret word is: //p' > ~/reply.txt | 1.2 s |
| 0:23 | cat ~/reply.txt | 1.4 s |
| 0:25 | ls -l ~/reply.txt | 1.5 s |
16 Sep 2026 · 02:50 → 02:56 UTC
| At | Command | Took |
|---|---|---|
| 0:02 | export SYSTEMD_PAGER= PAGER=cat | 1.0 s |
| 0:03 | hostname | 0.9 s |
| 0:04 | uptime | 2.5 s |
| 0:06 | curl -s -m 3 localhost:8080/ | head -5 | 2.6 s |
| 0:09 | curl -sI -m 3 localhost:8080/ | head -5 | 1.8 s |
| 0:10 | systemctl is-active notes | 1.9 s |
| 0:12 | systemctl is-enabled notes | 2.8 s |
| 0:15 | systemctl status notes --no-pager | head -12 | 1.9 s |
| 0:17 | sudo systemctl start notes | 3.9 s |
| 0:21 | systemctl is-active notes | 2.9 s |
| 0:24 | systemctl status notes --no-pager | head -14 | 2.4 s |
| 0:26 | journalctl -u notes -n 15 --no-pager | 1.6 s |
| 0:28 | systemctl cat notes | 2.1 s |
| 0:30 | ls -l /usr/local/bin/notes-app | 2.2 s |
| 0:32 | head -20 /usr/local/bin/notes-app | 1.0 s |
| 0:33 | id notes | 1.5 s |
| 0:35 | getent passwd notes | 1.4 s |
| 0:36 | ls -ld /etc/notes | 1.4 s |
| 0:37 | ls -l /etc/notes/ | 2.1 s |
| 0:40 | sudo cat /etc/notes/notes.ini | 2.5 s |
| 0:42 | sudo -u notes cat /etc/notes/notes.ini | 2.7 s |
| 0:45 | sudo chown root:notes /etc/notes/notes.ini | 2.4 s |
| 0:47 | sudo chmod 0640 /etc/notes/notes.ini | 1.9 s |
| 0:49 | ls -l /etc/notes/notes.ini | 2.5 s |
| 0:52 | sudo -u notes cat /etc/notes/notes.ini | 2.0 s |
| 0:54 | sudo systemctl restart notes | 3.9 s |
| 0:57 | systemctl is-active notes | 2.4 s |
| 1:00 | journalctl -u notes -n 10 --no-pager | 1.9 s |
| 1:02 | sudo ss -tlnp | grep 8080 | 1.3 s |
| 1:03 | sudo ss -tlnp | 5.9 s |
| 1:09 | ps -o pid,user,cmd -p "$(sudo ss -tlnpH 'sport = :8080' | grep -o 'pid=[0-9]*' | head -1 | cut -d= -f2)" | 3.7 s |
| 1:13 | systemctl list-units --type=service --no-pager | grep -i notes | 3.2 s |
| 1:16 | systemctl status notes-legacy --no-pager | head -10 | 1.9 s |
| 1:18 | systemctl cat notes-legacy | 2.0 s |
| 1:20 | ls -l /var/www/legacy-notes/ | 2.4 s |
| 1:22 | cat /var/www/legacy-notes/index.html | 2.3 s |
| 1:24 | systemctl is-enabled notes-legacy | 2.7 s |
| 1:27 | sudo systemctl disable --now notes-legacy | 2.3 s |
| 1:29 | systemctl is-active notes-legacy | 3.2 s |
| 1:33 | sudo ss -tlnp | grep 8080 || echo "nothing on 8080" | 2.0 s |
| 1:35 | sudo systemctl restart notes | 3.9 s |
| 1:39 | systemctl is-active notes | 1.8 s |
| 1:40 | sudo ss -tlnp | grep 8080 | 2.0 s |
| 1:42 | curl -s -m 3 localhost:8080/ | 2.6 s |
| 1:45 | curl -si -m 3 localhost:8080/ | head -6 | 2.4 s |
| 1:47 | journalctl -u notes -n 10 --no-pager | 1.7 s |
| 1:49 | sudo ls -ld /srv/notes | 1.6 s |
| 1:51 | sudo ls -l /srv/notes | 1.9 s |
| 1:53 | sudo -u notes ls /srv/notes | 4.4 s |
| 1:57 | grep -n data /etc/notes/notes.ini || sudo grep -n data /etc/notes/notes.ini | 1.9 s |
| 1:59 | sudo aa-status | head -20 | 2.3 s |
| 2:01 | sudo aa-status | grep -A2 -i notes | 2.4 s |
| 2:04 | ls -l /etc/apparmor.d/ | grep notes | 2.8 s |
| 2:06 | cat /etc/apparmor.d/usr.local.bin.notes-app | 3.5 s |
| 2:10 | sudo journalctl -k --no-pager | grep -i apparmor | tail -5 | 1m 04s |
| 3:14 | sudo journalctl --no-pager -n 200 | grep -i 'apparmor="DENIED"' | tail -3 | 1m 04s |
| 4:19 | sudo cp /etc/apparmor.d/usr.local.bin.notes-app /root/usr.local.bin.notes-app.bak | 4.8 s |
| 4:24 | sudo sed -i 's#/var/lib/notes/#/srv/notes/#' /etc/apparmor.d/usr.local.bin.notes-app | 3.3 s |
| 4:27 | grep -n notes /etc/apparmor.d/usr.local.bin.notes-app | 3.8 s |
| 4:31 | sudo apparmor_parser -r /etc/apparmor.d/usr.local.bin.notes-app | 2.2 s |
| 4:33 | sudo aa-status | grep -i notes | 2.0 s |
| 4:35 | sudo systemctl restart notes | 4.0 s |
| 4:39 | curl -s -m 3 localhost:8080/ | 4.1 s |
| 4:43 | sudo journalctl --no-pager -n 50 | grep -c 'apparmor="DENIED"' || true | 2.2 s |
| 4:45 | systemctl show notes -p Restart | 2.4 s |
| 4:48 | systemctl show notes -p UnitFileState | 3.1 s |
| 4:51 | sudo mkdir -p /etc/systemd/system/notes.service.d | 6.4 s |
| 4:57 | printf '[Service]\nRestart=on-failure\nRestartSec=2\n' | sudo tee /etc/systemd/system/notes.service.d/restart.conf | 2.0 s |
| 4:59 | sudo systemctl daemon-reload | 1.7 s |
| 5:01 | systemctl cat notes | 2.9 s |
| 5:04 | systemctl show notes -p Restart -p RestartUSec | 2.2 s |
| 5:06 | sudo systemctl enable --now notes | 2.0 s |
| 5:08 | systemctl is-enabled notes | 1.8 s |
| 5:10 | systemctl is-active notes | 4.0 s |
| 5:14 | MAINPID=$(systemctl show notes -p MainPID --value); echo "$MAINPID" | 1.7 s |
| 5:16 | sudo kill -9 "$MAINPID" | 2.9 s |
| 5:18 | systemctl is-active notes | 4.8 s |
| 5:23 | systemctl is-active notes | 2.9 s |
| 5:26 | systemctl show notes -p MainPID -p NRestarts | 2.4 s |
| 5:29 | journalctl -u notes -n 8 --no-pager | 2.0 s |
| 5:31 | curl -s -m 3 localhost:8080/ | 1.8 s |
| 5:32 | sudo ss -tlnp | grep 8080 | 3.1 s |
| 5:35 | systemctl list-unit-files --no-pager | grep notes | 2.5 s |
| 5:38 | systemctl is-enabled notes-legacy | 2.1 s |
| 5:40 | sudo aa-status | grep -i notes | 1.9 s |
| 5:42 | ls -l /etc/notes/notes.ini | 3.2 s |
| 5:45 | cat /etc/systemd/system/notes.service.d/restart.conf | 3.0 s |
| 5:48 | curl -si -m 3 localhost:8080/ | grep -i x-notes | 2.1 s |
| 5:50 | systemctl --failed --no-pager | 5.1 s |
| 5:55 | echo "notes: running, enabled, restarts on failure; legacy disabled; profile enforcing" | 0.6 s |
13 Sep 2026 · 17:11 → 17:15 UTC
| At | Command | Took |
|---|---|---|
| 0:02 | export SYSTEMD_PAGER= PAGER=cat | 1.0 s |
| 0:03 | hostname | 1.2 s |
| 0:04 | hostnamectl | 1.9 s |
| 0:06 | ip -4 addr show dev eth0 | 1.2 s |
| 0:07 | getenforce | 2.6 s |
| 0:10 | cat /etc/selinux/config | grep ^SELINUX= | 1.5 s |
| 0:11 | sestatus | head -6 | 3.8 s |
| 0:15 | curl -s -m 3 http://127.0.0.1:8090/ || echo "no answer on 8090" | 1.8 s |
| 0:17 | systemctl is-active nginx | 2.9 s |
| 0:20 | systemctl status nginx --no-pager | head -14 | 2.7 s |
| 0:22 | sudo journalctl -u nginx -n 12 --no-pager | 2.6 s |
| 0:25 | cat /etc/nginx/conf.d/status-site.conf | 1.8 s |
| 0:27 | ls -l /etc/nginx/conf.d/ | 1.2 s |
| 0:28 | sudo ss -tlnp | 1.2 s |
| 0:29 | sudo nginx -t | 2.7 s |
| 0:32 | sudo systemctl start nginx; echo "exit $?" | 2.7 s |
| 0:35 | sudo journalctl -u nginx -n 5 --no-pager | 3.3 s |
| 0:38 | sudo ausearch -m avc -ts recent 2>/dev/null | tail -6 | 4.0 s |
| 0:42 | sudo ausearch -m avc -ts recent 2>/dev/null | audit2why | head -20 | 2.9 s |
| 0:45 | sudo semanage port -l | grep -w http_port_t | 4.0 s |
| 0:49 | sudo semanage port -l | grep -w 8090 || echo "8090 has no label" | 3.2 s |
| 0:52 | sudo semanage port -a -t http_port_t -p tcp 8090 | 3.2 s |
| 0:55 | sudo semanage port -l | grep -w http_port_t | 2.1 s |
| 0:57 | sudo systemctl start nginx | 1.9 s |
| 0:59 | systemctl is-active nginx | 2.5 s |
| 1:02 | sudo ss -tlnp | grep -E ':8090|:9100' | 3.0 s |
| 1:05 | curl -si -m 3 http://127.0.0.1:8090/ | head -8 | 1.6 s |
| 1:06 | ls -ldZ /srv/status | 1.5 s |
| 1:08 | ls -lZ /srv/status | 0.8 s |
| 1:09 | id -Z | 2.0 s |
| 1:11 | ps -eZ | grep nginx | head -3 | 2.1 s |
| 1:13 | ls -ldZ /usr/share/nginx/html | 4.2 s |
| 1:17 | sudo ausearch -m avc -ts recent 2>/dev/null | grep index.html | tail -2 | 3.0 s |
| 1:20 | matchpathcon /srv/status /srv/status/index.html | 3.1 s |
| 1:23 | sudo semanage fcontext -l | grep -E '^/srv' | head | 4.2 s |
| 1:27 | sudo semanage fcontext -a -t httpd_sys_content_t '/srv/status(/.*)?' | 2.4 s |
| 1:30 | sudo semanage fcontext -l -C | 2.5 s |
| 1:32 | matchpathcon /srv/status/index.html | 2.2 s |
| 1:34 | sudo restorecon -Rv /srv/status | 1.5 s |
| 1:36 | ls -lZ /srv/status | 3.0 s |
| 1:39 | curl -si -m 3 http://127.0.0.1:8090/ | head -8 | 2.4 s |
| 1:41 | curl -s -m 3 http://127.0.0.1:8090/ | 3.5 s |
| 1:45 | curl -si -m 3 http://127.0.0.1:8090/api/status | head -6 | 2.1 s |
| 1:47 | systemctl is-active status-api | 1.8 s |
| 1:49 | systemctl cat status-api | 2.2 s |
| 1:51 | ls -lZ /usr/local/bin/status-api | 2.7 s |
| 1:54 | curl -s -m 3 http://127.0.0.1:9100/status | 2.5 s |
| 1:56 | sudo tail -3 /var/log/nginx/error.log | 4.3 s |
| 2:00 | sudo ausearch -m avc -ts recent 2>/dev/null | grep name_connect | tail -2 | 2.5 s |
| 2:03 | getsebool -a | grep httpd_can_network | 3.5 s |
| 2:06 | sudo semanage boolean -l | grep httpd_can_network_connect | 3.1 s |
| 2:09 | sudo setsebool -P httpd_can_network_connect on | 2.7 s |
| 2:12 | getsebool httpd_can_network_connect | 3.0 s |
| 2:15 | curl -s -m 3 http://127.0.0.1:8090/api/status | 3.5 s |
| 2:19 | curl -si -m 3 http://127.0.0.1:8090/api/status | head -4 | 1.8 s |
| 2:20 | sudo firewall-cmd --state | 2.5 s |
| 2:23 | sudo firewall-cmd --get-active-zones | 2.1 s |
| 2:25 | sudo firewall-cmd --list-all | 2.4 s |
| 2:27 | sudo firewall-cmd --list-services | 2.8 s |
| 2:30 | sudo firewall-cmd --permanent --list-ports | 3.3 s |
| 2:34 | sudo firewall-cmd --permanent --remove-port=8080/tcp | 3.2 s |
| 2:37 | sudo firewall-cmd --permanent --add-port=8090/tcp | 2.0 s |
| 2:39 | sudo firewall-cmd --reload | 2.3 s |
| 2:41 | sudo firewall-cmd --list-ports | 2.8 s |
| 2:44 | sudo firewall-cmd --permanent --list-ports | 1.1 s |
| 2:45 | hostname | 1.6 s |
| 2:47 | hostnamectl --static | 1.5 s |
| 2:48 | cat /etc/hostname | 3.0 s |
| 2:51 | sudo hostnamectl set-hostname web01.lab.example | 1.6 s |
| 2:53 | hostnamectl --static | 1.4 s |
| 2:54 | cat /etc/hostname | 1.6 s |
| 2:56 | nmcli device status | 1.7 s |
| 2:57 | nmcli connection show | 2.9 s |
| 3:00 | nmcli -g GENERAL.CONNECTION device show eth0 | 3.8 s |
| 3:04 | CON=$(nmcli -g GENERAL.CONNECTION device show eth0); echo "$CON" | 3.5 s |
| 3:08 | nmcli -g ipv4.addresses,ipv4.method connection show "$CON" | 1.8 s |
| 3:09 | ip -4 addr show dev eth0 | 4.0 s |
| 3:13 | sudo nmcli connection modify "$CON" +ipv4.addresses 192.168.5.50/24 | 3.0 s |
| 3:16 | nmcli -g ipv4.addresses connection show "$CON" | 2.1 s |
| 3:18 | sudo nmcli device reapply eth0 | 3.9 s |
| 3:22 | ip -4 addr show dev eth0 | 4.7 s |
| 3:27 | sudo grep -rl 192.168.5.50 /etc/NetworkManager/system-connections/ 2>/dev/null | 2.3 s |
| 3:29 | sestatus | grep -i 'current mode' | 2.2 s |
| 3:31 | sudo restorecon -Rnv /srv/status | 2.4 s |
| 3:34 | curl -s -m 3 http://127.0.0.1:8090/ | 2.8 s |
| 3:37 | curl -s -m 3 http://127.0.0.1:8090/api/status | 2.5 s |
| 3:39 | systemctl is-enabled nginx status-api | 3.3 s |
| 3:43 | sudo ausearch -m avc -ts recent 2>/dev/null | tail -2 | 6.2 s |
| 3:49 | echo "status site: labelled, bound, allowed out, opened, and web01.lab.example with 192.168.5.50 persistently" | 0.6 s |
12 Sep 2026 · 17:21 → 17:23 UTC
| At | Command | Took |
|---|---|---|
| 0:02 | curl -sS localhost:8081/health | 3.2 s |
| 0:05 | systemctl status inventory-api --no-pager | head -10 | 3.8 s |
| 0:08 | sudo systemctl start inventory-api | 2.7 s |
| 0:11 | journalctl -u inventory-api -n 8 --no-pager | 5.6 s |
| 0:17 | systemctl list-dependencies inventory-api --no-pager | head -8 | 2.4 s |
| 0:19 | systemctl cat inventory-api --no-pager | 4.6 s |
| 0:24 | systemctl is-enabled config-sync | 2.2 s |
| 0:26 | sudo systemctl unmask config-sync | 4.2 s |
| 0:30 | ls -l /etc/systemd/system/inventory-api.service.d/ | 3.5 s |
| 0:34 | cat /etc/systemd/system/inventory-api.service.d/override.conf | 5.8 s |
| 0:39 | sudo rm -f /etc/systemd/system/inventory-api.service.d/override.conf | 3.3 s |
| 0:43 | sudo mkdir -p /etc/systemd/system/inventory-api.service.d | 5.8 s |
| 0:49 | printf '[Unit]\nWants=config-sync.service\n' | sudo tee /etc/systemd/system/inventory-api.service.d/deps.conf | 1.9 s |
| 0:51 | sudo systemctl daemon-reload | 2.8 s |
| 0:53 | systemctl get-default | 2.7 s |
| 0:56 | sudo systemctl set-default multi-user.target | 3.8 s |
| 1:00 | sudo systemctl enable --now inventory-api | 3.0 s |
| 1:03 | systemctl is-active inventory-api config-sync | 2.0 s |
| 1:05 | curl -sS localhost:8081/health | 2.1 s |
o opens a shell and records nothing. p writes an asciicast and a command log to ~/.norboten/plays, on your machine.
Only P publishes anything, after a confirmation, and only while the session runs. Recordings expire after a week.
Answers and scores, nothing else. There is no terminal to record and no reason to keep one.