Добавил: Amro   Дата: 10.04.2026 10:28

Небольшой скрипт который позволяет искать часть ip в ipset списках.

# Поиск всех IP с префиксом 185.191.117
./ipset-search.sh -ip 185.191.117.

# Точный поиск IP
./ipset-search.sh -ip 185.191.117.42

# Поиск по двум октетам
./ipset-search.sh -ip 185.191.

#!/! /bin/bash

show_help() {
    cat << EOF
Использование: $0 [ОПЦИИ]

Опции:
  -ip <шаблон>  Шаблон поиска IP (поддерживает: 185.12.*, 185.12.65.*, 185.12.65.12)
  -h, --help   Показать эту справку

Примеры:
  $0 -ip 185.12.*
  $0 -ip 185.12.65.*
  $0 -ip 185.12.65.12

Шаблоны:
  * - любая часть IP (один октет)
  полный IP - точное совпадение
EOF
}

SEARCH_PATTERN=""

while [[ $# -gt 0 ]]; do
    case $1 in
        -ip)
            SEARCH_PATTERN="$2"
            shift 2
            ;;
        -h|--help)
            show_help
            exit 0
            ;;
        *)
            echo "Неизвестный параметр: $1"
            show_help
            exit 1
            ;;
    esac
done

if [[ -z "$SEARCH_PATTERN" ]]; then
    echo "Ошибка: не указан параметр -ip"
    show_help
    exit 1
fi

# Нормализуем шаблон
SEARCH_PATTERN=$(echo "$SEARCH_PATTERN" | sed 's/\.$//')

echo "Поиск по шаблону '$SEARCH_PATTERN' во всех наборах ipset..."
echo "=============================================================="

SETS=$(ipset list -n 2>/dev/null)

if [[ $? -ne 0 ]] || [[ -z "$SETS" ]]; then
    echo "Ошибка при получении списка наборов ipset."
    exit 1
fi

FOUND_COUNT=0

for SET_NAME in $SETS; do
    [[ -z "$SET_NAME" ]] && continue

    echo "Проверяем набор: $SET_NAME"

    SET_OUTPUT=$(ipset list "$SET_NAME" 2>/dev/null)
    if [[ -z "$SET_OUTPUT" ]]; then
        echo "  → Ошибка: не удалось получить содержимое набора"
        continue
    fi

    # Создаём точное регулярное выражение
    REGEX_PATTERN=$(echo "$SEARCH_PATTERN" | \
        sed 's/\./\\./g')  # экранируем точки

    # Обрабатываем звёздочки в шаблоне
    if [[ "$SEARCH_PATTERN" == *".*"* ]]; then
        # Если есть звёздочка, заменяем её на [0-9]{1,3} и добавляем границы слова
        REGEX_PATTERN=$(echo "$REGEX_PATTERN" | sed 's/\\*/[0-9]{1,3}/g')
        REGEX_PATTERN="\\b$REGEX_PATTERN"
    else
        # Для точного IP добавляем границы слова
        REGEX_PATTERN="\\b$REGEX_PATTERN\\b"
    fi

    MATCHES=$(echo "$SET_OUTPUT" | grep -E "$REGEX_PATTERN")

    if [[ -n "$MATCHES" ]]; then
        echo "  → Найденные записи:"
        echo "$MATCHES" | sed 's/^/    /'
        FOUND_COUNT=$((FOUND_COUNT + $(echo "$MATCHES" | wc -l)))
    else
        echo "  → Совпадений не найдено"
    fi
    echo "---"
done

echo "Поиск завершён. Найдено записей: $FOUND_COUNT"

 

comments powered by HyperComments