пинг 192.168.0.1 | awk '{print $ 1}' [дубликат]

SELinux - это функция безопасности операционной системы. Она предназначена для защиты одних частей сервера от других.

Например, если вы используете веб-сервер и имеете "уязвимый" код, который позволяет злоумышленнику выполнять произвольные команды, SELinux может помочь смягчить это, предотвращая доступ веб-сервера к файлам, которые ему не разрешено видеть.

Теперь вы можете отключить SELinux, и это ничего не нарушит. Сервер будет продолжать работать как обычно.

Но вы отключите одну из функций безопасности.

3
30.09.2018, 06:17
3 ответа

Это может помочь определить и зафиксировать все, с чем вы хотите работать, как переменную:

  1. $CMD_PING-Команду, которую вы хотите оценить (как переменную, проще выполнить и зафиксировать желаемые результаты)
  2. $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"
0
27.01.2020, 21:30

Если вы используете 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, мы удаляем бит перед первым :перед его печатью.

1
27.01.2020, 21:30

Единственный способ, которым ваша идея могла бы сработать, - это обмен выводом ошибки (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
0
27.01.2020, 21:30

Теги

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