Первая загрузка: рамка паролей без «ромбов» (повтор символа — без tr, он резал UTF-8 по байтам), короче строка о пароле; вопросы о постоянном адресе и ключе продукта ждут ответа без таймера (экран не уходит дальше сам, пока оператор фотографирует)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
#!/bin/bash
|
||||
# Первая загрузка сервера, установленного с образа Bridge&Join. Спрашивает ключ продукта на консоли;
|
||||
# без ключа ставит ядро bj с образа (/var/lib/bj/bundle), а ключ вводится в браузере на первой
|
||||
# странице настройки. Пока bj не установлен, вопрос повторяется при каждой загрузке (с таймаутом),
|
||||
# странице настройки. Пока bj не установлен, вопрос повторяется при каждой загрузке (вопросы ждут ответа без таймера),
|
||||
# адрес и подсказки всегда есть на экране входа (bj-welcome).
|
||||
set -u
|
||||
MARK=/var/lib/bj/.bj/installed-from-iso
|
||||
@@ -25,6 +25,7 @@ quiet_console
|
||||
FONT=/usr/local/share/bj/console.psf
|
||||
if [ -f "$FONT" ] && setfont "$FONT" 2>/dev/null; then export BJ_SCREEN_FONT=1; fi
|
||||
if [ "${BJ_SCREEN_FONT:-}" = 1 ]; then BOX_T='╔══'; BOX_B='╚══'; BOX_H='═'; else BOX_T='+=='; BOX_B='+=='; BOX_H='='; fi
|
||||
rep() { local i s=""; for ((i = 0; i < $2; i++)); do s="$s$1"; done; printf '%s' "$s"; } # не tr: tr режет UTF-8 по байтам
|
||||
LOG=/var/log/bj/firstboot-install.log
|
||||
SCREEN=/usr/local/sbin/bj-firstboot-screen
|
||||
ACC_DONE=/var/lib/bj/.bj/os-accounts-set
|
||||
@@ -50,7 +51,7 @@ setup_accounts() {
|
||||
printf ' root_bj — администратор сервера (команды через sudo)\n user_bj — обычный вход (журналы, без прав администратора)\n'
|
||||
printf ' Работа с bj — в браузере; эти учётные записи нужны для обслуживания ОС.\n\n'
|
||||
printf ' Шаг 1 из 2 — пароли. Для каждой учётной записи предложен пароль:\n'
|
||||
printf ' • Enter — оставить предложенный (на следующем экране его нужно будет записать или сфотографировать);\n'
|
||||
printf ' • Enter — оставить предложенный (запишите его на следующем экране);\n'
|
||||
printf ' • или наберите свой (не короче 10 символов, при вводе не отображается) и Enter.\n\n'
|
||||
PA=$(askpw root_bj "$(genpw)"); PU=$(askpw user_bj "$(genpw)")
|
||||
printf 'root_bj:%s\nuser_bj:%s\n' "$PA" "$PU" | chpasswd
|
||||
@@ -65,8 +66,8 @@ setup_accounts() {
|
||||
# пароли учётных записей — крупно, с просьбой сфотографировать или записать: нигде не сохраняются
|
||||
show_accounts() {
|
||||
[ -n "$ACCOUNTS" ] || return 0
|
||||
printf '\n %s СФОТОГРАФИРУЙТЕ ИЛИ ЗАПИШИТЕ ЭТИ ПАРОЛИ %s\n\n%s\n\n' "$BOX_T" "$(printf '%*s' 24 '' | tr ' ' "$BOX_H")" "$ACCOUNTS"
|
||||
printf ' %s они показаны только здесь и нигде не сохраняются %s\n' "$BOX_B" "$(printf '%*s' 14 '' | tr ' ' "$BOX_H")"
|
||||
printf '\n %s СФОТОГРАФИРУЙТЕ ИЛИ ЗАПИШИТЕ ЭТИ ПАРОЛИ %s\n\n%s\n\n' "$BOX_T" "$(rep "$BOX_H" 24)" "$ACCOUNTS"
|
||||
printf ' %s они показаны только здесь и нигде не сохраняются %s\n' "$BOX_B" "$(rep "$BOX_H" 14)"
|
||||
printf ' Вход в консоль — для обслуживания сервера; работа с bj — в браузере. Сменить пароль: passwd\n\n'
|
||||
}
|
||||
# пока не нажат Enter — экран не меняется (без таймера: пароли не должны пропасть, пока их не записали)
|
||||
@@ -99,7 +100,7 @@ if [ ! -f /var/lib/bj/.bj/network-asked ] && [ -x /usr/local/sbin/bj-network ] &
|
||||
mkdir -p /var/lib/bj/.bj && date -Iseconds > /var/lib/bj/.bj/network-asked
|
||||
printf '\n Сейчас адрес сервера: %s\n' "$(ip -4 -o addr show scope global 2>/dev/null | awk '{print $4}' | tr '\n' ' ')"
|
||||
# ответ цифрой: консоль начинает в английской раскладке, «д» без переключения не набрать
|
||||
read -t 60 -r -p " Задать постоянный адрес (рекомендуется)? 1 — да, Enter — нет: " ANS < /dev/tty || ANS=""
|
||||
read -r -p " Задать постоянный адрес (рекомендуется)? 1 — да, Enter — нет: " ANS < /dev/tty || ANS=""
|
||||
case "$ANS" in 1*|[дДyYlL]*) /usr/local/sbin/bj-network < /dev/tty ;; esac
|
||||
fi
|
||||
clear
|
||||
@@ -119,9 +120,9 @@ done
|
||||
while true; do
|
||||
CODE=""
|
||||
if [ -f "$BUNDLE/manifest.json" ]; then
|
||||
read -t 120 -r -p " Ключ продукта (Enter — установить с образа, ключ ввести в браузере): " CODE || true
|
||||
read -r -p " Ключ продукта (Enter — установить с образа, ключ ввести в браузере): " CODE < /dev/tty || true
|
||||
else
|
||||
read -t 120 -r -p " Ключ продукта (Enter — установить позже): " CODE || true
|
||||
read -r -p " Ключ продукта (Enter — установить позже): " CODE < /dev/tty || true
|
||||
fi
|
||||
CODE=$(printf '%s' "${CODE:-}" | tr -d ' ' | tr '[:lower:]' '[:upper:]')
|
||||
if [ -z "$CODE" ]; then
|
||||
|
||||
Reference in New Issue
Block a user