Сценарий Bash: фиксация ошибок в блоке операторов

У меня есть большой iptables ruleset, что я справляюсь со своим собственным сценарием удара. Большинство команд в сценарии является простыми, единственными-statment командами iptables. Я пытаюсь улучшить сценарий путем добавления вывода успеха/отказа, поскольку сценарий выполняется.

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

#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 и сохранить их в массиве или чем-то. Затем в конце блока, используйте если оператор для оценки массива, чтобы видеть, были ли любые ошибки. В противном случае произведите состояние [OK], если было, производило состояние [FAILED] и отображает связанную ошибку.

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

4
задан 19 July 2011 в 21:54

3 ответа

Вы могли использовать trap окружите встроенную команду, чтобы назвать функцию-обработчик, если команда имеет ненулевой статус выхода. Можно передать необходимую информацию, как номер строки и статус выхода к функции обработчика ошибок.

Пример:

#!/bin/bash

handle_error() {
    echo "FAILED: line $1, exit code $2"
    exit 1
}

trap 'handle_error $LINENO $?' ERR 

# your commands here
# ...

echo "OK"
11
ответ дан 1 December 2019 в 09:01

Ниже сценария определит recordfailure функция, которая должна предварительно ожидаться к командам как показано в примере после функционального определения. Если ненулевые возвраты команды, поток стандартной погрешности зарегистрирован. Наконец, на конце, журнал ошибок проверяется и [OK] или [FAIL] печатается соответственно.

#!/bin/bash

# Redirect file descriptor #3 to standard output (used in recordfailure)
exec 3>&1

# create an array for holding failures
declare -a failures

# recordfailure command arg1 arg2 ... argN
recordfailure() {
    local error retval
    # Run the command and store error messages (output to the standard error
    # stream in $error, but send regular output to file descriptor 3 which
    # redirects to standard output
    error="$("$@" 2>&1 >&3)"
    retval=$?
    # if the command failed (returned a non-zero exit code)
    if [ $retval -gt 0 ]; then
        if [ -z "$error" ]; then
            # create an error message if there was none
            error="Command failed with exit code $retval"
        fi
        # uncomment if you want the command in the error message
        #error="Command $* failed: $error"

        # append the error to $failures, ${#failures[@]} is the length of
        # the array and since array start at index 0, a new item is created
        failures[${#failures[@]}]="$error"
        # uncomment if you want to show the error immediately
        #echo "$error"
    fi
}
recordfailure iptables -A FORWARD ...
recordfailure iptables -A FORWARD ...
# if the length of the failures array equals 0 (no items) everything is OK
if [ ${#failures[@]} -eq 0 ]; then
    echo "[OK]"
else
    echo "[FAIL]"
    # list every error
    for failure in "${failures[@]}"; do
        # optionally color it, format it or whatever you want to do with it
        echo "error: $failure"
    done
fi

Если Вы не имеете никакого требования показа стандартного вывода, удаляете exec 3>&1 и замена >&3 >/dev/null.

0
ответ дан 1 December 2019 в 09:01

Вы имеете в виду что-то вроде этого?

ok=1

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

#rule 1
/sbin/iptables -A FOWRARD... || ok=0

#rule 2 
/sbin/iptables -A FORWARD... || ok=0

echo -ne "\t\t\t"
if [ $ok -eq 1 ]; then
  echo "[OK]"
else
  echo "[fail]"
fi
-1
ответ дан 1 December 2019 в 09:01

Другие вопросы по тегам:

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