Сценарий оболочки для проверки доступности сервера?
У меня есть 5 серверов Solaris в разных местах. Иногда некоторые из этих серверов недоступны из моего местоположения по разным причинам (либо из-за проблем с сетью, либо из-за внезапной остановки самого сервера).
Поэтому я хотел бы написать сценарий оболочки Bash, чтобы проверить, достижимы ли они. Что я пробовал это:
ssh ipaddress "uname -a"
Установлена аутентификация без пароля. Если я ничего не получу, я сгенерирую письмо.
- Есть ли другие способы проверить доступность сервера?
- Какой из них лучший?
- Что я пытался исправить?
Ответы
Ответ 1
Вы можете использовать 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
Я проверил man-page
Solaris для ping
. Выход из ping
в поле Solaris отличается. Кроме того, в Linux вы ограничиваете пакеты, указывая -c
и количество пакетов. На Solaris вам нужно будет сделать -
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]
^ ^
| |
---------------------------------------
К сожалению, у меня нет коробки солярия, которая поможет вам справиться.
Ответ 2
Ваша команда ssh будет тестироваться больше, чем если бы сервер был доступен - для его работы сервер ssh должен быть запущен, и все должно быть прав с помощью проверки подлинности.
Чтобы узнать, не подняты ли серверы, как насчет простого пинга?
ping -c1 -W1 $ip_addr && echo 'server is up' || echo 'server is down'
Ответ 3
Самый простой способ проверить, что вы можете сделать, это, вероятно, использовать netcat
для проверки открытых портов.
чтобы проверить доступность SSH (порт 22), вы можете сделать
if nc -z $server 22 2>/dev/null; then
echo "$server ✓"
else
echo "$server ✗"
fi
с manpage:
-z
Указывает, что nc должен просто сканировать для прослушивания демонов, не отправляя им никаких данных.
Ответ 4
Вы можете использовать эти параметры на странице ping man:
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
Ответ 5
Еще немного пищи для размышлений: используйте 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
Ответ 6
Вы можете использовать подход nc -z -G 2 SERVER_HOST PORT
с G
вместо W
. G
используется для тайм-аута до установления соединения, поэтому, если хост недоступен, вы будете знать быстрее
Ответ 7
Вы можете использовать команду ниже,
ping -c1 -W1 ip_addr || echo 'server is down'
вы не можете использовать $ ip_addr, поскольку он удалит первый номер вашего IP-адреса.