我有 5 台 Solaris 服务器分布在不同的位置。有时,由于各种原因(由于网络问题或服务器本身突然停机),从我的位置无法访问其中一些服务器。
所以我想写一个 Bash shell 脚本来检查它们是否可以访问。我尝试过的是:
ssh ipaddress "uname -a"
设置了无密码认证。如果我没有得到任何输出,我将生成一封邮件。
- 有没有其他方法可以检查服务器的可达性?
- 哪一个是最好的方法?
- 我尝试过的正确吗?
我有 5 台 Solaris 服务器分布在不同的位置。有时,由于各种原因(由于网络问题或服务器本身突然停机),从我的位置无法访问其中一些服务器。
所以我想写一个 Bash shell 脚本来检查它们是否可以访问。我尝试过的是:
ssh ipaddress "uname -a"
设置了无密码认证。如果我没有得到任何输出,我将生成一封邮件。
您可以做的最简单的检查可能是用于netcat
检查开放端口。
要检查 SSH(端口 22)的可达性,你可以这样做
if nc -z $server 22 2>/dev/null; then
echo "$server ✓"
else
echo "$server ✗"
fi
从手册页:
-z
指定 nc 应该只扫描监听守护进程,而不向它们发送任何数据。
您的 ssh 命令将测试的不仅仅是服务器是否可访问 - 要使其工作,ssh 服务器必须正在运行,并且一切都必须通过身份验证正确。
要查看服务器是否已启动,只需简单的 ping 操作如何?
ping -c1 -W1 $ip_addr && echo 'server is up' || echo 'server is down'
您可以使用 ping 手册页中的这些选项:
(可选)等待 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
更多思考:使用 nmap 或 nc,永远不要 ping。
Ping:为什么你不应该使用 ping ?(1) 最好同时检查系统和端口。(2) Ping 不可靠,因为 icmp echo 在很多情况下都被阻塞了。
Nmap:这非常快速,非常可靠,但需要安装 nmap 首选方法 NMAP(例如主机 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
您可以使用远程服务器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
我检查了 Solarisman-page
的ping
. Solaris 机器上的输出ping
不同。此外,在 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]
^ ^
| |
---------------------------------------
不幸的是,我没有方便的 solaris 盒子来帮助您。
您可以使用该nc -z -G 2 SERVER_HOST PORT
方法 withG
而不是W
。G
在连接建立之前用于超时,所以如果主机不可达,你会更快地知道
您可以使用以下命令,
ping -c1 -W1 ip_addr || echo 'server is down'
你不能使用 $ip_addr 因为它会删除你的 IP 的第一个数字。