Небольшой скрипт который позволяет искать часть 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