LINUX.ORG.RU
ФорумAdmin

Нужна ваша помощь с bash

 ,


1

2

Есть кусок кода который должен проверять наличие blacklist в ipset и если его там нет он должен его создать. Код грепает ipset но блеклист не создает. Не могу понять как заставить его работать? Прошу вашей помощи.

ipset -L blacklist | grep 'ipset v6.12.1: The set with the given name does not exist'
if [ $? -ne "1" ];
        then
        ipset -N blacklist iphash
fi

Заранее очень благодарен.



Последнее исправление: beastie (всего исправлений: 1)

да, и не давай так много текста грепу, не нужно это. Не говоря уже про версию. У тебя это будет работать до первого апдейта ipset. Искать 'does not exist' будет достаточно.

targitaj ★★★★★
()
Последнее исправление: targitaj (всего исправлений: 3)
Ответ на: комментарий от zolden

я так понимаю ipset -N blacklist iphash будет в любом случае выполнятся? тогда зачем грепать на наличие его отсутствия?

ceroz
() автор топика

K.I.S.S.

ipset -L blacklist | grep -q 'ipset v6.12.1' && ipset -N blacklist iphash

PS: можно завернуть и в if, если очень хочется:

if ipset -L blacklist | grep -q 'ipset v6.12.1'; then
    ipset -N blacklist iphash
fi

beastie ★★★★★
()
Ответ на: комментарий от ceroz
#!/bin/bash

PATTERN="does not exist"
STATUS=`ipset -L blacklist 2>&1 | grep "$PATTERN" | grep -v grep`

#echo "pattern $PATTERN"
#echo "status $STATUS"
if [ -n "$STATUS" ]
then
	echo "There is no blacklist set"
fi
exit
targitaj ★★★★★
()
Ответ на: комментарий от ceroz

Я никогда не использовал ipset, так что без понятия

zolden ★★★★★
()
Ответ на: комментарий от targitaj

Нашел решение. сменил 1 на 0 сейчас все отрабатывает. Всем откликнувшимся большое спасибо за помощь.

ceroz
() автор топика

Строка 'ipset v6.12.1: The set with the given name does not exist' на stderr направлена, поэтому на grep не попадпет.
Исправь ipset -L blacklist 2>&1 все остальное верно

anc ★★★★★
()
Ответ на: комментарий от targitaj

Во первых это бы может быть имело смысл, если бы ты парзил выхлоп ps.

Во вторых и для ps это не надо, т.к. есть кошерный pgrep.

Ну и в третих, в данном конкретном случае, grep на сообщение ошибки совсем не нужен, достаточно exit status.

beastie ★★★★★
()
Ответ на: комментарий от beastie

выхлоп ps.

а, тьфу, это я загнался. Конечно, оно там не нужно. Я просто достал пример из своих рабочих скриптов, а там как раз ps было. Точно.

targitaj ★★★★★
()
Ответ на: комментарий от beastie

Ну и в третих, в данном конкретном случае, grep на сообщение ошибки совсем не нужен, достаточно exit status.

ммм... Наверное. Я предпочитаю не полагаться на сторонние exit коды. Мало ли... Ищи потом почему не работает. Наверное, это паранойя.

есть кошерный pgrep

Не поверишь - не знал про него. Вообще.

targitaj ★★★★★
()
Ответ на: комментарий от targitaj

Не поверишь - не знал про него. Вообще.

Век живи, век учись. ;) Это нормально.

Тогда ещё в копилку: pkill

Это всяко лучше, сам сравни:

ps aux | grep xterm | grep -v grep | awk '{print $2}' | xargs kill

vs.

pkill xterm
beastie ★★★★★
()
Ответ на: комментарий от targitaj

Тем, что killall есть только lnx, pkill же везде.

beastie ★★★★★
()

а вообще можно тупо делать «ipset -N blacklist iphash >/dev/zero 2>&1»

более культурные вариант

«ipset -n -L | grep -q blacklist || ipset -N blacklist iphash»

«ipset -n -L» сделан специально для вывода только имен наборов. Работает даже с ipset < 6.0

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.