Образ: учётные записи ОС root_bj (sudo) и user_bj задаются автоматически, пароли генерируются при первой загрузке (можно ввести свои) и показываются один раз на итоговом экране; firstboot на bash (read -t/-p)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+43
-4
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
# Первая загрузка сервера, установленного с образа Bridge&Join. Спрашивает ключ продукта на консоли;
|
||||
# без ключа ставит ядро bj с образа (/var/lib/bj/bundle), а ключ вводится в браузере на первой
|
||||
# странице настройки. Пока bj не установлен, вопрос повторяется при каждой загрузке (с таймаутом),
|
||||
@@ -15,6 +15,41 @@ finish() {
|
||||
[ -x /usr/local/sbin/bj-welcome ] && /usr/local/sbin/bj-welcome
|
||||
}
|
||||
urls() { ip -4 -o addr show scope global 2>/dev/null | awk '{split($4,a,"/"); printf " http://%s:8080%s\n", a[1], "'"$1"'"}'; }
|
||||
ACC_DONE=/var/lib/bj/.bj/os-accounts-set
|
||||
ACCOUNTS=""
|
||||
genpw() { tr -dc 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789' < /dev/urandom | head -c 12 | sed 's/\(....\)\(....\)/\1-\2-/'; }
|
||||
askpw() { # $1 — логин, $2 — предложенный пароль; печатает итоговый пароль
|
||||
while true; do
|
||||
printf ' Пароль для %s: %s\n Enter — принять, или введите свой (не короче 10 символов): ' "$1" "$2" > /dev/tty
|
||||
stty -echo < /dev/tty; read -r P1 < /dev/tty; stty echo < /dev/tty; printf '\n' > /dev/tty
|
||||
[ -z "$P1" ] && { printf '%s' "$2"; return; }
|
||||
[ ${#P1} -lt 10 ] && { printf ' Короче 10 символов, ещё раз.\n' > /dev/tty; continue; }
|
||||
printf ' Повторите: ' > /dev/tty; stty -echo < /dev/tty; read -r P2 < /dev/tty; stty echo < /dev/tty; printf '\n' > /dev/tty
|
||||
[ "$P1" = "$P2" ] && { printf '%s' "$P1"; return; }
|
||||
printf ' Не совпало, ещё раз.\n' > /dev/tty
|
||||
done
|
||||
}
|
||||
setup_accounts() {
|
||||
[ -f "$ACC_DONE" ] && return
|
||||
id user_bj >/dev/null 2>&1 || useradd -m -s /bin/bash -c "Пользователь сервера bj" -G adm,systemd-journal user_bj
|
||||
id root_bj >/dev/null 2>&1 && usermod -aG sudo root_bj
|
||||
clear
|
||||
printf '\n Bridge&Join: учётные записи сервера\n ────────────────────────────────────────────────────────────\n'
|
||||
printf ' root_bj — администратор сервера (команды через sudo)\n user_bj — обычный вход (журналы, без прав администратора)\n'
|
||||
printf ' Работа с bj — в браузере; эти учётные записи нужны для обслуживания ОС.\n\n'
|
||||
PA=$(askpw root_bj "$(genpw)"); PU=$(askpw user_bj "$(genpw)")
|
||||
printf 'root_bj:%s\nuser_bj:%s\n' "$PA" "$PU" | chpasswd
|
||||
mkdir -p "$(dirname "$ACC_DONE")" && date -Iseconds > "$ACC_DONE"
|
||||
ACCOUNTS=$(printf ' root_bj (администратор, sudo) пароль: %s\n user_bj (обычный вход) пароль: %s\n' "$PA" "$PU")
|
||||
unset PA PU
|
||||
}
|
||||
show_accounts() {
|
||||
[ -n "$ACCOUNTS" ] || return
|
||||
printf '\n ┌── ЗАПИШИТЕ: учётные записи сервера ──────────────────────────┐\n%s\n' "$ACCOUNTS"
|
||||
printf ' └── пароли нигде не сохранены и больше не будут показаны ──────┘\n'
|
||||
printf ' Сменить пароль: passwd (под своей учётной записью)\n\n'
|
||||
}
|
||||
setup_accounts
|
||||
clear
|
||||
printf '\n Bridge&Join: установка на сервер\n ────────────────────────────────────────────────────────────\n'
|
||||
printf ' Debian установлен. Осталось установить bj.\n\n'
|
||||
@@ -42,19 +77,23 @@ while true; do
|
||||
if /usr/local/sbin/bj-installer install --bundle "$BUNDLE" --server "$SERVER" --channel "$CHANNEL"; then
|
||||
finish
|
||||
printf '\n Ключ продукта спросит первая страница настройки в браузере:\n'; urls /first-run; printf '\n'
|
||||
read -t 60 -r -p " Нажмите Enter, чтобы перейти к экрану входа. " _ || true
|
||||
show_accounts
|
||||
read -r -p " Нажмите Enter, чтобы перейти к экрану входа. " _ || true
|
||||
exit 0
|
||||
fi
|
||||
show_accounts
|
||||
printf '\n Установка с образа не завершилась. Подробности выше; повторить:\n sudo bj-installer install --bundle %s\n\n' "$BUNDLE"
|
||||
sleep 5; exit 0
|
||||
fi
|
||||
show_accounts
|
||||
printf '\n Установка bj отложена. Вопрос повторится при следующей загрузке; вручную:\n sudo bj-installer install --code КЛЮЧ-ПРОДУКТА\n\n'
|
||||
sleep 3
|
||||
read -r -p " Нажмите Enter, чтобы перейти к экрану входа. " _ || true
|
||||
exit 0
|
||||
fi
|
||||
if /usr/local/sbin/bj-installer install --code "$CODE" --server "$SERVER" --channel "$CHANNEL"; then
|
||||
finish
|
||||
read -t 60 -r -p " Нажмите Enter, чтобы перейти к экрану входа. " _ || true
|
||||
show_accounts
|
||||
read -r -p " Нажмите Enter, чтобы перейти к экрану входа. " _ || true
|
||||
exit 0
|
||||
fi
|
||||
printf '\n Установка не завершилась. Проверьте ключ продукта и сеть и попробуйте ещё раз.\n\n'
|
||||
|
||||
@@ -35,10 +35,16 @@ d-i apt-setup/cdrom/set-first boolean false
|
||||
d-i apt-setup/non-free-firmware boolean true
|
||||
d-i apt-setup/services-select multiselect security, updates
|
||||
|
||||
# Учётная запись: одна — администратор ОС с sudo (вход root отключён). Установщик спросит
|
||||
# полное имя, ЛОГИН и пароль — логин человек видит и задаёт сам; им же входят в консоль сервера.
|
||||
# Учётные записи ОС задаются автоматически, установщик Debian их не спрашивает:
|
||||
# root_bj — администратор сервера (sudo), user_bj — вход без прав администратора (журналы).
|
||||
# Вход root отключён. Пароли генерирует bj-firstboot при первой загрузке и показывает на экране
|
||||
# (можно ввести свои); на диске они не хранятся. До этого момента пароль root_bj заблокирован.
|
||||
d-i passwd/root-login boolean false
|
||||
d-i passwd/make-user boolean true
|
||||
d-i passwd/user-fullname string Администратор сервера bj
|
||||
d-i passwd/username string root_bj
|
||||
d-i passwd/user-password-crypted password !
|
||||
d-i passwd/user-default-groups string sudo adm systemd-journal
|
||||
|
||||
# Разметка: весь выбранный диск, одна файловая система; диск и стирание подтверждаются при установке
|
||||
d-i partman-auto/method string regular
|
||||
|
||||
@@ -54,8 +54,12 @@ fi
|
||||
*) printf ' Лицензия НЕ АКТИВИРОВАНА: введите ключ продукта в «Настройка → Лицензия».\n';;
|
||||
esac
|
||||
fi
|
||||
ADM=$(getent group sudo | cut -d: -f4 | tr ',' ' ')
|
||||
printf '\n Вход в консоль сервера (обслуживание): логин администратора ОС%s и его пароль,\n заданные при установке Debian; команды — через sudo. Веб-вход — по адресу выше.\n\n' "${ADM:+ ($ADM)}"
|
||||
if id root_bj >/dev/null 2>&1; then
|
||||
printf '\n Вход в консоль сервера (обслуживание): root_bj — администратор (sudo), user_bj — обычный.\n Пароли показаны один раз при первой загрузке. Веб-вход в bj — по адресу выше.\n\n'
|
||||
else
|
||||
ADM=$(getent group sudo | cut -d: -f4 | tr ',' ' ')
|
||||
printf '\n Вход в консоль сервера (обслуживание): логин администратора ОС%s и его пароль,\n заданные при установке; команды — через sudo. Веб-вход — по адресу выше.\n\n' "${ADM:+ ($ADM)}"
|
||||
fi
|
||||
} > "$ISSUE.tmp"
|
||||
if ! cmp -s "$ISSUE.tmp" "$ISSUE" 2>/dev/null; then
|
||||
mv -f "$ISSUE.tmp" "$ISSUE"
|
||||
|
||||
Reference in New Issue
Block a user