v1.2.13: вопросы до установки (доступы в самом конце) + гейты по выбранным протоколам
This commit is contained in:
@@ -1,3 +1,15 @@
|
|||||||
|
## v1.2.13: вопросов после показа доступов нет, и никакой работы для невыбранных протоколов
|
||||||
|
|
||||||
|
* **Все вопросы — до установщика.** Раньше после установки (когда на экране уже были данные входа
|
||||||
|
в панель) скрипт спрашивал про ping, автообновления, порт SSH и пароль root — доступы терялись
|
||||||
|
в потоке вопросов. Теперь спрашиваем всё заранее, а действия выполняем после установки; последнее,
|
||||||
|
что видит человек, — доступ к панели, подписка и QR-код.
|
||||||
|
* Автор тянет подписки «-awg» и «-tg» (наследие установок kit < 1.1) всегда — теперь только если
|
||||||
|
AmneziaWG или MTProto выбраны.
|
||||||
|
* Наши команды помнят выбор: установщик пишет список протоколов в `/etc/kit/kl-protos`, и
|
||||||
|
`kit local site` не синхронизирует ответ Hysteria2, если Hysteria2 не ставился (раньше он это делал
|
||||||
|
и выдавал предупреждение про отсутствующий Hysteria2).
|
||||||
|
|
||||||
## v1.2.12: не сканируем соседей, когда они не нужны
|
## v1.2.12: не сканируем соседей, когда они не нужны
|
||||||
|
|
||||||
* Автор подбирал сайты-соседи для XHTTP и MTProto **всегда**, когда маскировка доверенная («панель по IP»)
|
* Автор подбирал сайты-соседи для XHTTP и MTProto **всегда**, когда маскировка доверенная («панель по IP»)
|
||||||
|
|||||||
+70
-69
@@ -43,7 +43,7 @@
|
|||||||
|
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
|
|
||||||
KIT_VERSION="1.2.12" # версия сборки форка; должна совпадать с VERSION релиза
|
KIT_VERSION="1.2.13" # версия сборки форка; должна совпадать с VERSION релиза
|
||||||
GITEA="${KIT_FORK_BASE:-https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS}"
|
GITEA="${KIT_FORK_BASE:-https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS}"
|
||||||
NS="3x-ui-kit-release"
|
NS="3x-ui-kit-release"
|
||||||
SIG_ID="releases@3x-ui-kit"
|
SIG_ID="releases@3x-ui-kit"
|
||||||
@@ -341,67 +341,9 @@ else
|
|||||||
fi
|
fi
|
||||||
say "протоколы: $protos — под остальные не создаётся ничего"
|
say "протоколы: $protos — под остальные не создаётся ничего"
|
||||||
|
|
||||||
[[ $clean == yes ]] && clean_previous
|
# ------------------------------------------------------------------ вопросы (всё спросим ДО установки)
|
||||||
|
# После установщика на экране появляются доступы к панели: там вопросы уже неуместны. Поэтому
|
||||||
say "запускаю установщик автора (панель 3X-UI, протоколы, сайт-заглушка, подписка)"
|
# спрашиваем всё заранее, а действия выполняем после установки (см. «наши дополнения» ниже).
|
||||||
if ((${#INSTALLER_ARGS[@]})); then printf ' флаги: %s\n' "${INSTALLER_ARGS[*]}"; else printf ' флагов нет: установщик задаст вопросы (маскировка, домен)\n'; fi
|
|
||||||
# stdin: если есть терминал — отдаём его установщику (там есть вопросы), иначе /dev/null,
|
|
||||||
# иначе установщик начнёт читать наш собственный скрипт вместо ответов.
|
|
||||||
if [[ -r /dev/tty ]]; then
|
|
||||||
bash "$tmp/scripts/3x-ui.sh" ${INSTALLER_ARGS[@]+"${INSTALLER_ARGS[@]}"} </dev/tty || installer_failed
|
|
||||||
else
|
|
||||||
bash "$tmp/scripts/3x-ui.sh" ${INSTALLER_ARGS[@]+"${INSTALLER_ARGS[@]}"} </dev/null || installer_failed
|
|
||||||
fi
|
|
||||||
command -v kit >/dev/null || die "после установки нет команды kit — что-то пошло не так, смотрите вывод выше"
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------ наши дополнения
|
|
||||||
|
|
||||||
ask_yes() { # "вопрос" y|n — по умолчанию
|
|
||||||
local q=$1 def=$2 ans=""
|
|
||||||
interactive || { [[ $def == y ]]; return; }
|
|
||||||
printf '\n%s [%s]: ' "$q" "$([[ $def == y ]] && echo 'Y/n' || echo 'y/N'])"
|
|
||||||
read -r -t 300 ans <"$ASK_SRC" 2>/dev/null || true
|
|
||||||
ans=${ans,,}; ans=${ans//[[:space:]]/}
|
|
||||||
[[ -z $ans && $def == y ]] && return 0
|
|
||||||
[[ $ans =~ ^(y|yes|д|да)$ ]]
|
|
||||||
}
|
|
||||||
|
|
||||||
# Сайт-заглушка: у автора это случайные «кофейни и пекарни», у нас — правдоподобный ИТ-сайт.
|
|
||||||
# Меняем не файл вручную, а командой форка: она же обновляет копию страницы в ответе Hysteria2,
|
|
||||||
# иначе 443/tcp и UDP-порт начнут отвечать разными страницами (это видно снаружи).
|
|
||||||
case $site in
|
|
||||||
off) say "заглушку не трогаю (--no-site): остаётся страница автора" ;;
|
|
||||||
random)
|
|
||||||
say "ставлю сайт-заглушку: случайный ИТ-сайт из нашего набора"
|
|
||||||
kit local site || warn "не удалось поставить заглушку — позже: kit local site"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
say "ставлю сайт-заглушку №$site"
|
|
||||||
kit local site "$site" || warn "не удалось поставить заглушку — позже: kit local site $site"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [[ $fix_time == yes ]]; then
|
|
||||||
say "kit fix: синхронизация времени и безопасные починки (авторская команда, ничего необратимого)"
|
|
||||||
kit fix || warn "kit fix завершился с замечаниями — посмотрите вывод"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ping и автообновления: --harden/--no-harden решают без вопросов, иначе спрашиваем
|
|
||||||
want_ping=$harden; want_update=$harden
|
|
||||||
[[ $want_ping == auto ]] && want_ping=yes
|
|
||||||
[[ $want_update == auto ]] && want_update=yes
|
|
||||||
if [[ $harden == auto ]] && interactive; then
|
|
||||||
if ask_yes "Закрыть ответ сервера на ping? Снаружи пинг перестанет отвечать (подписка и VPN не затрагиваются)." y; then want_ping=yes; else want_ping=no; fi
|
|
||||||
if ask_yes "Включить автообновления безопасности? Только security-обновления, без перезагрузки." y; then want_update=yes; else want_update=no; fi
|
|
||||||
fi
|
|
||||||
if [[ $want_ping == yes ]]; then
|
|
||||||
say "закрываю ответ на ping (правилом ufw)"
|
|
||||||
kit local ping off || warn "не удалось — повторите: kit local ping off"
|
|
||||||
fi
|
|
||||||
if [[ $want_update == yes ]]; then
|
|
||||||
say "включаю автообновления безопасности"
|
|
||||||
kit local upgrades on || warn "не удалось — повторите: kit local upgrades on"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# порт SSH: по флагу или по вопросу. Смена делается в два шага: сначала ДОБАВИТЬ новый порт
|
# порт SSH: по флагу или по вопросу. Смена делается в два шага: сначала ДОБАВИТЬ новый порт
|
||||||
# (прежний продолжает работать), потом закрыть прежние — иначе одна опечатка оставляет сервер без доступа.
|
# (прежний продолжает работать), потом закрыть прежние — иначе одна опечатка оставляет сервер без доступа.
|
||||||
@@ -439,19 +381,78 @@ ask_ssh_port() { # пусто — оставить как есть; иначе
|
|||||||
warn "оставляю прежний порт ($cur)"
|
warn "оставляю прежний порт ($cur)"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
want_ping=$harden; want_update=$harden
|
||||||
|
[[ $want_ping == auto ]] && want_ping=yes
|
||||||
|
[[ $want_update == auto ]] && want_update=yes
|
||||||
|
if [[ $harden == auto ]] && interactive; then
|
||||||
|
if ask_yes "Закрыть ответ сервера на ping? Снаружи пинг перестанет отвечать (подписка и VPN не затрагиваются)." y; then want_ping=yes; else want_ping=no; fi
|
||||||
|
if ask_yes "Включить автообновления безопасности? Только security-обновления, без перезагрузки." y; then want_update=yes; else want_update=no; fi
|
||||||
|
fi
|
||||||
|
|
||||||
[[ -n $ssh_port ]] || ssh_port=$(ask_ssh_port)
|
[[ -n $ssh_port ]] || ssh_port=$(ask_ssh_port)
|
||||||
|
want_passwd=no
|
||||||
|
if interactive; then
|
||||||
|
if ask_yes "Сменить пароль root прямо сейчас? Новый пароль введёте в следующем окне." n; then want_passwd=yes; fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
[[ $clean == yes ]] && clean_previous
|
||||||
|
|
||||||
|
say "запускаю установщик автора (панель 3X-UI, протоколы, сайт-заглушка, подписка)"
|
||||||
|
if ((${#INSTALLER_ARGS[@]})); then printf ' флаги: %s\n' "${INSTALLER_ARGS[*]}"; else printf ' флагов нет: установщик задаст вопросы (маскировка, домен)\n'; fi
|
||||||
|
# stdin: если есть терминал — отдаём его установщику (там есть вопросы), иначе /dev/null,
|
||||||
|
# иначе установщик начнёт читать наш собственный скрипт вместо ответов.
|
||||||
|
if [[ -r /dev/tty ]]; then
|
||||||
|
bash "$tmp/scripts/3x-ui.sh" ${INSTALLER_ARGS[@]+"${INSTALLER_ARGS[@]}"} </dev/tty || installer_failed
|
||||||
|
else
|
||||||
|
bash "$tmp/scripts/3x-ui.sh" ${INSTALLER_ARGS[@]+"${INSTALLER_ARGS[@]}"} </dev/null || installer_failed
|
||||||
|
fi
|
||||||
|
command -v kit >/dev/null || die "после установки нет команды kit — что-то пошло не так, смотрите вывод выше"
|
||||||
|
|
||||||
|
# Запоминаем, какие протоколы выбраны: наши команды (kit local site и др.) смотрят сюда и не
|
||||||
|
# делают ничего для протоколов, которых в этой установке нет.
|
||||||
|
printf '%s\n' "${protos//,/ }" | tr ' ' '\n' | sed '/^$/d' > /etc/kit/kl-protos 2>/dev/null || true
|
||||||
|
|
||||||
|
# Сайт-заглушка: у автора это случайные «кофейни и пекарни», у нас — правдоподобный ИТ-сайт.
|
||||||
|
# Меняем не файл вручную, а командой форка: она же обновляет копию страницы в ответе Hysteria2,
|
||||||
|
# иначе 443/tcp и UDP-порт начнут отвечать разными страницами (это видно снаружи).
|
||||||
|
case $site in
|
||||||
|
off) say "заглушку не трогаю (--no-site): остаётся страница автора" ;;
|
||||||
|
random)
|
||||||
|
say "ставлю сайт-заглушку: случайный ИТ-сайт из нашего набора"
|
||||||
|
kit local site || warn "не удалось поставить заглушку — позже: kit local site"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
say "ставлю сайт-заглушку №$site"
|
||||||
|
kit local site "$site" || warn "не удалось поставить заглушку — позже: kit local site $site"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [[ $fix_time == yes ]]; then
|
||||||
|
say "kit fix: синхронизация времени и безопасные починки (авторская команда, ничего необратимого)"
|
||||||
|
kit fix || warn "kit fix завершился с замечаниями — посмотрите вывод"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Действия по ответам, которые были заданы ДО установщика (см. блок вопросов выше).
|
||||||
|
if [[ $want_ping == yes ]]; then
|
||||||
|
say "закрываю ответ на ping (правилом ufw)"
|
||||||
|
kit local ping off || warn "не удалось — повторите: kit local ping off"
|
||||||
|
fi
|
||||||
|
if [[ $want_update == yes ]]; then
|
||||||
|
say "включаю автообновления безопасности"
|
||||||
|
kit local upgrades on || warn "не удалось — повторите: kit local upgrades on"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $want_passwd == yes ]]; then
|
||||||
|
say "меняю пароль root"
|
||||||
|
kit local passwd || warn "не получилось — повторите: kit local passwd"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# порт SSH: новый порт добавляем, прежний остаётся рабочим до вашей проверки входа.
|
||||||
if [[ -n $ssh_port ]]; then
|
if [[ -n $ssh_port ]]; then
|
||||||
say "перевожу SSH на порт $ssh_port: новый добавляю, прежний пока остаётся рабочим"
|
say "перевожу SSH на порт $ssh_port: новый добавляю, прежний пока остаётся рабочим"
|
||||||
kit local ssh "$ssh_port" || warn "порт не добавился — сделайте отдельно: kit local ssh $ssh_port"
|
kit local ssh "$ssh_port" || warn "порт не добавился — сделайте отдельно: kit local ssh $ssh_port"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# пароль root: в флагах его нет намеренно — значение в командной строке видно в списке процессов
|
|
||||||
if interactive; then
|
|
||||||
if ask_yes "Сменить пароль root прямо сейчас?" n; then
|
|
||||||
kit local passwd || warn "не получилось — повторите: kit local passwd"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------ проверка
|
# ------------------------------------------------------------------ проверка
|
||||||
|
|
||||||
if [[ $do_check == yes ]]; then
|
if [[ $do_check == yes ]]; then
|
||||||
|
|||||||
+6
-2
@@ -30,7 +30,7 @@ wait_apt_idle() {
|
|||||||
XUI_VERSION="v3.9.0"
|
XUI_VERSION="v3.9.0"
|
||||||
# SHA256 установщика 3X-UI этой версии: тег могут передвинуть, а хеш – нет (проверено 2026-09-30).
|
# SHA256 установщика 3X-UI этой версии: тег могут передвинуть, а хеш – нет (проверено 2026-09-30).
|
||||||
XUI_INSTALL_SHA256="18616fe26c8f6c92db6daa2dcd7cd53c5143ee69ecfd26d8ea6dc9b2c78607a6"
|
XUI_INSTALL_SHA256="18616fe26c8f6c92db6daa2dcd7cd53c5143ee69ecfd26d8ea6dc9b2c78607a6"
|
||||||
KIT_VERSION="1.2.12"
|
KIT_VERSION="1.2.13"
|
||||||
# kit и kit-sub берём из того же релиза, что и этот скрипт, а не из меняющейся ветки main.
|
# kit и kit-sub берём из того же релиза, что и этот скрипт, а не из меняющейся ветки main.
|
||||||
KIT_RAW="https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS/raw/tag/v$KIT_VERSION"
|
KIT_RAW="https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS/raw/tag/v$KIT_VERSION"
|
||||||
# Ядро Xray для панели. С 26.7.x клиенты на Mihomo и sing-box (Hiddify, FlClash,
|
# Ядро Xray для панели. С 26.7.x клиенты на Mihomo и sing-box (Hiddify, FlClash,
|
||||||
@@ -757,7 +757,11 @@ main() {
|
|||||||
links=$(sub_links "$SUBID")
|
links=$(sub_links "$SUBID")
|
||||||
# У установок до kit 1.1 AmneziaWG и MTProto лежат в подписках «-awg» и «-tg».
|
# У установок до kit 1.1 AmneziaWG и MTProto лежат в подписках «-awg» и «-tg».
|
||||||
local extra
|
local extra
|
||||||
extra=$(sub_links "$SUBID-awg" 1; sub_links "$SUBID-tg" 1)
|
# Наш шов: подписки «-awg»/«-tg» есть только у установок с AmneziaWG и MTProto — не тянем их,
|
||||||
|
# если эти протоколы не выбраны (никаких лишних обращений к панели).
|
||||||
|
if [[ " ${PROTOS[*]} " == *" awg "* || " ${PROTOS[*]} " == *" awg3 "* || " ${PROTOS[*]} " == *" mtproto "* ]]; then
|
||||||
|
extra=$(sub_links "$SUBID-awg" 1; sub_links "$SUBID-tg" 1)
|
||||||
|
fi
|
||||||
[[ -n $extra ]] && links+=$'\n'"$extra"
|
[[ -n $extra ]] && links+=$'\n'"$extra"
|
||||||
AWG_LINKS=$(grep '^vpn://' <<<"$links" || true)
|
AWG_LINKS=$(grep '^vpn://' <<<"$links" || true)
|
||||||
# MTProto слушает localhost, а клиенты приходят через nginx на 443.
|
# MTProto слушает localhost, а клиенты приходят через nginx на 443.
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
# Код выхода 1 при любом запуске (и при `__update_binary`) – старый `hy2 update` на нём
|
# Код выхода 1 при любом запуске (и при `__update_binary`) – старый `hy2 update` на нём
|
||||||
# останавливается и не заменяет команду hy2.
|
# останавливается и не заменяет команду hy2.
|
||||||
|
|
||||||
KIT_VERSION="1.2.12"
|
KIT_VERSION="1.2.13"
|
||||||
|
|
||||||
cat >&2 <<'MSG'
|
cat >&2 <<'MSG'
|
||||||
Отдельный установщик Hysteria2 больше не поддерживается.
|
Отдельный установщик Hysteria2 больше не поддерживается.
|
||||||
|
|||||||
@@ -874,7 +874,9 @@ kit_local_site() {
|
|||||||
# Порт 443 отдаёт файл через nginx (перезагрузка не нужна). UDP-порт Hysteria2 держит копию
|
# Порт 443 отдаёт файл через nginx (перезагрузка не нужна). UDP-порт Hysteria2 держит копию
|
||||||
# страницы внутри подключения — её надо обновить, иначе ответы разойдутся.
|
# страницы внутри подключения — её надо обновить, иначе ответы разойдутся.
|
||||||
if kl_have kit; then
|
if kl_have kit; then
|
||||||
if kit net masq on >/dev/null 2>&1; then
|
if [[ -f /etc/kit/kl-protos ]] && ! grep -qE '(^|[ ,])hy2([ ,]|$)' /etc/kit/kl-protos; then
|
||||||
|
kl_ok "Hysteria2 в этой установке не ставился — синхронизировать нечего"
|
||||||
|
elif kit net masq on >/dev/null 2>&1; then
|
||||||
kl_ok "Hysteria2 отвечает той же страницей"
|
kl_ok "Hysteria2 отвечает той же страницей"
|
||||||
else
|
else
|
||||||
kl_warn "Hysteria2 не синхронизирован (может, его нет в этой установке) — проверьте: kit net masq on"
|
kl_warn "Hysteria2 не синхронизирован (может, его нет в этой установке) — проверьте: kit net masq on"
|
||||||
|
|||||||
+1
-1
@@ -12,7 +12,7 @@
|
|||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
export LC_ALL=C.UTF-8 # ширина колонок по символам, а не байтам
|
export LC_ALL=C.UTF-8 # ширина колонок по символам, а не байтам
|
||||||
|
|
||||||
KIT_VERSION="1.2.12"
|
KIT_VERSION="1.2.13"
|
||||||
KIT_RAW="https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS/raw/branch/main"
|
KIT_RAW="https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS/raw/branch/main"
|
||||||
# Файлы новой версии берём из её тега, а не из меняющейся ветки main.
|
# Файлы новой версии берём из её тега, а не из меняющейся ветки main.
|
||||||
kit_ref_raw() { echo "https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS/raw/tag/v$1"; }
|
kit_ref_raw() { echo "https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS/raw/tag/v$1"; }
|
||||||
|
|||||||
@@ -254,6 +254,13 @@ def main():
|
|||||||
' # Наш шов: если XHTTP и MTProto не выбраны, имена для них сейчас не нужны — не сканируем соседей\n # по подсети впустую (около 250 обращений к чужим 443). Имена SNI2/SNI3 возьмутся из общего списка ниже.\n if [[ $TRUSTED == yes && $multi == no && ( -z $SNI2 || -z $SNI3 ) ]] \\\n && [[ " ${PROTOS[*]} " == *" xhttp "* || " ${PROTOS[*]} " == *" mtproto "* ]]; then',
|
' # Наш шов: если XHTTP и MTProto не выбраны, имена для них сейчас не нужны — не сканируем соседей\n # по подсети впустую (около 250 обращений к чужим 443). Имена SNI2/SNI3 возьмутся из общего списка ниже.\n if [[ $TRUSTED == yes && $multi == no && ( -z $SNI2 || -z $SNI3 ) ]] \\\n && [[ " ${PROTOS[*]} " == *" xhttp "* || " ${PROTOS[*]} " == *" mtproto "* ]]; then',
|
||||||
'не сканировать соседей, если XHTTP и MTProto не выбраны',
|
'не сканировать соседей, если XHTTP и MTProto не выбраны',
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
'scripts/3x-ui.sh',
|
||||||
|
' extra=$(sub_links "$SUBID-awg" 1; sub_links "$SUBID-tg" 1)',
|
||||||
|
False,
|
||||||
|
' # Наш шов: подписки «-awg»/«-tg» есть только у установок с AmneziaWG и MTProto — не тянем их,\n # если эти протоколы не выбраны (никаких лишних обращений к панели).\n if [[ " ${PROTOS[*]} " == *" awg "* || " ${PROTOS[*]} " == *" awg3 "* || " ${PROTOS[*]} " == *" mtproto "* ]]; then\n extra=$(sub_links "$SUBID-awg" 1; sub_links "$SUBID-tg" 1)\n fi',
|
||||||
|
'не тянуть legacy-подписки awg/tg, если протоколы не выбраны',
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
bad = 0
|
bad = 0
|
||||||
|
|||||||
Reference in New Issue
Block a user