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