Команда Iptables для проверки существования правила в определенной строке

Баш
Здесь мы используем цикл whileдля приема аргументов из стандартного ввода и НЕ выполняем разделения, поскольку мы используем IFS=с read. Это позволяет сохранить всю строку с сопутствующими пробелами. И, наконец, мы echotimestampвместе с аргументами, которые теперь доступны через переменную $l. Следует иметь в виду, что все аргументы для echoдолжны быть заключены в кавычки для предсказуемого поведения кода.

echo 'foo     bar baz' | while IFS= read -r l; do echo "$(date +'%s')" "$l"; done

Перл

Опция

-nпредписывает Perlчитать строку файла -по строке -+ не печатать, если специально не попросят. Каждая прочитанная строка сохраняется в $_, что эквивалентно $0из awk. time()— это функция Perlbuiltin, дающая нам epochвремя. Затем мы помещаем время эпохи и текущую строку в ссылку на массив anonymous[...,... ]и возвращаем содержимое этого массива с помощью dereferencingit, @{... }Двойные кавычки "..."вокруг выражения @{...}гарантируют что элементы списка должны быть разделены пробелом. Затем мы их печатаем.

echo... |  perl -ne 'print "@{[+time,$_]}"'

IFS= read -r l <<<"$(echo 'foo    bar baz')"
printf '%d %s\n' "$(date +'%s')" "$l"
0
04.07.2019, 16:03
2 ответа

Мне очень интересно узнать, как можно использовать такую ​​проверку.

В любом случае вы можете использовать команду iptables -S, которая позволяет указать номер правила -.

Тогда это будет зависеть от того, где вам нужно использовать результат проверки.

Для примера вы могли бы, например, сделать:

iptables -S INPUT 1 | grep -ce '-j ACCEPT'

для получения 1, напечатанногоgrep -c(или 0, если совпадений нет ).

Или в оболочке тест может выглядеть так:

[ "$(iptables -S INPUT 1)" = '-A INPUT -j ACCEPT' ]

при условии, что вы точно знаете правило, которое хотите проверить. В противном случае вы можете использовать тест [[с оператором =~, если ваша оболочка их поддерживает, для поиска регулярного выражения, соответствующего этому номеру правила -.

0
28.01.2020, 03:30

Анализ вывода iptables -L --line-numbersне должен быть таким уж плохим:

num=3
if iptables -L foo --line-numbers | grep -qe "^$num "; then
    echo "rule exists at line #$num"
else
    echo "no rule at line #$num"
fi

Тем не менее, я не уверен, насколько это полезно, так как, например. удаление правил с начала цепочки изменяет номера других правил, поэтому они не работают как уникальные идентификаторы или что-то в этом роде. С тем же успехом вы могли бы взять количество правил в цепочке(iptables -L foo --line-numbers | sed -ne '$s/.*//p')и сравнить с ним.

В шутку можно было бежать iptables -D foo "$num". Жалуется, если по номеру $numнет правила, но, конечно, тоже деструктивно...

1
28.01.2020, 03:30

Теги

Похожие вопросы