нужно запустить команду в Linux и найти результат по grep - PullRequest
0 голосов
/ 25 октября 2019

Я использую брандмауэр csf для своего сервера ... поэтому мне нужно запустить csf -g 10.10.10.10, чтобы проверить, разрешен ли ip или нет ... Я использую скрипт bash для запуска команды ... но csf -g 10.10.10.10 вернуть 0 , если совпадения найдены или не найдены ... поэтому мне нужно проверить результат команды, если они содержат DENYIN для найдено и " совпадений не найдено "для false .

Я использовал grep , но точно не знаю, как его использовать ... что-то вроде этого:

csf -g 10.10.10.10 && echo === $? ===  || echo $? | grep "No matches found"

пожалуйста, дайте мне знать об этом. если у вас есть лучшее решение, пожалуйста, дайте мне знать

выполненная команда return:

csf -g 10.10.10.10

Table  Chain            num   pkts bytes target     prot opt in     out     source               destination
No matches found for 10.10.10.10 in iptables


ip6tables:

Table  Chain            num   pkts bytes target     prot opt in     out     source               destination
No matches found for 10.10.10.10 in ip6tables

10.10.10.10 и 20.20.20.20, например, не в реальном мире

csf -g 20.20.20.20

Table  Chain            num   pkts bytes target     prot opt in     out     source               destination

filter DENYIN           181   6586  395K DROP       all  --  !lo    * 
20.20.20.20        0.0.0.0/0

filter DENYOUT          181      0     0 LOGDROPOUT  all  --  *      !lo     0.0.0.0/0            20.20.20.20


ip6tables:

Table  Chain            num   pkts bytes target     prot opt in     out     source               destination No matches found for
20.20.20.20 in ip6tables

csf.deny: 20.20.20.20 # lfd: (smtpauth) Failed SMTP AUTH login from
20.20.20.20 -------: 5 in the last 3600 secs - Thu Oct 24 20:33:07 2019

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

Вы должны просто отфильтровать стандартный вывод и проверить, есть ли результат.

Попробуйте:

    csf -g 10.10.10.10 | grep DENYIN && echo "Found" || echo "No matches found"

Небольшое объяснение:

Есть 4 части:

1) ваша команда: csf -g ....

2) команда grep проверит наличие конкретной строки в выводе

3) && запустит команду echo, если grep обнаружит строку (выход 0)

4) ||запустит команду echo, когда grep не найдет строку

** Проверено: **


bash-4.4$ cat testData 
Table  Chain            num   pkts bytes target     prot opt in     out     source               destination

filter DENYIN           181   6586  395K DROP       all  --  !lo    * 
20.20.20.20        0.0.0.0/0

filter DENYOUT          181      0     0 LOGDROPOUT  all  --  *      !lo     0.0.0.0/0            20.20.20.20



bash-4.4$ cat testData  | grep -q DENYIN && echo "Found" || echo "No matches found"
Found

1 голос
/ 25 октября 2019

Если вывод выглядит следующим образом:

$ csf -g 192.168.138.1
Chain            num   pkts bytes target     prot opt in     out     source               destination
No matches found for 192.168.138.1 in iptables

Вы можете выполнить команду «Нет совпадений для 192.168.138.1» и использовать вместо нее состояние выхода grep:

if csf -g 192.168.138.1 | grep -q "No matches found"; then
    echo "error"
else
    echo "ok"
fi

Или еще короче:

csf -g 192.168.138.1 | grep -o "No matches found" || echo "Found"
...