Compare commits

..
2 Commits
9 changed files with 173 additions and 61 deletions
+13
View File
@@ -10,6 +10,19 @@
канал обновлений и оговорки. Две картинки — наши (`manuals/assets/fork-banner.svg` и
`manuals/assets/script-3x-ui-local.svg`, терминал собран из настоящего вывода скрипта).
* Шов в README больше не нужен (`tools/fork_apply.py`): файл наш целиком, как `kit-local.sh`.
## v1.2.9: снос действительно убирает всё, повторная установка после сноса
* Список удаляемого в `kit local uninstall` собран заново **по коду установщика** и дополнен тем, чего
не хватало: `/usr/local/lib/kit-sub`, `/root/kit-backup-*` и `/root/x-ui-before-*` (копии kit),
`/var/log/kit-install-check.log`, `/usr/bin/x-ui.new`, строка `include kit-stream.conf` в `nginx.conf`,
симлинки в `sites-enabled`/`streams-enabled`, файл автообновлений безопасности, пользователь `kit-sub`.
Из-за пропущенных файлов установщик после сноса отказывался ставить заново («3X-UI уже установлена»).
* После сноса печатается проверка **теми же условиями, что у установщика**, и список того, что осталось
на диске — вместо бодрого «удалено» вслепую.
* Флаг `--reset-ssh`: снести и наш ssh-дроп-ин (порт возвращается к системному). По умолчанию SSH не трогаем.
* У установщика появился флаг **`--clean`**: убрать прошлую установку и поставить заново. Если установщик
всё-таки упал на «уже установлена», в подсказке прямо сказано запустить с `--clean`.
## v1.2.8: доступ к панели в конце установки и снос сервера из меню
* В конце установки (перед подпиской) печатается **доступ к панели 3X-UI**: адрес, логин и пароль из
+8 -8
View File
@@ -1,9 +1,9 @@
# 3X-UI KIT 1.2.8
# 3X-UI_autoVPS 1.2.8
b0497a26637fd2ef2aae6e512a9afc49f4f6f64b639994c9f029fa4c0977a3a8 scripts/3x-ui.sh
03589cb294acf83be77aeb170eb8adcfc2f901437e437ebc6c1b56bb18579333 scripts/hysteria2.sh
7d328be5414ab544d0b29e89db3ef172a7d650f3ac0b80bade25ac7136709a47 scripts/kit.sh
# 3X-UI KIT 1.2.9
# 3X-UI_autoVPS 1.2.9
03d89d6ba3595ed29175d2bef321cf5104360011d6c3d7b75a0a6b713c0b78ca scripts/3x-ui.sh
5f0cd97f1d2c26f35db3cf707656a7c951e79b1c6ef70c62a93b2e73fa4e3c58 scripts/hysteria2.sh
b65f7b40a8efbe8e44175c6a6d0d2193d17d14dd64c1e6cff1aefd171ed35f09 scripts/kit.sh
4027ea2c6dbc9fd176356acac3f676445419c2f021146ed25dfe5a304c3ac5fb scripts/kit-sub.py
8216a98d82712dd320e6f158212b557c01c5aa94f8099c89ce33fe5fc39f9002 scripts/kit-local.sh
bf961b4e33bfb9e4d18fd9edcea0a71320d6de9a8304c17b6cbeb95aef04affc scripts/3x-ui-local.sh
d2d31534641da01801512a3ec793bc8d57132d4cefa19a5fb503e8995f39eb8f VERSION
3aa34a3d796161b056d2e0bd15456851304bb4bc5717ed2df5522c53d6c71e36 scripts/kit-local.sh
81137d4407aba121547647b1cc8c0b8e6d27fdef5abf067bcdf1c56d77ef6f49 scripts/3x-ui-local.sh
c8d83c2672c5e397ce16a2ee275ac45917002b9b36765f77d99f31bdf81ee828 VERSION
+2 -2
View File
@@ -1,6 +1,6 @@
-----BEGIN SSH SIGNATURE-----
U1NIU0lHAAAAAQAAADMAAAALc3NoLWVkMjU1MTkAAAAgozRJ+f9RB6qO9S9j3BWCDtC0bV
FHakRSSqtQPljLoQUAAAARM3gtdWkta2l0LXJlbGVhc2UAAAAAAAAABnNoYTUxMgAAAFMA
AAALc3NoLWVkMjU1MTkAAABAc/dTe+Zehd28Zfczj1mJXWHNZGSAx8Lbr+jqpF7oYcVNq9
ExRrCHUH3GS7IDR2KRJRV8zqVyEDwBDat6ZQhZBQ==
AAALc3NoLWVkMjU1MTkAAABA0E1E05SsGMOSZAwROAfE/KJeG9tZVb3Fj7YS+4KFh07863
1Z59OMaOqnsSwoF/TD98jH9ZyU/ovYOjajHpgDDw==
-----END SSH SIGNATURE-----
+1 -1
View File
@@ -1 +1 @@
1.2.8
1.2.9
+63 -6
View File
@@ -34,15 +34,17 @@
# --yes ни о чём не спрашивать (ping закрою, автообновления включу, порт и пароль — нет)
# --no-time не запускать kit fix
# --no-check не запускать в конце kit check
# --clean убрать прошлую установку и поставить заново (SSH не трогает)
# --verify-only только проверить релиз (подпись и SHA256) и выйти
# --dry-run показать план и ничего не делать
# --clean снести прошлую установку и поставить заново (SSH не трогает)
--dry-run показать план и ничего не делать
# -h | --help эта справка
#
# Наш файл: авторские релизы его не перезаписывают, а правки форка живут в scripts/kit-local.sh.
set -Eeuo pipefail
KIT_VERSION="1.2.8" # версия сборки форка; должна совпадать с VERSION релиза
KIT_VERSION="1.2.9" # версия сборки форка; должна совпадать с VERSION релиза
GITEA="${KIT_FORK_BASE:-https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS}"
NS="3x-ui-kit-release"
SIG_ID="releases@3x-ui-kit"
@@ -78,7 +80,8 @@ usage() {
--yes ни о чём не спрашивать (для автоматизации)
--site N|random|off сайт-заглушка: конкретный из нашего набора, случайный (по умолчанию) или
не трогать авторскую страницу (то же: --no-site)
--no-sub не показывать в конце подписку, QR-код и ссылки по протоколам
--no-sub не показывать в конце подписку и QR-код
--clean снести прошлую установку и поставить заново (если прошлый запуск оборвался)
--no-time не запускать kit fix (время и безопасные починки)
--no-check не запускать в конце kit check
--verify-only только проверить релиз (подпись и SHA256) и выйти
@@ -92,6 +95,7 @@ EOF
INSTALLER_ARGS=(); harden=auto; ssh_port=""; fix_time=yes; do_check=yes; dry=no; verify_only=no; assume_yes=no
site=random # заглушка: случайный сайт из нашего набора (off — не трогать)
show_sub=yes # в самом конце показать подписку, QR-код и ссылки
clean=no # --clean: убрать прошлую установку перед новой
while (($#)); do
case $1 in
--harden) harden=yes ;;
@@ -103,6 +107,7 @@ while (($#)); do
--site=*) site=${1#*=} ;;
--no-site) site=off ;;
--no-sub) show_sub=no ;;
--clean) clean=yes ;;
--no-time) fix_time=no ;;
--no-check) do_check=no ;;
--verify-only) verify_only=yes ;;
@@ -134,6 +139,7 @@ if [[ $dry == yes ]]; then
say "план установки (--dry-run: ничего не делаю)"
pre "версия сборки: $KIT_VERSION"
pre "откуда: $GITEA (тег v$KIT_VERSION), подпись проверяется ключом форка"
[[ $clean == yes ]] && pre "прошлая установка: уберу её перед установкой (--clean), SSH не трону"
if ((${#INSTALLER_ARGS[@]})); then pre "установщик автора: bash scripts/3x-ui.sh ${INSTALLER_ARGS[*]}"; else pre "установщик автора: bash scripts/3x-ui.sh — спросит про маскировку и домен"; fi
if [[ $harden == auto ]]; then
if interactive; then pre "защита: спрошу про ответ на ping и автообновления"
@@ -153,7 +159,7 @@ if [[ $dry == yes ]]; then
esac
[[ $fix_time == yes ]] && pre "после: kit fix (время, безопасные починки)"
[[ $do_check == yes ]] && pre "проверка: kit check + kit local hardening"
[[ $show_sub == yes ]] && pre "в самом конце: подписка, QR-код и ссылки по протоколам (--no-sub — не надо)"
[[ $show_sub == yes ]] && pre "в самом конце: доступ к панели 3X-UI, подписка, QR-код и ссылки (--no-sub — не надо)"
echo
say "запуск без --dry-run выполнит всё это на сервере"
exit 0
@@ -275,6 +281,55 @@ ask_protocols() { # печатает итоговый список через з
printf '%s' "$(IFS=,; echo "${DEFAULT_PROTOS[*]}")"
}
# ------------------------------------------------------------------ снос прошлой установки (--clean)
# Нужен, когда прошлая установка оборвалась: авторский установщик в таком случае отказывается работать
# («3X-UI уже установлена этим скриптом»). Убираем то, что создаёт установка, и ставим заново.
# SSH не трогаем: ни порт, ни конфиги — иначе можно потерять доступ к серверу.
clean_previous() {
say "убираю прошлую установку (--clean)"
local s p
for s in x-ui kit-sub kit-update.timer kit-update.service; do
systemctl list-unit-files 2>/dev/null | grep -q "^$s" || continue
systemctl disable --now "$s" >/dev/null 2>&1 || true
printf ' остановлено: %s\n' "$s"
done
for p in /usr/local/x-ui /etc/x-ui /usr/bin/x-ui /usr/bin/x-ui.new /etc/systemd/system/x-ui.service \
/usr/local/bin/kit /usr/local/lib/kit /usr/local/lib/kit-sub /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 /var/log/kit-install-check.log \
/root/kit-local-backup-* /root/kit-backup-* /root/x-ui-before-sni-* /root/x-ui-before-update-*; do
[[ -e $p ]] || continue
rm -rf $p && printf ' удалено: %s\n' "$p"
done
if [[ -f /etc/nginx/nginx.conf ]] && grep -q 'kit-stream\.conf' /etc/nginx/nginx.conf; then
sed -i '/kit-stream\.conf/d' /etc/nginx/nginx.conf
printf ' из nginx.conf убрана наша строка включения\n'
fi
if id -u kit-sub >/dev/null 2>&1; then
pkill -u kit-sub >/dev/null 2>&1 || true
userdel -r kit-sub >/dev/null 2>&1 || true
printf ' удалён пользователь kit-sub\n'
fi
systemctl daemon-reload
if [[ -f /root/3x-ui.txt && -x /usr/local/x-ui/x-ui ]]; then
warn "часть файлов прошлой установки осталась — проверьте: ls -la /usr/local/x-ui /root/3x-ui.txt"
else
printf ' готово: место под установку свободно\n'
fi
}
installer_failed() {
if [[ -f /root/3x-ui.txt && -x /usr/local/x-ui/x-ui ]]; then
printf '\n%s!%s %s\n' "$Y" "$N" \
"На сервере осталась прошлая установка (установщик так и пишет). Запустите ещё раз с флагом --clean — он уберёт старое и поставит заново." >&2
fi
die "установщик остановился с ошибкой — смотрите его вывод выше"
}
# ------------------------------------------------------------------ установка
if [[ -z $proto_flag ]]; then
@@ -285,14 +340,16 @@ else
fi
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 || die "установщик остановился с ошибкой — смотрите его вывод выше"
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 || die "установщик остановился с ошибкой (нет терминала — вопросы задать некому)"
bash "$tmp/scripts/3x-ui.sh" ${INSTALLER_ARGS[@]+"${INSTALLER_ARGS[@]}"} </dev/null || installer_failed
fi
command -v kit >/dev/null || die "после установки нет команды kit — что-то пошло не так, смотрите вывод выше"
+1 -1
View File
@@ -30,7 +30,7 @@ wait_apt_idle() {
XUI_VERSION="v3.9.0"
# SHA256 установщика 3X-UI этой версии: тег могут передвинуть, а хеш – нет (проверено 2026-09-30).
XUI_INSTALL_SHA256="18616fe26c8f6c92db6daa2dcd7cd53c5143ee69ecfd26d8ea6dc9b2c78607a6"
KIT_VERSION="1.2.8"
KIT_VERSION="1.2.9"
# kit и kit-sub берём из того же релиза, что и этот скрипт, а не из меняющейся ветки main.
KIT_RAW="https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS/raw/tag/v$KIT_VERSION"
# Ядро Xray для панели. С 26.7.x клиенты на Mihomo и sing-box (Hiddify, FlClash,
+1 -1
View File
@@ -8,7 +8,7 @@
# Код выхода 1 при любом запуске (и при `__update_binary`) – старый `hy2 update` на нём
# останавливается и не заменяет команду hy2.
KIT_VERSION="1.2.8"
KIT_VERSION="1.2.9"
cat >&2 <<'MSG'
Отдельный установщик Hysteria2 больше не поддерживается.
+83 -41
View File
@@ -920,40 +920,43 @@ kit_local_cmd() {
# kit local uninstall --dry-run только покажет, что будет удалено
kit_local_uninstall() {
kl_args "$@"
local arg=${KL_REST[0]:-} ans answer
local arg=${KL_REST[0]:-} ans found
local reset_ssh=no
case $arg in
"") ;;
--dry-run) KL_DRY=yes ;;
*) kl_die "kit local uninstall [--dry-run]"; return 1 ;;
--reset-ssh) reset_ssh=yes ;;
*) kl_die "kit local uninstall [--dry-run] [--reset-ssh]"; 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
# Список собран по коду установщика (scripts/3x-ui.sh) и нашего слоя: убираем всё, что они создают.
local -a paths=(
/usr/local/x-ui /etc/x-ui /usr/bin/x-ui /usr/bin/x-ui.new /etc/systemd/system/x-ui.service
/usr/local/bin/kit /usr/local/lib/kit /usr/local/lib/kit-sub /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/nginx/kit-stream.conf /etc/nginx/conf.d/kit.conf /var/www/kit
/root/3x-ui.txt /root/cert /root/.acme.sh /etc/letsencrypt /var/log/kit-install-check.log
/etc/sysctl.d/99-kit-local-icmp.conf /etc/apt/apt.conf.d/52-kit-local-upgrades
/etc/apt/apt.conf.d/20auto-upgrades
)
local -a backups=()
local b
for b in /root/kit-local-backup-*; do [[ -e $b ]] && backups+=("$b"); done
local -a masks=(/root/kit-local-backup-* /root/kit-backup-* /root/x-ui-before-sni-* /root/x-ui-before-update-*)
local -a extra=()
local m
for m in "${masks[@]}"; do for f in $m; do [[ -e $f ]] && extra+=("$f"); done; 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
printf ' файлы и каталоги: %s\n' "${paths[*]}"
[[ ${#extra[@]} -eq 0 ]] || printf ' копии и журналы: %s\n' "${extra[*]}"
printf ' пользователь kit-sub (если создавался)\n'
printf ' правила ufw для 80/tcp, 443/tcp и 443/udp; ответ на ping возвращается\n'
kl_ok "SSH не трогаем: ни порт, ни конфиги, ни правила — иначе можно потерять доступ"
if [[ $reset_ssh == yes ]]; then
kl_warn "--reset-ssh: снесу и наш ssh-дроп-ин (порт вернётся к системному). Убедитесь, что вход по нему работает!"
fi
kl_ok "перезагрузка не потребуется, SSH и его порт не затрагиваются"
if kl_dry; then
printf '\n (dry-run) ничего не делаю. Запустить по-настоящему: kit local uninstall\n'
@@ -970,51 +973,90 @@ kit_local_uninstall() {
kl_step "Останавливаю и отключаю службы"
local s
for s in "${svc[@]}"; do
systemctl disable --now "$s" >/dev/null 2>&1 && kl_ok "остановлено и отключено: $s" || kl_warn "служба $s не найдена (уже удалена?)"
if systemctl list-unit-files 2>/dev/null | grep -q "^$s"; then
systemctl disable --now "$s" >/dev/null 2>&1 && kl_ok "остановлено и отключено: $s" || kl_warn "не смог остановить: $s"
fi
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)
others=$(find /etc/nginx/conf.d /etc/nginx/sites-enabled /etc/nginx/streams-enabled -mindepth 1 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 остановлен (своих сайтов, кроме нашего, не было)"
systemctl disable --now nginx >/dev/null 2>&1 && kl_ok "nginx остановлен (чужих сайтов в нём не было)"
KL_NGINX_PURGE=yes
else
kl_ok "nginx оставляю: в нём есть другие сайты ($others) — уберу только наши конфиги"
kl_ok "nginx оставляю: в нём есть другие сайты — уберу только наши строки и файлы"
KL_NGINX_PURGE=no
fi
fi
kl_step "Убираю файлы"
for f in "${files[@]}"; do
local f
for f in "${paths[@]}"; do
[[ -e $f ]] || continue
kl_run rm -rf "$f" && kl_ok "удалено: $f"
rm -rf "$f" && kl_ok "удалено: $f" || kl_warn "не удалось удалить: $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 удалён"; }
for f in ${extra[@]+"${extra[@]}"}; do rm -rf "$f" && kl_ok "удалено: $f"; done
# Наши строки в чужом nginx: include stream-конфига и симлинки, если были.
if [[ -f /etc/nginx/nginx.conf ]] && grep -q 'kit-stream.conf' /etc/nginx/nginx.conf; then
kl_backup /etc/nginx/nginx.conf
sed -i '/kit-stream\.conf/d' /etc/nginx/nginx.conf && kl_ok "из nginx.conf убрана наша строка включения"
fi
local lnk
for lnk in /etc/nginx/sites-enabled/*kit* /etc/nginx/streams-enabled/*kit*; do
[[ -e $lnk || -L $lnk ]] && rm -f "$lnk" && kl_ok "удалена ссылка: $lnk"
done
if [[ ${KL_NGINX_PURGE:-no} == yes ]]; then
apt-get remove -y --purge nginx nginx-common >/dev/null 2>&1 && kl_ok "пакет nginx удалён"
fi
# Пользователь подписки (работает не от root).
if id -u kit-sub >/dev/null 2>&1; then
pkill -u kit-sub >/dev/null 2>&1 || true
userdel -r kit-sub >/dev/null 2>&1 && kl_ok "пользователь kit-sub удалён" || kl_warn "не смог удалить пользователя kit-sub"
fi
kl_step "Возвращаю систему"
kl_run systemctl daemon-reload
if kl_ufw_active; then
systemctl daemon-reload
if [[ $reset_ssh == yes && -f /etc/systemd/system/ssh.socket.d/99-kit-local-port.conf ]]; then
rm -f /etc/systemd/system/ssh.socket.d/99-kit-local-port.conf
rm -f /etc/ssh/sshd_config.d/99-kit-local-port.conf
systemctl daemon-reload
kl_run systemctl restart ssh.socket 2>/dev/null || kl_run systemctl restart ssh 2>/dev/null || true
kl_warn "ssh-дроп-ин удалён: порт вернулся к системному. Проверьте вход в НОВОМ окне!"
fi
if kl_have ufw && 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
for p in 80/tcp 443/tcp 443/udp; do 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 возвращён"
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 ]] && 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"
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
sysctl -q -w net.ipv4.icmp_echo_ignore_all=0 >/dev/null 2>&1 || true
kl_step "Проверка"
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; }
if [[ -f /root/3x-ui.txt && -x /usr/local/x-ui/x-ui ]]; then
kl_warn "установщик всё ещё считает панель установленной"; left=1
fi
for s in "${svc[@]}"; do
systemctl list-unit-files 2>/dev/null | grep -q "^$s" && { kl_warn "осталась служба: $s"; left=1; }
done
found=$(ls -d /etc/kit* /usr/local/lib/kit* /usr/local/bin/kit /etc/cron.d/kit-* /var/www/kit \
/root/3x-ui.txt /root/cert /etc/x-ui /usr/local/x-ui 2>/dev/null | head -20)
[[ -z $found ]] || { kl_warn "осталось на диске:"; printf ' %s\n' $found; 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 "Готово. Сервер вернулся к состоянию до установки."
if ((left)); then
kl_warn "что-то осталось — пришлите этот вывод, поправим список в kit local uninstall"
else
kl_ok "чисто: от установки не осталось ни файлов, ни служб, порт 443 свободен"
fi
kl_ok "SSH не тронут (если не указан --reset-ssh)"
kl_step "Готово: сервер в состоянии до установки, можно ставить заново"
}
# ---------------------------------------------------------------- полная справка `kit help`
+1 -1
View File
@@ -12,7 +12,7 @@
set -Eeuo pipefail
export LC_ALL=C.UTF-8 # ширина колонок по символам, а не байтам
KIT_VERSION="1.2.8"
KIT_VERSION="1.2.9"
KIT_RAW="https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS/raw/branch/main"
# Файлы новой версии берём из её тега, а не из меняющейся ветки main.
kit_ref_raw() { echo "https://git.rukavishnikoff.ru/hacker07/3X-UI_autoVPS/raw/tag/v$1"; }