сценарий ping — хост отключен против хоста, не подключенного к сети

#shell #ksh #ping

#оболочка #кш #пинг

Вопрос:

У меня есть следующий сценарий, в котором я пытаюсь провести различие между сервером, который не работает, и сервером, которого больше нет в сети. Если я использую команду ping в командной строке на сервере, который только что отключен, и повторяю $? Я получаю 1, как и ожидалось. Если я использую команду ping в командной строке на сервере, которого больше нет в сети, и повторяю $? Я получаю 2, как и ожидалось. Кажется, я не могу зафиксировать это поведение в своем сценарии. В приведенном ниже сценарии сервер, которого больше нет в сети, вообще не отображается в выходном файле badhosts. Я использую значение dev null в строке ping, поскольку я не хочу получать неизвестные строки хоста на выходе, что приведет к искажению результатов.

Заранее благодарю за любую помощь.

 #!/bin/ksh
# Take a list of hostnames and ping them; write any failures
#set -x

for x in `cat hosts`
do
ping -q -c 1 $x > /dev/null 2> /dev/null

if [ "$?" -eq 1 ];then
        echo $x is on network but down >> badhosts
elif [ "$?" -eq 2 ];then
        echo $x is not on the network >> badhosts
  fi
done
 

Комментарии:

1. Для первого оператора if вы получаете $ ? 1 для оператора elif, и поэтому он никогда не равен 2. Вам было бы лучше установить переменную, равную возврату из команды ping, т.е. pingerr= $? а затем запустите операторы if против $pingerr

Ответ №1:

Я изменил свой скрипт по предложению Рамана следующим образом, и это работает. Спасибо Раману!!

 #!/bin/ksh
# Take a list of hostnames and ping them; write any failures
set -x

for x in `cat hosts`
do
ping -c 1 $x > /dev/null 2> /dev/null
pingerr=$?

if [ $pingerr -eq 1 ]; then
        echo $x is on network but down >> badhosts
fi

if [ $pingerr -eq 2 ]; then
        echo $x is not on the network >> badhosts
fi
done