fix: input hangs in subshell, broken menu border

This commit is contained in:
arblark
2026-04-04 12:28:39 +03:00
parent ecfae2dd49
commit b8dfc63246
+35 -28
View File
@@ -317,42 +317,47 @@ parse_active_rules() {
# ── Интерактивные функции ─────────────────────────────────────────────────────── # ── Интерактивные функции ───────────────────────────────────────────────────────
REPLY_VALUE=""
input_ip() { input_ip() {
REPLY_VALUE=""
local ip local ip
while true; do while true; do
echo -ne " IP адрес назначения: " echo -ne " IP адрес назначения: " >/dev/tty
read -r ip read -r ip </dev/tty
if validate_ip "$ip"; then if validate_ip "$ip"; then
echo "$ip" REPLY_VALUE="$ip"
return return
fi fi
msg_err "Некорректный IP. Поддерживаются IPv4 и IPv6." msg_err "Некорректный IP. Поддерживаются IPv4 и IPv6." >/dev/tty
done done
} }
input_port() { input_port() {
REPLY_VALUE=""
local label="$1" port local label="$1" port
while true; do while true; do
echo -ne " $label: " echo -ne " $label: " >/dev/tty
read -r port read -r port </dev/tty
if validate_port "$port"; then if validate_port "$port"; then
echo "$port" REPLY_VALUE="$port"
return return
fi fi
msg_err "Порт: число 1-65535." msg_err "Порт: число 1-65535." >/dev/tty
done done
} }
input_port_or_range() { input_port_or_range() {
REPLY_VALUE=""
local label="$1" val local label="$1" val
while true; do while true; do
echo -ne " $label (число или диапазон N:M): " echo -ne " $label (число или диапазон N:M): " >/dev/tty
read -r val read -r val </dev/tty
if validate_port_range "$val"; then if validate_port_range "$val"; then
echo "$val" REPLY_VALUE="$val"
return return
fi fi
msg_err "Формат: одиночный порт (1-65535) или диапазон (start:end)." msg_err "Формат: одиночный порт (1-65535) или диапазон (start:end)." >/dev/tty
done done
} }
@@ -363,11 +368,11 @@ menu_standard_rule() {
echo -e "\n${CYAN}── Настройка $label ($proto) ──${NC}\n" echo -e "\n${CYAN}── Настройка $label ($proto) ──${NC}\n"
local target_ip input_ip
target_ip=$(input_ip) local target_ip="$REPLY_VALUE"
local port input_port "Порт (одинаковый вход/выход)"
port=$(input_port "Порт (одинаковый вход/выход)") local port="$REPLY_VALUE"
echo "" echo ""
apply_rules "$proto" "$port" "$port" "$target_ip" "$label" apply_rules "$proto" "$port" "$port" "$target_ip" "$label"
@@ -385,12 +390,14 @@ menu_custom_rule() {
msg_err "Введите tcp или udp." msg_err "Введите tcp или udp."
done done
local target_ip input_ip
target_ip=$(input_ip) local target_ip="$REPLY_VALUE"
local in_port out_port input_port "Входящий порт (на этом сервере)"
in_port=$(input_port "Входящий порт (на этом сервере)") local in_port="$REPLY_VALUE"
out_port=$(input_port "Исходящий порт (на целевом сервере)")
input_port "Исходящий порт (на целевом сервере)"
local out_port="$REPLY_VALUE"
echo "" echo ""
apply_rules "$proto" "$in_port" "$out_port" "$target_ip" "Custom" apply_rules "$proto" "$in_port" "$out_port" "$target_ip" "Custom"
@@ -408,11 +415,11 @@ menu_batch_rule() {
msg_err "Введите tcp или udp." msg_err "Введите tcp или udp."
done done
local target_ip input_ip
target_ip=$(input_ip) local target_ip="$REPLY_VALUE"
local port_range input_port_or_range "Диапазон портов"
port_range=$(input_port_or_range "Диапазон портов") local port_range="$REPLY_VALUE"
echo "" echo ""
if [[ "$port_range" =~ ^([0-9]+):([0-9]+)$ ]]; then if [[ "$port_range" =~ ^([0-9]+):([0-9]+)$ ]]; then
@@ -791,9 +798,9 @@ show_menu() {
while true; do while true; do
clear clear
echo "" echo ""
echo -e "${CYAN} ┌──────────────────────────────────────────────┐${NC}" echo -e "${CYAN} ──────────────────────────────────────────${NC}"
echo -e "${CYAN} │${NC} ${WHITE}CASCAD${NC} ${DIM}v${VERSION}${NC} — каскадное NAT-перенаправление ${CYAN}│${NC}" echo -e " ${WHITE}CASCAD${NC} ${DIM}v${VERSION}${NC} — каскадное NAT-перенаправление"
echo -e "${CYAN} └──────────────────────────────────────────────┘${NC}" echo -e "${CYAN} ──────────────────────────────────────────${NC}"
echo "" echo ""
echo -e " ${WHITE}Настройка правил:${NC}" echo -e " ${WHITE}Настройка правил:${NC}"
echo -e " ${GREEN}1${NC}) AmneziaWG / WireGuard ${DIM}(UDP)${NC}" echo -e " ${GREEN}1${NC}) AmneziaWG / WireGuard ${DIM}(UDP)${NC}"