SELinux - это функция безопасности операционной системы. Она предназначена для защиты одних частей сервера от других.
Например, если вы используете веб-сервер и имеете "уязвимый" код, который позволяет злоумышленнику выполнять произвольные команды, SELinux может помочь смягчить это, предотвращая доступ веб-сервера к файлам, которые ему не разрешено видеть.
Теперь вы можете отключить SELinux, и это ничего не нарушит. Сервер будет продолжать работать как обычно.
Но вы отключите одну из функций безопасности.
Это может помочь определить и зафиксировать все, с чем вы хотите работать, как переменную:
$CMD_PING
-Команду, которую вы хотите оценить (как переменную, проще выполнить и зафиксировать желаемые результаты)$CODE_EXIT
-Код выхода, возвращаемый при оценке $CMD_PING
(, будет отличаться от 0
, если произошла ошибка)Пример:
#!/bin/bash
CMD_PING="ping -c1 does-not-exist"
EXEC_PING="$( $CMD_PING >/dev/null 2>&1 )" # STDOUT and STDERR go to /dev/null
CODE_EXIT="$?"
if [ ! 0 -eq "$CODE_EXIT" ]; then
# echo error only (or capture error for parsing)
# capture example: EXEC_PING="$( $CMD_PING >/dev/null )"
$CMD_PING >/dev/null # STDOUT goes to /dev/null, only STDERR prints
exit 1
fi
echo "success"
Если вы используете ping
только для определения доступности заданного имени хоста или нет, вы можете сделать это:
if ping -c 1 "$otherhost" >/dev/null 2>&1; then
printf 'The host "%s" is reachable\n' "$otherhost"
else
printf 'The host "%s" is not reachable\n' "$otherhost"
fi
Это отправляет один пакет ECHO_REQUEST
на хост, указанный в "$otherhost"
, и использует статус выхода ping
, чтобы определить, удалось ли утилите выполнить свою задачу или нет. Весь обычный вывод из ping
отбрасывается.
Обратите внимание, что если ping
не удается запросить другой хост, это не означает, что хост определенно не работает или не поддается маршрутизации. Возможно, просто игнорируется пакет ECHO_REQUEST
.
Если вы хотите вывести фактическую ошибку, вызванную ping
при сбое, вы можете сделать это следующим образом, чтобы избежать двойного вызова утилиты (, поскольку сетевые ошибки иногда бывают временными, второй вызов ping
может не дать сбоя или может дать сбой по-другому):
pingerr=$(mktemp)
if ping -c 1 "$otherhost" >/dev/null 2>"$pingerr"; then
printf 'The host "%s" is reachable\n' "$otherhost"
else
printf 'The host "%s" is not reachable\n' "$otherhost"
if [ -s "$pingerr" ]; then
echo 'ping error:'
cat "$pingerr"
fi
fi
rm -f "$pingerr"
При этом все диагностические сообщения из ping
сохраняются во временном файле, который позже выводится, если ping
дает сбой (, если в нем вообще что-то есть, что и проверяет тест -s
для ). Файл всегда будет создаваться (, даже если он остается пустым ), поэтому мы удаляем его после оператора if
-.
Используя этот метод, вы также можете анализировать файл вывода ошибок любым удобным для вас способом. Например:
pingerr=$(mktemp)
if ping -c 1 "$otherhost" >/dev/null 2>"$pingerr"; then
printf 'The host "%s" is reachable\n' "$otherhost"
else
printf 'The host "%s" is not reachable\n' "$otherhost"
if [ -s "$pingerr" ]; then
printf 'ping says'
sed 's/^[^:]*//' <"$pingerr"
fi
fi
rm -f "$pingerr"
Здесь вместо того, чтобы просто вывести исходное сообщение из ping
, мы удаляем бит перед первым :
перед его печатью.
Единственный способ, которым ваша идея могла бы сработать, - это обмен выводом ошибки (stderr )с stdout для отправки значений ошибки в awk (с использованием несуществующего -адреса):
$ ping -c4 invalid.local. 3>&2 2>&1 1>&3 | awk '{print "Error ==> " $0}'
Error ==> ping: unknown host
Но статус выхода станет выходом из awk, который обычно должен быть успешным (0 ).
Если все, что вам нужно, это получить сообщение об ошибке и действовать в соответствии со статусом завершения ping, вы можете использовать:
$ ping -c4 invalid.local. 2>&1 1>&- ; echo $?
ping: unknown host
1
$ ping -c4 127.0.0.1 2>&1 1>&- ; echo $?
0
Итак, проверка может быть:
if ping -c3 -w5 domain.com 2>&1 1>&- ; then
echo "ping was successful"
else
echo "ping failed with code $?"
fi