v1.2.6: вопрос про смену порта SSH вместо второго порта; меню и вопросы больше не попадают в значения переменных
This commit is contained in:
+54
-33
@@ -10,7 +10,7 @@
|
||||
# 4) спрашивает, какие протоколы ставить: невыбранные не создаются вообще — ни подключения в панели,
|
||||
# ни записей в nginx, ни ссылок в подписке (за это отвечает флаг автора --protocols);
|
||||
# 5) спрашивает и делает то, чего у автора нет: закрыть ответ на ping, включить обновления
|
||||
# безопасности, добавить второй порт SSH, сменить пароль root (поведение из StressOzz/vps-setup,
|
||||
# безопасности, перевести SSH на другой порт, сменить пароль root (поведение из StressOzz/vps-setup,
|
||||
# но безопаснее);
|
||||
# 6) в конце: kit fix (время и безопасные починки), kit check, kit local hardening.
|
||||
#
|
||||
@@ -71,7 +71,7 @@ usage() {
|
||||
Флаги этого скрипта:
|
||||
--harden закрыть ping и включить автообновления, без вопросов
|
||||
--no-harden не трогать ping и автообновления
|
||||
--ssh-port N добавить порт SSH N (прежний порт продолжает работать)
|
||||
--ssh-port N перевести SSH на порт N (прежний закроется после проверки входа)
|
||||
--yes ни о чём не спрашивать (для автоматизации)
|
||||
--no-time не запускать kit fix (время и безопасные починки)
|
||||
--no-check не запускать в конце kit check
|
||||
@@ -100,7 +100,8 @@ while (($#)); do
|
||||
esac
|
||||
shift
|
||||
done
|
||||
[[ -z $ssh_port || $ssh_port =~ ^[0-9]{1,5}$ ]] || die "--ssh-port: нужен номер порта, например 2222"
|
||||
[[ -z $ssh_port ]] || { [[ $ssh_port =~ ^[0-9]{1,5}$ ]] && ((10#$ssh_port >= 1024 && 10#$ssh_port <= 65535)); } \
|
||||
|| die "--ssh-port: нужно число 1024–65535, например 2222"
|
||||
|
||||
# Если --protocols задан флагом — не спрашиваем и не дублируем его.
|
||||
proto_flag=""
|
||||
@@ -125,8 +126,8 @@ if [[ $dry == yes ]]; then
|
||||
if [[ -n $proto_flag ]]; then pre "протоколы: ${proto_flag} (задано флагом)"
|
||||
elif interactive; then pre "протоколы: спрошу (Enter — всё, кроме WireGuard и REALITY-2)"
|
||||
else pre "протоколы: всё, кроме WireGuard и REALITY-2"; fi
|
||||
if [[ -n $ssh_port ]]; then pre "порт SSH: добавляю $ssh_port (прежний остаётся рабочим)"
|
||||
elif interactive; then pre "порт SSH: спрошу (Enter — не менять)"; fi
|
||||
if [[ -n $ssh_port ]]; then pre "порт SSH: перевожу на $ssh_port (прежний — после проверки входа)"
|
||||
elif interactive; then pre "порт SSH: спрошу (Enter — оставить текущий)"; fi
|
||||
if interactive; then pre "пароль root: спрошу (по умолчанию — не менять)"; fi
|
||||
[[ $fix_time == yes ]] && pre "после: kit fix (время, безопасные починки)"
|
||||
[[ $do_check == yes ]] && pre "проверка: kit check + kit local hardening"
|
||||
@@ -200,13 +201,13 @@ DEFAULT_PROTOS=(reality hy2 xhttp ws trojan vmess ss tuic awg awg3 mtproto)
|
||||
|
||||
proto_menu() {
|
||||
local i n mark
|
||||
say "какие протоколы поставить?"
|
||||
say "какие протоколы поставить?" >&2
|
||||
for i in "${!ALL_PROTOS[@]}"; do
|
||||
n=$((i + 1)) mark=" "
|
||||
[[ " ${DEFAULT_PROTOS[*]} " == *" ${ALL_PROTOS[i]} "* ]] && mark="*"
|
||||
printf ' %s %2d. %s\n' "$mark" "$n" "${PROTO_HINT[i]}"
|
||||
printf ' %s %2d. %s\n' "$mark" "$n" "${PROTO_HINT[i]}" >&2
|
||||
done
|
||||
printf ' %s\n' "${D}[* — набор по умолчанию (всё, кроме WireGuard и REALITY-2). Невыбранные протоколы не создаются вообще.]${N}"
|
||||
printf ' %s\n' "${D}[* — набор по умолчанию (всё, кроме WireGuard и REALITY-2). Невыбранные протоколы не создаются вообще.]${N}" >&2
|
||||
}
|
||||
|
||||
proto_parse() { # ответ → выбранные имена через запятую; код 1, если не разобрал
|
||||
@@ -237,7 +238,7 @@ ask_protocols() { # печатает итоговый список через з
|
||||
interactive || { printf '%s' "$(IFS=,; echo "${DEFAULT_PROTOS[*]}")"; return 0; }
|
||||
proto_menu
|
||||
for i in 1 2 3; do
|
||||
printf '\n%sНомера через запятую (например 1,3,11) или «все»; Enter — набор по умолчанию: %s' "$B" "$N"
|
||||
printf '\n%sНомера через запятую (например 1,3,11) или «все»; Enter — набор по умолчанию: %s' "$B" "$N" >&2
|
||||
ans=""
|
||||
read -r -t 300 ans <"$ASK_SRC" 2>/dev/null || true
|
||||
if picked=$(proto_parse "$ans"); then printf '%s' "$picked"; return 0; fi
|
||||
@@ -280,14 +281,6 @@ ask_yes() { # "вопрос" y|n — по умолчанию
|
||||
[[ $ans =~ ^(y|yes|д|да)$ ]]
|
||||
}
|
||||
|
||||
ask_value() { # "вопрос" → ответ (пусто, если терминала нет или ответа нет)
|
||||
interactive || return 0
|
||||
printf '\n%s: ' "$1"
|
||||
local v=""
|
||||
read -r -t 300 v <"$ASK_SRC" 2>/dev/null || true
|
||||
printf '%s' "${v//[[:space:]]/}"
|
||||
}
|
||||
|
||||
if [[ $fix_time == yes ]]; then
|
||||
say "kit fix: синхронизация времени и безопасные починки (авторская команда, ничего необратимого)"
|
||||
kit fix || warn "kit fix завершился с замечаниями — посмотрите вывод"
|
||||
@@ -310,24 +303,52 @@ if [[ $want_update == yes ]]; then
|
||||
kit local upgrades on || warn "не удалось — повторите: kit local upgrades on"
|
||||
fi
|
||||
|
||||
# второй порт SSH: по флагу, иначе по вопросу
|
||||
if [[ -z $ssh_port ]] && interactive; then
|
||||
answer=$(ask_value "Добавить второй порт для SSH? Введите номер, например 2222 (Enter — не менять)")
|
||||
[[ -n $answer ]] && ssh_port=$answer
|
||||
fi
|
||||
if [[ -n $ssh_port ]]; then
|
||||
if [[ $ssh_port =~ ^[0-9]{1,5}$ ]]; then
|
||||
say "добавляю порт SSH $ssh_port (прежний порт продолжает работать)"
|
||||
kit local ssh "$ssh_port" || warn "порт не добавился — сделайте отдельно: kit local ssh $ssh_port"
|
||||
cat <<EOF
|
||||
# порт SSH: по флагу или по вопросу. Смена делается в два шага: сначала ДОБАВИТЬ новый порт
|
||||
# (прежний продолжает работать), потом закрыть прежние — иначе одна опечатка оставляет сервер без доступа.
|
||||
ssh_ports_now() {
|
||||
local p
|
||||
p=$(kit local ssh --status 2>/dev/null | sed -n 's/^порты SSH сейчас: //p')
|
||||
[[ -n $p ]] || p=$(sshd -T 2>/dev/null | awk '$1 == "port" {print $2}' | paste -sd, -)
|
||||
[[ -n $p ]] || p=$(grep -rhiE '^[[:space:]]*Port[[:space:]]+[0-9]+' /etc/ssh/sshd_config /etc/ssh/sshd_config.d 2>/dev/null | awk '{print $2}' | paste -sd, -)
|
||||
printf '%s' "${p:-22}"
|
||||
}
|
||||
|
||||
${Y}Дальше обязательно:${N}
|
||||
проверьте вход во ВТОРОМ окне: ssh -p $ssh_port root@<IP сервера>
|
||||
убедились — закройте прежние порты: kit local ssh --close-old $ssh_port
|
||||
ask_ssh_port() { # пусто — оставить как есть; иначе номер нового порта
|
||||
local cur ans try
|
||||
cur=$(ssh_ports_now)
|
||||
interactive || return 0
|
||||
for try in 1 2 3; do
|
||||
printf '\n%sСменить порт SSH? Сейчас %s. Введите новый номер, Enter — оставить как есть: %s' "$B" "$cur" "$N" >&2
|
||||
ans=""
|
||||
read -r -t 300 ans <"$ASK_SRC" 2>/dev/null || true
|
||||
ans=${ans//[[:space:]]/}
|
||||
[[ -n $ans ]] || { say "порт SSH оставляю как есть ($cur)" >&2; return 0; }
|
||||
if ! [[ $ans =~ ^[0-9]{1,5}$ ]] || ((10#$ans < 1024 || 10#$ans > 65535)); then
|
||||
warn "«$ans» не похоже на порт (нужно число 1024–65535)"
|
||||
continue
|
||||
fi
|
||||
if [[ ,$cur, == *",$ans,"* ]]; then
|
||||
say "порт $ans уже слушает SSH — менять нечего" >&2; return 0
|
||||
fi
|
||||
if ss -H -ltn 2>/dev/null | awk '{print $4}' | grep -qE "[:.]$ans\$"; then
|
||||
warn "порт $ans/tcp занят другой программой"
|
||||
continue
|
||||
fi
|
||||
printf '%s' "$ans"; return 0
|
||||
done
|
||||
warn "оставляю прежний порт ($cur)"
|
||||
}
|
||||
|
||||
[[ -n $ssh_port ]] || ssh_port=$(ask_ssh_port)
|
||||
if [[ -n $ssh_port ]]; then
|
||||
say "перевожу SSH на порт $ssh_port: новый добавляю, прежний пока остаётся рабочим"
|
||||
kit local ssh "$ssh_port" || warn "порт не добавился — сделайте отдельно: kit local ssh $ssh_port"
|
||||
cat <<EOF
|
||||
|
||||
${Y}Дальше обязательно (иначе можно потерять доступ к серверу):${N}
|
||||
1) откройте ВТОРОЕ окно и проверьте вход: ssh -p $ssh_port root@<IP сервера>
|
||||
2) вход работает — закройте прежние порты: kit local ssh --close-old $ssh_port
|
||||
EOF
|
||||
else
|
||||
warn "«$ssh_port» не похоже на номер порта — пропускаю (позже: kit local ssh 2222)"
|
||||
fi
|
||||
fi
|
||||
|
||||
# пароль root: в флагах его нет намеренно — значение в командной строке видно в списке процессов
|
||||
|
||||
Reference in New Issue
Block a user