The key that the website logs in with was written into the authorized_keys of the Administrator, which would have given everyone who has the website administrator rights on the box. It only gets access as the root user. The deploy script logs in as Administrator with the personal key of the deployer instead, from the agent or from -i. Co-Authored-By: Claude Code <noreply@anthropic.com>
71 lines
3 KiB
Shell
Executable file
71 lines
3 KiB
Shell
Executable file
#!/usr/bin/env bash
|
|
# Deploys the cleanup job to the shell server and installs it there.
|
|
#
|
|
# server/scripts/deploy.sh [-i KEYFILE] [-h HOST] [--uninstall]
|
|
#
|
|
# The job runs on the box as SYSTEM, never as the root user. The Administrator account sets it up; its shell is a
|
|
# Windows one, so the commands we run there are Windows commands.
|
|
#
|
|
# The Administrator logs in with the personal key of the deployer, from the agent or from -i. The key of the website
|
|
# never gets administrator rights: it only logs in as the root user.
|
|
set -euo pipefail
|
|
|
|
HOST=nowhere.wirs.ing
|
|
USER=Administrator
|
|
KEYFILE=''
|
|
UNINSTALL=0
|
|
|
|
while [ $# -gt 0 ]; do
|
|
case $1 in
|
|
-i) KEYFILE=$2; shift 2 ;;
|
|
-h) HOST=$2; shift 2 ;;
|
|
--uninstall) UNINSTALL=1; shift ;;
|
|
*) echo "usage: $(basename "$0") [-i KEYFILE] [-h HOST] [--uninstall]" >&2; exit 2 ;;
|
|
esac
|
|
done
|
|
|
|
repo=$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)
|
|
server="$repo/server"
|
|
remote='C:\Users\Administrator\kik' # where the installer is put, in the home of the Administrator
|
|
remotePath='/c/Users/Administrator/kik' # the same place, as the file transfer sees it
|
|
temporary=()
|
|
|
|
# The host key is the one the website pins, so that the deployment cannot be intercepted.
|
|
expected=$(sed -n "s/.*const HOST_KEY = '\([^']*\)'.*/\1/p" "$repo/src/scripts/terminal.ts")
|
|
known=$(mktemp)
|
|
temporary+=("$known")
|
|
trap 'rm -f "${temporary[@]}"' EXIT
|
|
ssh-keyscan -t ed25519 "$HOST" > "$known" 2>/dev/null
|
|
actual=$(ssh-keygen -lf "$known" | awk '{print $2}')
|
|
if [ "$actual" != "$expected" ]; then
|
|
echo "the host key of $HOST is $actual, but $expected is expected" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# The site logs in with the key in the authorized_keys of the user on the box, so the two have to be the same.
|
|
site=$(mktemp)
|
|
chmod 600 "$site"
|
|
temporary+=("$site")
|
|
boring=$(sed -n "s/.*const boringData = '\([^']*\)'.*/\1/p" "$repo/src/scripts/terminal.ts")
|
|
printf '%s' "$boring" | base64 -d | tr 'A-Za-z' 'N-ZA-Mn-za-m' > "$site"
|
|
public=$(ssh-keygen -y -f "$site" | awk 'NF {print $1" "$2}')
|
|
authorized=$(awk 'NF {print $1" "$2; exit}' "$server/resources/.ssh/authorized_keys")
|
|
if [ "$public" != "$authorized" ]; then
|
|
echo "the key in server/resources/.ssh/authorized_keys is not the one the website uses" >&2
|
|
exit 1
|
|
fi
|
|
|
|
options=(-o "UserKnownHostsFile=$known" -o StrictHostKeyChecking=yes)
|
|
if [ -n "$KEYFILE" ]; then options+=(-i "$KEYFILE"); fi
|
|
ssh=(ssh "${options[@]}" "$USER@$HOST")
|
|
scp=(scp "${options[@]}")
|
|
|
|
if [ "$UNINSTALL" = 1 ]; then
|
|
"${ssh[@]}" "if exist $remote\\scripts\\install_restore_task.ps1 (powershell -NoProfile -ExecutionPolicy Bypass -File $remote\\scripts\\install_restore_task.ps1 -Uninstall) else (echo Nothing is installed.)"
|
|
exit
|
|
fi
|
|
|
|
# The installer looks for the resources next to itself, so both directories go to the server.
|
|
"${ssh[@]}" "if not exist $remote mkdir $remote"
|
|
"${scp[@]}" -r "$server/scripts" "$server/resources" "$USER@$HOST:$remotePath/"
|
|
"${ssh[@]}" "powershell -NoProfile -ExecutionPolicy Bypass -File $remote\\scripts\\install_restore_task.ps1"
|