From ee13a9e51237a7c6211bf2f088e9d4575ec67bb7 Mon Sep 17 00:00:00 2001 From: anten-ka Date: Sat, 7 Mar 2026 15:00:02 +0300 Subject: [PATCH] =?UTF-8?q?Fix:=20replace=20all=20grep=20-oP/-P=20(PCRE)?= =?UTF-8?q?=20with=20portable=20sed=20=E2=80=94=20fixes=20ping=20TIMEOUT?= =?UTF-8?q?=20on=20servers=20without=20libpcre?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Made-with: Cursor --- install.sh | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/install.sh b/install.sh index a058d70..965c9ad 100644 --- a/install.sh +++ b/install.sh @@ -228,7 +228,7 @@ probe_server_cli() { local plost=0 for n in 1 2 3; do local ms - ms=$(ping -c 1 -W 3 "$ip" 2>/dev/null | grep -oP 'time=\K[\d.]+') + ms=$(ping -c 1 -W 3 "$ip" 2>/dev/null | sed -n 's/.*time=\([0-9.]*\).*/\1/p') if [ -n "$ms" ]; then pings+=("$ms") echo -e " #$n: ${GREEN}${ms}ms${NC}" @@ -290,7 +290,7 @@ probe_server_tg() { local plost=0 for n in 1 2 3; do local ms - ms=$(ping -c 1 -W 3 "$ip" 2>/dev/null | grep -oP 'time=\K[\d.]+') + ms=$(ping -c 1 -W 3 "$ip" 2>/dev/null | sed -n 's/.*time=\([0-9.]*\).*/\1/p') if [ -n "$ms" ]; then pings+=("$ms") result+=" #$n: ${ms}ms\n" @@ -392,9 +392,9 @@ get_system_stats() { get_rules_list() { iptables -t nat -S PREROUTING 2>/dev/null | grep "DNAT" | while read -r line; do local port proto dest - port=$(echo "$line" | grep -oP '(?<=--dport )\d+') - proto=$(echo "$line" | grep -oP '(?<=-p )\w+') - dest=$(echo "$line" | grep -oP '(?<=--to-destination )[\d.:]+') + port=$(echo "$line" | sed -n 's/.*--dport \([0-9]*\).*/\1/p') + proto=$(echo "$line" | sed -n 's/.*-p \([a-z]*\).*/\1/p') + dest=$(echo "$line" | sed -n 's/.*--to-destination \([0-9.:]*\).*/\1/p') [ -n "$port" ] && echo "${proto}|${port}|${dest}" done } @@ -405,15 +405,15 @@ get_target_ips() { remove_rules_for_port() { local proto="$1" in_port="$2" - iptables -t nat -S PREROUTING 2>/dev/null | grep "DNAT" | grep -P "\b--dport ${in_port}\b" | grep -P "\b-p ${proto}\b" | while read -r rule; do + iptables -t nat -S PREROUTING 2>/dev/null | grep "DNAT" | grep -- "--dport ${in_port} " | grep -- "-p ${proto} " | while read -r rule; do eval "iptables -t nat -D ${rule#-A }" 2>/dev/null done - iptables -S INPUT 2>/dev/null | grep "kaskad" | grep -P "\b--dport ${in_port}\b" | grep -P "\b-p ${proto}\b" | while read -r rule; do + iptables -S INPUT 2>/dev/null | grep "kaskad" | grep -- "--dport ${in_port} " | grep -- "-p ${proto} " | while read -r rule; do eval "iptables -D ${rule#-A }" 2>/dev/null done - iptables -S FORWARD 2>/dev/null | grep "kaskad" | grep -P "\b-p ${proto}\b" | while read -r rule; do - local rd=$(echo "$rule" | grep -oP '(?<=--dport )\d+') - local rs=$(echo "$rule" | grep -oP '(?<=--sport )\d+') + iptables -S FORWARD 2>/dev/null | grep "kaskad" | grep -- "-p ${proto} " | while read -r rule; do + local rd; rd=$(echo "$rule" | sed -n 's/.*--dport \([0-9]*\).*/\1/p') + local rs; rs=$(echo "$rule" | sed -n 's/.*--sport \([0-9]*\).*/\1/p') [[ "$rd" == "$in_port" || "$rs" == "$in_port" ]] && eval "iptables -D ${rule#-A }" 2>/dev/null done } @@ -535,9 +535,10 @@ flush_rules() { read -p "Уверены? (y/n): " confirm if [[ "$confirm" == "y" ]]; then if command -v ufw &>/dev/null && ufw status 2>/dev/null | grep -q "Status: active"; then - iptables -S INPUT 2>/dev/null | grep "kaskad" | grep -oP '(?<=--dport )\d+' | while read -r p; do - local pr; pr=$(iptables -S INPUT 2>/dev/null | grep "kaskad" | grep "\b${p}\b" | grep -oP '(?<=-p )\w+' | head -1) - [ -n "$pr" ] && ufw delete allow "$p/$pr" > /dev/null 2>&1 + iptables -S INPUT 2>/dev/null | grep "kaskad" | while read -r ul; do + local up; up=$(echo "$ul" | sed -n 's/.*--dport \([0-9]*\).*/\1/p') + local upr; upr=$(echo "$ul" | sed -n 's/.*-p \([a-z]*\).*/\1/p') + [ -n "$up" ] && [ -n "$upr" ] && ufw delete allow "$up/$upr" > /dev/null 2>&1 done fi while iptables -t nat -S PREROUTING 2>/dev/null | grep -q "DNAT"; do @@ -602,9 +603,10 @@ full_uninstall() { systemctl daemon-reload 2>/dev/null echo -e " ${GREEN}✓${NC} Мониторинг остановлен" if command -v ufw &>/dev/null && ufw status 2>/dev/null | grep -q "Status: active"; then - iptables -S INPUT 2>/dev/null | grep "kaskad" | grep -oP '(?<=--dport )\d+' | while read -r p; do - local pr; pr=$(iptables -S INPUT 2>/dev/null | grep "kaskad" | grep "\b${p}\b" | grep -oP '(?<=-p )\w+' | head -1) - [ -n "$pr" ] && ufw delete allow "$p/$pr" > /dev/null 2>&1 + iptables -S INPUT 2>/dev/null | grep "kaskad" | while read -r ul; do + local up; up=$(echo "$ul" | sed -n 's/.*--dport \([0-9]*\).*/\1/p') + local upr; upr=$(echo "$ul" | sed -n 's/.*-p \([a-z]*\).*/\1/p') + [ -n "$up" ] && [ -n "$upr" ] && ufw delete allow "$up/$upr" > /dev/null 2>&1 done echo -e " ${GREEN}✓${NC} Правила UFW очищены" fi @@ -717,7 +719,7 @@ ping_live() { while [ "$running" -eq 1 ]; do local ms - ms=$(ping -c 1 -W 2 "$ip" 2>/dev/null | grep -oP 'time=\K[\d.]+') + ms=$(ping -c 1 -W 3 "$ip" 2>/dev/null | sed -n 's/.*time=\([0-9.]*\).*/\1/p') ((count++)) clear @@ -883,7 +885,7 @@ monitor_daemon() { [ -f "$ckf" ] && lc=$(cat "$ckf") if (( now - lc >= MON_INTERVAL )); then echo "$now" > "$ckf" - local pr; pr=$(ping -c 1 -W 3 "$MON_IP" 2>/dev/null | grep -oP 'time=\K[\d.]+') + local pr; pr=$(ping -c 1 -W 3 "$MON_IP" 2>/dev/null | sed -n 's/.*time=\([0-9.]*\).*/\1/p') if [ -z "$pr" ]; then monitor_alert "$MON_IP" "TIMEOUT" "$MON_THRESHOLD" "$MON_COOLDOWN" else @@ -1202,7 +1204,7 @@ bot_handle_callback() { ps:*) local ip="${data#ps:}"; local lb; lb=$(fmt_ip_short "$ip") tg_edit "$chat_id" "$msg_id" "🏓 $lb\nРежим:" "$(kbd_ping_opts "$ip")" ;; po:*) local ip="${data#po:}"; local lb; lb=$(fmt_ip_short "$ip") - ( local ms; ms=$(ping -c 1 -W 3 "$ip" 2>/dev/null | grep -oP 'time=\K[\d.]+') + ( local ms; ms=$(ping -c 1 -W 3 "$ip" 2>/dev/null | sed -n 's/.*time=\([0-9.]*\).*/\1/p') [ -n "$ms" ] && tg_send "$chat_id" "🏓 $lb\n${ms} ms" "$(kbd_back)" > /dev/null \ || tg_send "$chat_id" "🏓 $lb\ntimeout" "$(kbd_back)" > /dev/null ) & ;; p10:*) local ip="${data#p10:}"; local lb; lb=$(fmt_ip_short "$ip") @@ -1210,7 +1212,7 @@ bot_handle_callback() { local mid; mid=$(echo "$resp" | jq -r '.result.message_id // empty') local -a res=(); local lost=0 txt="" for n in $(seq 1 10); do - local ms; ms=$(ping -c 1 -W 2 "$ip" 2>/dev/null | grep -oP 'time=\K[\d.]+') + local ms; ms=$(ping -c 1 -W 3 "$ip" 2>/dev/null | sed -n 's/.*time=\([0-9.]*\).*/\1/p') [ -n "$ms" ] && res+=("$ms") && txt+="#$n: ${ms}ms\n" || { ((lost++)); txt+="#$n: timeout\n"; } sleep 1 done @@ -1224,7 +1226,7 @@ bot_handle_callback() { local mid; mid=$(echo "$resp" | jq -r '.result.message_id // empty') local -a res=(); local lost=0 for n in $(seq 1 60); do - local ms; ms=$(ping -c 1 -W 2 "$ip" 2>/dev/null | grep -oP 'time=\K[\d.]+') + local ms; ms=$(ping -c 1 -W 3 "$ip" 2>/dev/null | sed -n 's/.*time=\([0-9.]*\).*/\1/p') [ -n "$ms" ] && res+=("$ms") || ((lost++)) if (( n % 10 == 0 )) && [ -n "$mid" ]; then local p="🏓 $lb: ${n}/60с\nОК: ${#res[@]} | Lost: $lost"