bash-скриптинг: отлов ошибок из блока операторов - PullRequest
4 голосов
/ 19 июля 2011

У меня есть большой набор правил iptables, которым я управляю с помощью своего собственного скрипта bash. Большинство команд в скрипте являются простыми командами iptables с одним статусом. Я пытаюсь улучшить сценарий, добавляя вывод об успешном / неудачном выполнении сценария.

У меня сценарий разбит на несколько разделов. Одним из примеров может быть раздел цепочки FORWARD, где все правила применяются к цепочке FORWARD. В начале раздела я вывожу, что скрипт начал применять правила FORWARD, и в конце я хочу вывести, были ли все правила применены успешно, или если какое-либо из них не работало. Вот основная идея:

#Start FORWARD section
echo -ne "Applying FORWARD rules..."

#rule 1
/sbin/iptables -A FOWRARD...

#rule 2
/sbin/iptables -A FORWARD...

echo -ne "\t\t\t[OK]\n"

То, что я хочу сделать, это перехватить любые выходные данные или ошибки, которые могут возникнуть в результате каждой команды iptables, и сохранить их в массиве или что-то в этом роде. Затем в конце блока используйте оператор if, чтобы оценить массив и выяснить, не было ли ошибок. Если нет, выведите статус [OK], если он был, выведите статус [FAILED] и отобразите соответствующую ошибку.

Есть ли способ, которым я могу сделать это для всего блока правил, не заключая каждое правило iptables в if [$? ! = 0] выражение?

1 Ответ

2 голосов
/ 20 июля 2011

Как насчет либо опции set -e (выход при первом сбое), либо:

#rule 1
/sbin/iptables -A FORWARD ... &&

#rule 2
/sbin/iptables -A FORWARD ... &&

echo "[OK]"

Если каждая команда идентифицирует ошибки, вы не увидите ОК, если все не работает.

Если вам приходится иметь дело с непокорными процессами, которые имеют ненулевые, но успешные статусы выхода, то вы встраиваете такие команды в вложенную оболочку, которая решает проблему:

#rule 1
/sbin/iptables -A FORWARD ... &&

#rule 2
/sbin/iptables -A FORWARD ... &&

# Unusual process - finagle-it returns status 17 on success
(
/usr/local/sbin/finagle-it ...
if [ $? = 17 ]; then exit 0; else exit 1; fi
) &&

echo "[OK]"

Обратите внимание, что set -eдолжно быть отменено при запуске finagle-it внутри вложенной оболочки.

...