From 9ebe896757c8afdb4a2bdf5a51f35a8596b4c8f9 Mon Sep 17 00:00:00 2001 From: Felix Schueren Date: Sat, 8 Nov 2025 00:49:55 +0100 Subject: [PATCH] more hosts, keychain, small stuff --- .../linux-base-image/Dockerfile | 1 + config/dnsmasq.conf | 2 +- helpers/csv2cards.sh | 30 +- helpers/fireworks.sh | 388 ++++++++++++++++++ setups/gateway.sh | 10 +- setups/jumphost.sh | 1 + setups/linux.sh | 11 +- sshlab.clab.yml | 31 ++ 8 files changed, 458 insertions(+), 16 deletions(-) rename Dockerfile => build/linux-base-image/Dockerfile (94%) create mode 100755 helpers/fireworks.sh diff --git a/Dockerfile b/build/linux-base-image/Dockerfile similarity index 94% rename from Dockerfile rename to build/linux-base-image/Dockerfile index 51fb87e..b8f7a02 100644 --- a/Dockerfile +++ b/build/linux-base-image/Dockerfile @@ -2,6 +2,7 @@ FROM debian:latest RUN apt update && apt --yes install openssh-server python3 sudo iproute2 iputils-ping traceroute vim && mkdir -p /root/.ssh/ && mkdir -p /run/sshd && rm -f /etc/ssh/ssh_host* RUN apt --yes install dnsmasq udhcpc less tcpdump RUN apt --yes install telnet netcat-openbsd wget curl man net-tools +RUN apt --yes install keychain # RUN apt install --yes nginx python3-pip # RUN pip3 install 'uvicorn[standard] fastapi' diff --git a/config/dnsmasq.conf b/config/dnsmasq.conf index 1eac972..299519b 100644 --- a/config/dnsmasq.conf +++ b/config/dnsmasq.conf @@ -1,3 +1,3 @@ interface=eth2 domain=sshworkshop.local -dhcp-range=set:workshop,192.168.0.10,192.168.0.200,12h +dhcp-range=set:workshop,192.168.0.1,192.168.0.200,36h diff --git a/helpers/csv2cards.sh b/helpers/csv2cards.sh index ac6ef4f..eb8941f 100644 --- a/helpers/csv2cards.sh +++ b/helpers/csv2cards.sh @@ -1,9 +1,11 @@ #!/usr/bin/env bash -# csv2cards.sh → html +# csv2cards.sh → html with guaranteed colour styling + CSV=${1:-credentials.csv} OUT=${2:-cards.html} -# start the document +# -------------------------------------------------------------- +# 1️⃣ Write the full HTML header (including the colour CSS) cat >"$OUT" <<'EOF' @@ -14,7 +16,7 @@ cat >"$OUT" <<'EOF' @page { size: A4 portrait; margin: 1cm; } body { font-family: monospace; display: flex; flex-wrap: wrap; gap: 0.5cm; } .card { - width: 9cm; /* fits 2‑3 cards across A4 */ + width: 9cm; border: 1px solid #333; padding: 0.3cm; box-sizing: border-box; @@ -22,14 +24,25 @@ cat >"$OUT" <<'EOF' } .field { margin: 0.1cm 0; } .label { font-weight: bold; } + + /* ---- 6‑colour palette (exactly as you requested) ---- */ + .bg0 { background:#eeff90; } /* light lime */ + .bg1 { background:#b9ffbf; } /* pastel green */ + .bg2 { background:#b6e1ff; } /* soft blue */ + .bg3 { background:#ffd795; } /* peach */ + .bg4 { background:#f0a6fc; } /* lavender */ + .bg5 { background:#f397a5; } /* coral */ EOF -# read CSV, skip header, emit a
per line -awk -F',' 'NR>1{ - printf "
\n" +# -------------------------------------------------------------- +# 2️⃣ Convert each CSV row into a coloured card +awk -F',' ' +NR>1{ + col = (NR-2) % 6 # 0‑5 cycle + printf "
\n", col printf "
IP: %s
\n", $1 printf "
Host: %s
\n", $2 printf "
User: %s
\n", $3 @@ -37,8 +50,9 @@ awk -F',' 'NR>1{ printf "
\n" }' "$CSV" >>"$OUT" -# close the document +# -------------------------------------------------------------- +# 3️⃣ Close the HTML document cat >>"$OUT" <<'EOF' -EOF \ No newline at end of file +EOF diff --git a/helpers/fireworks.sh b/helpers/fireworks.sh new file mode 100755 index 0000000..7110725 --- /dev/null +++ b/helpers/fireworks.sh @@ -0,0 +1,388 @@ +#!/bin/bash + +# +# This holiday decoration script was put together by Bryan Lunduke. +# www.Lunduke.com +# +# Some portions were inspired or copied from other works. Where that is +# the case it is noted within the source. +# + +# Reset +Color_Off='\033[0m' # Text Reset + +# Regular Colors +Black='\033[0;30m' # Black +Red='\033[0;31m' # Red +Green='\033[0;32m' # Green +Yellow='\033[0;33m' # Yellow +Blue='\033[0;34m' # Blue +Purple='\033[0;35m' # Purple +Cyan='\033[0;36m' # Cyan +White='\033[0;37m' # White + +# Bold +BBlack='\033[1;30m' # Black +BRed='\033[1;31m' # Red +BGreen='\033[1;32m' # Green +BYellow='\033[1;33m' # Yellow +BBlue='\033[1;34m' # Blue +BPurple='\033[1;35m' # Purple +BCyan='\033[1;36m' # Cyan +BWhite='\033[1;37m' # White + + + + +ShowTree () { +# +# The base of this animated tree was copied from ChrisBASHTree +# https://github.com/sergiolepore/ChristBASHTree +# +trap "tput reset; tput cnorm; exit" 2 +clear +tput civis +lin=2 +col=$(($(tput cols) / 2)) +c=$((col-1)) +est=$((c-2)) +color=0 +tput setaf 2; tput bold + +# Tree +for ((i=1; i<20; i+=2)) +{ + tput cup $lin $col + for ((j=1; j<=i; j++)) + { + echo -n \* + } + let lin++ + let col-- +} + +tput sgr0; tput setaf 3 + +# Trunk +for ((i=1; i<=2; i++)) +{ + tput cup $((lin++)) $c + echo 'mWm' +} +new_year=$(date +'%Y') +let new_year++ +tput setaf 1; tput bold + +tput cup $lin $((c - 6)); echo MERRY CHRISTMAS + +let c++ +k=1 + +# Lights and decorations +while true; do + for ((i=1; i<=35; i++)) { + # Turn off the lights + [ $k -gt 1 ] && { + tput setaf 2; tput bold + tput cup ${line[$[k-1]$i]} ${column[$[k-1]$i]}; echo \* + unset line[$[k-1]$i]; unset column[$[k-1]$i] # Array cleanup + } + + li=$((RANDOM % 9 + 3)) + start=$((c-li+2)) + co=$((RANDOM % (li-2) * 2 + 1 + start)) + tput setaf $color; tput bold # Switch colors + tput cup $li $co + echo o + line[$k$i]=$li + column[$k$i]=$co + color=$(((color+1)%8)) + # Flashing text + sh=1 + for l in C O D E + do + tput cup $((lin+1)) $((c+sh)) + #echo $l + let sh++ + sleep 0.01 + done + } + k=$((k % 2 + 1)) +done + +} + + + +ShowMenorah () { + + +# Draw the Menorah +clear +echo +echo +echo + + +echo -e "${Blue} |" +echo -e "${Blue} | | | | | | | | |" +echo -e "${Blue} | | | | | | | | |" +echo -e "${Blue} | | | | | | | | |" +echo -e "${Blue} \ \ \ \ | / / / /" +echo -e "${Blue} \ \ \ \_|_/ / / /" +echo -e "${Blue} \ \ \ | / / /" +echo -e "${Blue} \ \ \__|__/ / / Happy Hanukkah!" +echo -e "${Blue} \ \ | / / ${White}Chag Hanukkah sameach!" +echo -e "${Blue} \ \___|___/ /" +echo -e "${Blue} \ | /" +echo -e "${Blue} \____|____/" +echo -e "${Blue} |" +echo -e "${Blue} __|__" +echo -e "${Blue} ____|____" + + + +# Count the candles for each night +while true; do + for ((i=1; i<=9; i++)) { + +tput cup 2 0; echo -e "${White} |" + +if [ $i -eq 1 ] +then # Night 0 - Shamash only +tput cup 2 0; echo -e "${White} |" +tput cup 3 0; echo -e "${White} ${Blue} | ${White} " +tput cup 6 0; echo -e "${Blue} | | | | | | | | | ${White}Shamash only" + +elif [ $i -eq 2 ] +then # Night 1 +tput cup 3 0; echo -e "${White} ${Blue} | ${White} |" +tput cup 6 0; echo -e "${Blue} | | | | | | | | | ${White}Night 1 " + +elif [ $i -eq 3 ] +then # Night 2 +tput cup 3 0; echo -e "${White} ${Blue} | ${White} | |" +tput cup 6 0; echo -e "${Blue} | | | | | | | | | ${White}Night 2 " + +elif [ $i -eq 4 ] +then # Night 3 +tput cup 3 0; echo -e "${White} ${Blue} | ${White} | | |" +tput cup 6 0; echo -e "${Blue} | | | | | | | | | ${White}Night 3 " + +elif [ $i -eq 5 ] +then # Night 4 +tput cup 3 0; echo -e "${White} ${Blue} | ${White}| | | |" +tput cup 6 0; echo -e "${Blue} | | | | | | | | | ${White}Night 4 " + +elif [ $i -eq 6 ] +then # Night 5 +tput cup 3 0; echo -e "${White} | ${Blue} | ${White}| | | |" +tput cup 6 0; echo -e "${Blue} | | | | | | | | | ${White}Night 5 " + +elif [ $i -eq 7 ] +then # Night 6 +tput cup 3 0; echo -e "${White} | | ${Blue} | ${White}| | | |" +tput cup 6 0; echo -e "${Blue} | | | | | | | | | ${White}Night 6 " + +elif [ $i -eq 8 ] +then # Night 7 +tput cup 3 0; echo -e "${White} | | | ${Blue} | ${White}| | | |" +tput cup 6 0; echo -e "${Blue} | | | | | | | | | ${White}Night 7 " + +elif [ $i -eq 9 ] +then # Night 8 +tput cup 3 0; echo -e "${White} | | | | ${Blue} | ${White}| | | |" +tput cup 6 0; echo -e "${Blue} | | | | | | | | | ${White}Night 8 " + +fi + + + sleep 0.5 + } + +done + + +} + + +function colorstr() +{ + local row=$1 + local col=$2 + local color=$3 + local v + case "$color" in + red) v=31;; + green) v=34;; + blue) v=32;; + purple) v=35;; + cyan) v=36;; + yellow) v=33;; + brown) v=33;; + white) v=37;; + *) v=;; + esac + shift 3 + + if [[ $multiple -ne 0 ]]; then + touch $lock_file + while [[ $(ls $lock_file_base.* 2>/dev/null | head -n 1) != $lock_file ]] + do + sleep 0.05 + done + fi + + tput cup $row $col + echo -n -e "\e["$v"m" + set -f + echo -n $* + set +f + if [[ $multiple -ne 0 ]]; then + rm -f $lock_file + fi +} + +function center_colorstr() +{ + local row=$1 + local color=$2 + shift 2 + local s="$*" + local slen=${#s} + colorstr $row $(((cols / 2) - (slen / 2))) $color "$s" +} + +function fireworks() +{ + local row=$((rows - 1)) + local col=$(((RANDOM % (cols / 2)) + (cols / 4))) + local height=$((RANDOM % rows - 2)) + local slant + local h + local color1=${colors[$((RANDOM % ${#colors[*]}))]} + local color2=${colors[$((RANDOM % ${#colors[*]}))]} + local color3=${colors[$((RANDOM % ${#colors[*]}))]} + while [[ $color1 == $color2 || $color1 == $color3 || $color2 == $color3 ]] + do + color2=${colors[$((RANDOM % ${#colors[*]}))]} + color3=${colors[$((RANDOM % ${#colors[*]}))]} + done + + case $((RANDOM % 4)) in + 0) slant=-2;; + 1) slant=-1;; + 2) slant=1;; + 3) slant=2;; + esac + + if [[ $height -gt 5 ]]; then + h=$height + + while [[ $h -gt 0 ]] + do + colorstr $row $col $color1 '.' + let row-- + if [[ $((col + slant)) -ge $((cols - 3)) || $((col + slant)) -le 2 ]]; then break; fi + let col+=slant + let h-- + sleep 0.1 + done + + if [[ $((col + slant)) -lt $((cols - 3)) && $((col + slant)) -gt 2 ]]; then + + h=$((height / 5)) + + while [[ $h -gt 0 ]] + do + colorstr $row $col $color2 '.' + let row++ + if [[ $((col + slant)) -ge $((cols - 3)) || $((col + slant)) -le 2 ]]; then break; fi + let col+=slant + let h-- + sleep 0.1 + done + fi + + colorstr $((row)) $((col - 1)) $color3 '***' + colorstr $((row - 1)) $((col)) $color3 '*' + colorstr $((row + 1)) $((col)) $color3 '*' + fi +} + + + +function runFireworks() +{ + +rows=$(tput lines) +cols=$(tput cols) +colors=(red green blue purple cyan yellow brown) +lock_file= +lock_file_base=/tmp/$(basename $0 .sh) + +multiple=0 +if [[ "$1" ]]; then + nsingle=$1 + shift +else + nsingle=10 +fi +if [[ "$1" ]]; then + nmultiple=$1 + shift + if [[ $nmultiple -gt 8 ]]; then nmultiple=8; fi +else + nmultiple=6 +fi + +clear + +until [ 1 -eq 2 ] +do +sleep 1 +clear + +pids= +for i in $(seq 1 $nmultiple) +do + let multiple++ + lock_file=$lock_file_base.$i + fireworks & + pids="$pids $!" +done + +trap "kill -9 $pids 2>/dev/null" EXIT + +wait $pids + +done + +clear + +} + + + + +if [ "$1" = "Tree" ] + +then + ShowTree + exit + +elif [ "$1" = "Menorah" ] +then + ShowMenorah + exit + +elif [ "$1" = "Fireworks" ] +then + runFireworks + exit + +else + echo -e "${White}Possible options for Lunduke's Shell Holiday Decorations: ${Blue}Tree Menorah Fireworks" + exit +fi + diff --git a/setups/gateway.sh b/setups/gateway.sh index cc3ebd7..5526a60 100755 --- a/setups/gateway.sh +++ b/setups/gateway.sh @@ -5,13 +5,13 @@ dpkg-reconfigure openssh-server ip addr replace dev eth1 10.192.40.2/29 # the "southbound" interface towards all the clients that we are DHCP server for -ip addr replace dev eth2 192.168.0.1/24 +ip addr replace dev eth2 192.168.0.254/24 # "eastbound" gw<->jumphost1 eth3 and 172.16.200/23 behind jumphost1 ip addr replace dev eth3 172.16.202.32/31 # ip route replace 172.16.200/23 via 172.16.202.33 -echo "nameserver 192.168.0.1" > /etc/resolv.conf +echo "nameserver 192.168.0.254" > /etc/resolv.conf # ---------------------------------------------------------------------- @@ -25,8 +25,10 @@ echo "nameserver 192.168.0.1" > /etc/resolv.conf /usr/local/bin/online-users.sh ) > /online-users.txt & # ← background the whole subshell -(/usr/sbin/sshd -D) & # launch dnsmasq (automatically backgrounds) -dnsmasq --no-daemon +(dnsmasq --no-daemon --log-facility=/dns.log --log-queries) & +# dnsmasq --no-daemon + +/usr/sbin/sshd -D diff --git a/setups/jumphost.sh b/setups/jumphost.sh index d19dc2c..41b547d 100755 --- a/setups/jumphost.sh +++ b/setups/jumphost.sh @@ -9,6 +9,7 @@ create_user_from_shared_names_list () { my_pwd=${my_pwhash_pwd#*,} useradd -m ${my_username} -p "${my_pwhash}" -s /bin/bash # su - ${my_username} -c 'mkdir -p .ssh' + su - ${my_username} -c "echo 'alias fireworks=\"fireworks.sh Fireworks\"' >> ~/.bash_aliases" echo "$my_pwd" > /home/${my_username}/PASSWORD } diff --git a/setups/linux.sh b/setups/linux.sh index 56ffdbb..6f1a58c 100755 --- a/setups/linux.sh +++ b/setups/linux.sh @@ -1,9 +1,13 @@ #!/bin/bash dpkg-reconfigure openssh-server # my_username=$(shuf -n 1 /etc/workshopnames.yml | cut -b 3-) -udhcpc -i eth0 -x hostname:$(hostname) -F $(hostname) -# once we have our IP, create the matching user. -my_last_octet=$(ip -4 a s dev eth0 | grep / | cut -f 4 -d . | cut -f 1 -d /) +# udhcpc -i eth0 -x hostname:$(hostname) -F $(hostname) +# # once we have our IP, create the matching user. +# my_last_octet=$(ip -4 a s dev eth0 | grep / | cut -f 4 -d . | cut -f 1 -d /) +my_last_octet=$(( $(hostname | tr -cd '0-9') )) ## just keep the numbers from the hostname +# ip addr replace dev eth0 192.168.0.${my_last_octet}/24 +# ip route replace default via 192.168.0.1 +udhcpc -i eth0 -x hostname:$(hostname) -F $(hostname) -r 192.168.0.${my_last_octet} # request .1 for linux1, etc. GW should be .254 my_username_pwhash=$(sed -n "${my_last_octet}{p;q}" /etc/workshopnames.yml) my_username="${my_username_pwhash%%:*}" my_pwhash_pwd="${my_username_pwhash#*: }" @@ -14,4 +18,5 @@ su - ${my_username} -c 'mkdir .ssh' echo "$my_pwd" > /home/${my_username}/PASSWORD # cp /root/.ssh/authorized_keys /home/${my_username}/.ssh/ && chown ${my_username}:${my_username} /home/${my_username}/.ssh/authorized_keys printf "172.16.202.33\tjumphost1\n" >> /etc/hosts +su - ${my_username} -c "echo 'alias fireworks=\"fireworks.sh Fireworks\"' >> ~/.bash_aliases" /usr/sbin/sshd -D diff --git a/sshlab.clab.yml b/sshlab.clab.yml index ef4968d..940c1c5 100644 --- a/sshlab.clab.yml +++ b/sshlab.clab.yml @@ -14,6 +14,8 @@ topology: - ./config/names-hashes.yml:/etc/workshopnames.yml:ro - ./config/authorized_keys:/root/.ssh/authorized_keys:ro - ./setups/linux.sh:/usr/local/bin/setup.sh:ro + - ./helpers/fireworks.sh:/usr/local/bin/fireworks.sh:ro + - ./helpers/ssh-agent-environment.sh:/usr/local/bin/ssh-agent-environment.sh:ro memory: 256MB cpu-set: 4-7 nodes: @@ -36,6 +38,7 @@ topology: binds: - ./setups/jumphost.sh:/usr/local/bin/setup.sh:ro - ./config/names-hashes.yml:/etc/workshopnames.yml:ro + - ./helpers/fireworks.sh:/usr/local/bin/fireworks.sh:ro memory: 4GB cpu-set: 2-3 jumphost2: @@ -107,6 +110,20 @@ topology: linux48: {kind: linux} linux49: {kind: linux} linux50: {kind: linux} + linux51: {kind: linux} + linux52: {kind: linux} + linux53: {kind: linux} + linux54: {kind: linux} + linux55: {kind: linux} + linux56: {kind: linux} + linux57: {kind: linux} + linux58: {kind: linux} + linux59: {kind: linux} + linux60: {kind: linux} + linux61: {kind: linux} + linux62: {kind: linux} + linux63: {kind: linux} + linux64: {kind: linux} links: # - endpoints: ["a1:eth1","br-clab:eth1"] @@ -166,3 +183,17 @@ topology: - endpoints: [ "linux48:eth0", "br-clab-intonly:l48" ] - endpoints: [ "linux49:eth0", "br-clab-intonly:l49" ] - endpoints: [ "linux50:eth0", "br-clab-intonly:l50" ] + - endpoints: [ "linux51:eth0", "br-clab-intonly:l51" ] + - endpoints: [ "linux52:eth0", "br-clab-intonly:l52" ] + - endpoints: [ "linux53:eth0", "br-clab-intonly:l53" ] + - endpoints: [ "linux54:eth0", "br-clab-intonly:l54" ] + - endpoints: [ "linux55:eth0", "br-clab-intonly:l55" ] + - endpoints: [ "linux56:eth0", "br-clab-intonly:l56" ] + - endpoints: [ "linux57:eth0", "br-clab-intonly:l57" ] + - endpoints: [ "linux58:eth0", "br-clab-intonly:l58" ] + - endpoints: [ "linux59:eth0", "br-clab-intonly:l59" ] + - endpoints: [ "linux60:eth0", "br-clab-intonly:l60" ] + - endpoints: [ "linux61:eth0", "br-clab-intonly:l61" ] + - endpoints: [ "linux62:eth0", "br-clab-intonly:l62" ] + - endpoints: [ "linux63:eth0", "br-clab-intonly:l63" ] + - endpoints: [ "linux64:eth0", "br-clab-intonly:l64" ] \ No newline at end of file