91 lines
2.5 KiB
Bash
91 lines
2.5 KiB
Bash
#!/bin/bash
|
|
# deploy-keys.sh — deploy workstation SSH pubkeys to hubris + all LXCs
|
|
#
|
|
# Run from hubris (PVE host) as root.
|
|
# Reads keys from /opt/homelab-context/ssh/authorized_keys/*.pub
|
|
# and appends them to /root/.ssh/authorized_keys in each running LXC,
|
|
# and to /etc/pve/priv/authorized_keys on hubris.
|
|
#
|
|
# Idempotent — skips keys already present.
|
|
|
|
set -euo pipefail
|
|
|
|
KEYS_DIR="/opt/homelab-context/ssh/authorized_keys"
|
|
|
|
if ! [ -d "$KEYS_DIR" ]; then
|
|
echo "ERROR: $KEYS_DIR not found. Is homelab context synced?"
|
|
exit 1
|
|
fi
|
|
|
|
# Collect all pubkeys into a single variable, one per line
|
|
ALL_KEYS=""
|
|
for f in "$KEYS_DIR"/*.pub; do
|
|
[ -f "$f" ] || continue
|
|
key=$(cat "$f" | head -1)
|
|
ALL_KEYS="${ALL_KEYS}${key}
|
|
"
|
|
done
|
|
|
|
if [ -z "$ALL_KEYS" ]; then
|
|
echo "ERROR: no .pub files found in $KEYS_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
echo "= Deploying SSH keys to hubris ="
|
|
AUTH_FILE="/etc/pve/priv/authorized_keys"
|
|
touch "$AUTH_FILE"
|
|
added=0
|
|
while IFS= read -r key; do
|
|
[ -z "$key" ] && continue
|
|
if ! grep -qF "$key" "$AUTH_FILE" 2>/dev/null; then
|
|
echo " + Adding key to hubris: ${key:0:40}..."
|
|
echo "$key" >> "$AUTH_FILE"
|
|
added=$((added + 1))
|
|
fi
|
|
done <<< "$ALL_KEYS"
|
|
echo " hubris: $added key(s) added"
|
|
|
|
# Deploy to LXCs
|
|
echo ""
|
|
echo "= Deploying SSH keys to LXCs ="
|
|
|
|
# pct list output: VMID Status Lock Name (Lock may be empty)
|
|
# Use awk to grab VMID, Status, and Name (last field)
|
|
pct list | tail -n +2 | while read -r line; do
|
|
vmid=$(echo "$line" | awk '{print $1}')
|
|
status=$(echo "$line" | awk '{print $2}')
|
|
name=$(echo "$line" | awk '{print $NF}')
|
|
# Skip header if any
|
|
[ "$vmid" = "VMID" ] && continue
|
|
[ -z "$vmid" ] && continue
|
|
if [ "$status" != "running" ]; then
|
|
echo " SKIP $name ($vmid): status=$status"
|
|
continue
|
|
fi
|
|
|
|
echo " -> $name ($vmid)"
|
|
|
|
# Ensure .ssh directory exists
|
|
pct exec "$vmid" -- mkdir -p /root/.ssh 2>/dev/null
|
|
|
|
# For each key, check if already present, append if not
|
|
while IFS= read -r key; do
|
|
[ -z "$key" ] && continue
|
|
if ! pct exec "$vmid" -- grep -qF "$key" /root/.ssh/authorized_keys 2>/dev/null; then
|
|
echo " + ${key:0:40}..."
|
|
# Use tee to append (pct exec preserves stdin)
|
|
echo "$key" | pct exec "$vmid" -- tee -a /root/.ssh/authorized_keys >/dev/null 2>&1
|
|
fi
|
|
done <<< "$ALL_KEYS"
|
|
|
|
# Fix permissions
|
|
pct exec "$vmid" -- chmod 600 /root/.ssh/authorized_keys 2>/dev/null || true
|
|
pct exec "$vmid" -- chmod 700 /root/.ssh 2>/dev/null || true
|
|
|
|
echo " <- $name done"
|
|
done
|
|
|
|
echo ""
|
|
echo "=== Deploy complete ==="
|
|
echo "Keys deployed. Test from any workstation with:"
|
|
echo " ssh root@<lxc-ip>" |