Сценарий оболочки для проверки доступности сервера? - PullRequest
14 голосов
/ 20 января 2012

У меня есть 5 серверов Solaris в разных местах.Иногда некоторые из этих серверов недоступны из моего местоположения по разным причинам (либо из-за сетевых проблем, либо из-за внезапной остановки самого сервера).

Поэтому я хотел бы написать сценарий оболочки Bash, чтобы проверить, недостижимы.Я попробовал:

ssh ipaddress "uname -a"

Установлена ​​аутентификация без пароля.Если я ничего не получу, я сгенерирую письмо.

  1. Есть ли другие способы проверить доступность сервера?
  2. Какой из них лучший?
  3. Что я пытался исправить?

Ответы [ 7 ]

24 голосов
/ 20 января 2012

Ваша команда ssh будет проверять больше, чем если бы сервер был доступен - чтобы он работал, сервер ssh должен быть запущен, и все должно быть в порядке с аутентификацией.

Чтобы просто увидеть, если серверыкак насчет простого пинга?

ping -c1 -W1 $ip_addr && echo 'server is up' || echo 'server is down'
23 голосов
/ 18 декабря 2015

Самая простая проверка, которую вы можете сделать, это, вероятно, использовать netcat для проверки открытых портов.

для проверки доступности SSH (порт 22), вы можете сделать

if nc -z $server 22 2>/dev/null; then
    echo "$server ✓"
else
    echo "$server ✗"
fi

из справочной страницы:

-z Указывает, что nc должен просто сканировать прослушивающие демоны, не отправляя им никаких данных.

6 голосов
/ 03 ноября 2015

Вы можете использовать эти параметры на странице руководства ping:

  • отправлять только один пакет ("c1"),
  • тихий режим ("q"),
  • (необязательно) Подождите 1 секунду для ответа ("W1")

    ping -c1 -W1 -q $server

Ping возвращает различные коды выхода в зависимости оттип ошибки.Итак, чтобы проверить, сработало ли это или нет, просто сделайте "echo $?"чтобы получить код выхода.Например:

ping 256.256.256.256 ; echo $?
# 68

ping -c 1 127.0.0.1 ; echo $?
# 0

ping -c 1 192.168.1.5 ; echo $?
# 2

Где

0 means host reachable
>0 means unreachable

Итак, чтобы проверить это в скрипте bash, вы можете сделать что-то вроде:

ping -c1 -W1 -q $server &>/dev/null
status=$( echo $? )
if [[ $status == 0 ]] ; then
     #Connection success!
else
     #Connection failure
fi
4 голосов
/ 20 января 2012

Вы можете использовать ping -c4 $ip_address, где $ip_address - это IP-адрес вашего удаленного сервера, анализировать выходные данные для захвата успешных пакетов и / или неудачных пакетов и использовать mail -s для отправки журнала по электронной почте.

Вот кое-что, с чего можно начать, и вы можете на этом основываться

ping -c4 www.google.com | awk '/---/,0'

Это даст такой вывод -

[jaypal:~/Temp] ping -c4 www.google.com | awk '/---/,0'
--- www.l.google.com ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 36.638/36.870/37.159/0.196 ms

Я проверил Solaris man-page на ping. Вывод из ping на коробке Solaris отличается. Кроме того, в Linux вы ограничиваете пакеты, указывая -c и количество пакетов. На Солярисе вам придется сделать -

ping -s www.google.com 2 4

/usr/sbin/ping -s [-l | -U] [-adlLnrRv] [-A addr_family]
[-c traffic_class] [-g gateway [ -g gateway...]] [-
F flow_label] [-I interval] [-i interface] [-P tos] [-
p port] [-t ttl] host [data_size] [npackets]
                           ^           ^
                           |           |
---------------------------------------  

К сожалению, у меня нет под рукой соляриса, чтобы помочь вам.

0 голосов
/ 09 мая 2019

Еще немного пищи для размышлений: используйте nmap или nc, никогда не пингуйте.

Пинг: Почему бы вам не использовать пинг? (1) Лучше проверять систему и порт одновременно. (2) Пинг ненадежен, так как эхо-сигнал icmp блокируется во многих ситуациях.

Nmap: Это очень быстро, очень надежно, но требует установки nmap Предпочтительный метод NMAP (ex host ip 127.0.0.1):

nmap 127.0.0.1 -PN -p ssh | grep open

Nc: nc обычно уже установлен, однако в некоторых системах, таких как Mac OS X, команда зависает в недоступных системах. (см. Решение)

nc -v -z -w 3 127.0.0.1 22 &> /dev/null && echo "Online" || echo "Offline"

Временное решение для Mac OSX:

bash -c '(sleep 3; kill $$) & exec nc -z 127.0.0.1 22' &> /dev/null
echo $?
0
bash -c '(sleep 3; kill $$) & exec nc -z 1.2.3.4 22' &> /dev/null
echo $?
143

(примеры иллюстрируют подключение к порту 22 ssh через пример хорошего и плохого хоста, используйте $? Для определения, достиг ли он хоста со временем ожидания 3 секунды)

Для пользователей Mac (в основном) и т. Д. Вы можете использовать команду в сценарии следующим образом:

    # -- use NMAP, if not avail. go with nc --
    if command -v nmap | grep -iq nmap ; then
        nmap ${ip} -PN -p ${ssh_port} | grep -iq "open"
        res=$?
    elif command -v nc | grep -iq nc ; then
        # -- run command if fails to complete in 3 secs assume host unreachable --
        ( nc -z ${ip} ${ssh_port} ) & pid=$!
        ( sleep 3 && kill -HUP $pid ) 2>/dev/null & watcher=$!
        if wait $pid 2>/dev/null; then
            pkill -HUP -P $watcher
            wait $watcher
            # -- command finished (we have connection) --
            res=0
        else
            # -- command failed (no connection) --
            res=1
        fi
    else
        echo "Error: You must have NC or NMAP installed"
    fi

    if [[ ${res} -lt 1 ]] ;then
        success=1
        echo "testing  => $ip SUCCESS connection over port ${ssh_port}"
        break;
    else
        echo "testing => $ip FAILED connection over port ${ssh_port}"
    fi
0 голосов
/ 02 ноября 2018

Вы можете использовать nc -z -G 2 SERVER_HOST PORT подход с G вместо W -> G, который используется для тайм-аута до установления соединения, поэтому хост недоступен, вы будете знать быстрее

0 голосов
/ 12 февраля 2014

Вы можете использовать приведенную ниже команду:

ping -c1 -W1 ip_addr || echo 'server is down'  

вы не можете использовать $ ip_addr, так как он удалит первый номер вашего IP.

...