Fix ssh-keygen overwrite prompt and key landing in root home

mktemp creates the file before ssh-keygen runs — keygen sees it exists
and prompts. Switch to mktemp -d so keygen writes a fresh file.

When run via sudo SUDO_USER is set but HOME=/root. Resolve the real
home via getent so the key lands in the operator's ~/.ssh, not root's.
This commit is contained in:
Cobra
2026-04-07 15:47:31 -04:00
parent 6cb48909b2
commit 56ad5662ac
+7 -4
View File
@@ -515,11 +515,12 @@ SSH_DIR="${MOUNT_POINT}/root/.ssh"
mkdir -p "$SSH_DIR" mkdir -p "$SSH_DIR"
if [[ "$SSH_MODE" == "generate" ]]; then if [[ "$SSH_MODE" == "generate" ]]; then
TMP_KEY=$(mktemp) TMP_DIR=$(mktemp -d)
TMP_KEY="${TMP_DIR}/id_ed25519"
ssh-keygen -t ed25519 -N "" -C "" -f "$TMP_KEY" -q ssh-keygen -t ed25519 -N "" -C "" -f "$TMP_KEY" -q
PRIVKEY=$(cat "$TMP_KEY") PRIVKEY=$(cat "$TMP_KEY")
PUBKEY=$(cat "${TMP_KEY}.pub") PUBKEY=$(cat "${TMP_KEY}.pub")
rm -f "$TMP_KEY" "${TMP_KEY}.pub" rm -rf "$TMP_DIR"
echo "$PUBKEY" > "${SSH_DIR}/authorized_keys" echo "$PUBKEY" > "${SSH_DIR}/authorized_keys"
@@ -533,12 +534,14 @@ if [[ "$SSH_MODE" == "generate" ]]; then
echo "---" echo "---"
fi fi
# Save locally to ~/.ssh/bb-<device_id> # Save to the invoking user's ~/.ssh (SUDO_USER if running via sudo, else HOME)
LOCAL_KEY_DIR="$HOME/.ssh" REAL_HOME=$(getent passwd "${SUDO_USER:-$USER}" 2>/dev/null | cut -d: -f6)
LOCAL_KEY_DIR="${REAL_HOME:-$HOME}/.ssh"
LOCAL_KEY_PATH="${LOCAL_KEY_DIR}/bb-${DEVICE_ID}" LOCAL_KEY_PATH="${LOCAL_KEY_DIR}/bb-${DEVICE_ID}"
mkdir -p "$LOCAL_KEY_DIR" mkdir -p "$LOCAL_KEY_DIR"
echo "$PRIVKEY" > "$LOCAL_KEY_PATH" echo "$PRIVKEY" > "$LOCAL_KEY_PATH"
chmod 600 "$LOCAL_KEY_PATH" chmod 600 "$LOCAL_KEY_PATH"
[[ -n "$SUDO_USER" ]] && chown "$SUDO_USER" "$LOCAL_KEY_PATH" || true
info "Private key saved locally: ${LOCAL_KEY_PATH}" info "Private key saved locally: ${LOCAL_KEY_PATH}"
unset PRIVKEY unset PRIVKEY