v1.2.8: доступ к панели в конце установки; kit local uninstall + пункт 10 в меню (SSH не трогает)

This commit is contained in:
2026-10-12 22:26:47 +03:00
parent 6da8650d1d
commit 6323c28533
8 changed files with 166 additions and 6 deletions
+113
View File
@@ -73,6 +73,7 @@ kit_local_help() {
kit local seams какие места форк правит в файлах автора
kit local masking состояние маскировки (у REALITY должен быть свой домен)
kit local hardening сводка по защите сервера и что ещё можно включить
kit local uninstall снести всё, что поставила установка (SSH не трогает)
Заглушка (сайт на 443 и ответ Hysteria2 — одна и та же страница)
kit local site поставить случайный сайт из нашего набора (10 штук)
@@ -894,6 +895,7 @@ kit_local_cmd() {
passwd | pass) shift; kit_local_passwd "$@" ;;
upgrades | auto) shift; kit_local_upgrades "$@" ;;
hardening | hard) shift; kit_local_hardening "$@" ;;
uninstall | remove) shift; kit_local_uninstall "$@" ;;
site | stub | stub-site) shift; kit_local_site "$@" ;;
*)
printf 'Неизвестная команда форка: %s\n' "$1" >&2
@@ -905,6 +907,116 @@ kit_local_cmd() {
# Точка входа: вызывается из kit.sh с аргументами командной строки.
# Если команда не наша — возвращаем 0, и kit работает ровно как раньше.
# ---------------------------------------------------------------- снос установки целиком
# Убираем всё, что появляется после установки: панель 3X-UI и службу x-ui, ядро Xray, службы и файлы
# kit (kit-sub, автообновление, cron), конфиги nginx и сайт-заглушку, сертификаты, правила ufw для 80/443,
# наши правки системы (правило ICMP, обновления безопасности), наши бэкапы и файл с данными панели.
#
# ЧЕГО НЕ ТРОГАЕМ: SSH — ни порт, ни конфиги, ни правила ufw для него, ни наш ssh-дроп-ин. Иначе легко
# остаться без доступа к серверу. Если SSH-порт когда-то менялся, верните его сами: kit local ssh 22
# (и закрыть лишние: kit local ssh --close-old 22).
#
# kit local uninstall спросит подтверждение словом «удалить»
# kit local uninstall --dry-run только покажет, что будет удалено
kit_local_uninstall() {
kl_args "$@"
local arg=${KL_REST[0]:-} ans answer
case $arg in
"") ;;
--dry-run) KL_DRY=yes ;;
*) kl_die "kit local uninstall [--dry-run]"; return 1 ;;
esac
local -a svc=(x-ui kit-sub kit-update.timer kit-update.service)
local -a files=(
/usr/local/x-ui /etc/x-ui /usr/bin/x-ui /etc/systemd/system/x-ui.service
/usr/local/bin/kit /usr/local/lib/kit /etc/kit /etc/kit-sub
/etc/systemd/system/kit-sub.service /etc/systemd/system/kit-update.service
/etc/systemd/system/kit-update.timer
/etc/cron.d/kit-nginx-reload /etc/cron.d/kit-xui-menu /etc/cron.d/kit-sub-cert
/etc/nginx/kit-stream.conf /etc/nginx/conf.d/kit.conf
/var/www/kit /root/3x-ui.txt /root/cert /root/.acme.sh /etc/letsencrypt
/etc/sysctl.d/99-kit-local-icmp.conf /etc/apt/apt.conf.d/52-kit-local-upgrades
)
local -a backups=()
local b
for b in /root/kit-local-backup-*; do [[ -e $b ]] && backups+=("$b"); done
kl_step "Будет удалено"
printf ' службы: %s\n' "${svc[*]}"
printf ' файлы и каталоги: %s\n' "${files[*]}"
[[ ${#backups[@]} -eq 0 ]] || printf ' наши копии изменённых файлов: %s\n' "${backups[*]}"
printf ' правила ufw для 80/tcp и 443/tcp (правило для SSH не трогаем)\n'
printf ' ответ на ping вернём (снимем наше правило)\n'
if kl_ufw_active; then
if [[ $(grep -c '^# -A ufw-before-input -p icmp --icmp-type echo-request' /etc/ufw/before.rules 2>/dev/null || echo 0) -gt 0 ]]; then
printf ' %s\n' "правило ICMP наше (строка закомментирована) — вернём как было"
fi
fi
kl_ok "перезагрузка не потребуется, SSH и его порт не затрагиваются"
if kl_dry; then
printf '\n (dry-run) ничего не делаю. Запустить по-настоящему: kit local uninstall\n'
return 0
fi
kl_need_root || return 1
if [[ -z ${KIT_LOCAL_UNINSTALL_CONFIRMED:-} ]]; then
printf '\n%sЧтобы удалить всё перечисленное, напишите слово «удалить»: %s' "${B:-}" "${N:-}"
read -r ans </dev/tty 2>/dev/null || ans=""
[[ ${ans,,} == "удалить" ]] || { kl_warn "не подтверждено — ничего не удаляю"; return 1; }
fi
kl_step "Останавливаю и отключаю службы"
local s
for s in "${svc[@]}"; do
systemctl disable --now "$s" >/dev/null 2>&1 && kl_ok "остановлено и отключено: $s" || kl_warn "служба $s не найдена (уже удалена?)"
done
if kl_have nginx; then
local others
others=$(find /etc/nginx/conf.d /etc/nginx/sites-enabled -type f -o -type l 2>/dev/null | grep -vE 'kit\.conf$|default$' | wc -l)
if [[ $others -eq 0 ]]; then
kl_run systemctl disable --now nginx >/dev/null 2>&1 && kl_ok "nginx остановлен (своих сайтов, кроме нашего, не было)"
KL_NGINX_PURGE=yes
else
kl_ok "nginx оставляю: в нём есть другие сайты ($others) — уберу только наши конфиги"
KL_NGINX_PURGE=no
fi
fi
kl_step "Убираю файлы"
for f in "${files[@]}"; do
[[ -e $f ]] || continue
kl_run rm -rf "$f" && kl_ok "удалено: $f"
done
for f in "${backups[@]}"; do kl_run rm -rf "$f" && kl_ok "удалено: $f"; done
[[ ${KL_NGINX_PURGE:-no} == yes ]] && { kl_run apt-get remove -y --purge nginx nginx-common >/dev/null 2>&1 && kl_ok "пакет nginx удалён"; }
kl_step "Возвращаю систему"
kl_run systemctl daemon-reload
if kl_ufw_active; then
local p
for p in 80/tcp 443/tcp 443/udp; do kl_run ufw delete allow "$p" >/dev/null 2>&1 && kl_ok "правило ufw снято: $p"; done
if [[ -f $KL_UFW_RULES ]]; then
kl_backup "$KL_UFW_RULES"; kl_backup "$KL_UFW6_RULES"
kl_run sed -i 's/^# -A ufw-before-input -p icmp --icmp-type echo-request/-A ufw-before-input -p icmp --icmp-type echo-request/' "$KL_UFW_RULES"
[[ -f $KL_UFW6_RULES ]] && kl_run sed -i 's/^# -A ufw6-before-input -p icmpv6 --icmpv6-type echo-request/-A ufw6-before-input -p icmpv6 --icmpv6-type echo-request/' "$KL_UFW6_RULES"
kl_run ufw reload >/dev/null 2>&1
kl_ok "ответ на ping возвращён"
fi
fi
kl_run sysctl -q -w net.ipv4.icmp_echo_ignore_all=0 >/dev/null 2>&1 || true
kl_step "Проверка"
local left=0
for s in "${svc[@]}"; do systemctl list-unit-files 2>/dev/null | grep -q "^$s" && { kl_warn "осталась служба: $s"; left=1; }; done
command -v kit >/dev/null && { kl_warn "команда kit ещё на месте (запустите команду ещё раз или удалите /usr/local/bin/kit)"; left=1; }
ss -H -ltn 2>/dev/null | awk '{print $4}' | grep -qE '[:.]443$' && { kl_warn "порт 443 всё ещё кем-то слушается"; left=1; }
(( left )) || kl_ok "от установки ничего не осталось, порт 443 свободен"
kl_ok "SSH не тронут: порт 22 (или ваш текущий) и правила для него на месте"
kl_step "Готово. Сервер вернулся к состоянию до установки."
}
# ---------------------------------------------------------------- полная справка `kit help`
# Категории и все команды: сначала авторские, затем наши. Если автор добавит команду, а справка
# про неё не знает — сборку релиза остановит проверка tools/check-help.sh.
@@ -951,6 +1063,7 @@ ${B:-}3X-UI_autoVPS ${KIT_VERSION:-?} — все команды${N:-} (то ж
kit local site [--list | N | --show] сайт-заглушка: случайный ИТ-сайт, список, конкретный, какой стоит
Проверка и починка
kit local uninstall снести установку целиком (панель, туннель, службы kit, сайт, сертификаты); SSH не трогает
kit check [--deep | --fix] проверка сервера (--deep — ходит наружу как клиент)
kit fix [--dry-run] безопасные починки: время, службы, конфиги
kit local hardening сводка по защите и что ещё можно включить