Bal*_*man 15 bash shell solaris-10
我在不同的位置有5个Solaris服务器.由于各种原因(由于网络问题或服务器本身突然停机),有时某些服务器无法从我的位置访问.
所以我想写一个Bash shell脚本来检查它们是否可以访问.我试过的是:
ssh ipaddress "uname -a"
Run Code Online (Sandbox Code Playgroud)
设置了无密码验证.如果我没有得到任何输出,我将生成一封邮件.
fly*_*eep 28
您可以做的最准确的检查可能是用于netcat检查开放端口.
要检查SSH(端口22)是否可达,您可以这样做
if nc -z $server 22 2>/dev/null; then
echo "$server ?"
else
echo "$server ?"
fi
Run Code Online (Sandbox Code Playgroud)
从联机帮助页:
-z指定nc应该只扫描侦听守护进程,而不向它们发送任何数据.
gcb*_*son 26
您的ssh命令将测试的次数超过服务器是否可访问 - 为了使其工作,ssh服务器必须正在运行,并且一切都必须正确进行身份验证.
要查看服务器是否已启动,如何进行简单的ping操作?
ping -c1 -W1 $ip_addr && echo 'server is up' || echo 'server is down'
Run Code Online (Sandbox Code Playgroud)
您可以使用ping -c4 $ip_addresswhere $ip_address是远程服务器的ip并分析输出以捕获成功的数据包和/或失败的数据包,并用于mail -s通过电子邮件发送日志。
这是使您入门的基础,您可以在此基础上继续进行。
ping -c4 www.google.com | awk '/---/,0'
Run Code Online (Sandbox Code Playgroud)
这将给出这样的输出-
[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
Run Code Online (Sandbox Code Playgroud)
我检查了Solaris man-page的ping。pingSolaris框上的输出是不同的。另外,在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]
^ ^
| |
---------------------------------------
Run Code Online (Sandbox Code Playgroud)
不幸的是,我没有手提包来帮助您。
您可以在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
Run Code Online (Sandbox Code Playgroud)
哪里
0 means host reachable
>0 means unreachable
Run Code Online (Sandbox Code Playgroud)
因此,要在bash脚本中测试它,您可以执行以下操作:
ping -c1 -W1 -q $server &>/dev/null
status=$( echo $? )
if [[ $status == 0 ]] ; then
#Connection success!
else
#Connection failure
fi
Run Code Online (Sandbox Code Playgroud)
一些更多的思考:使用 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
Run Code Online (Sandbox Code Playgroud)
Nc: nc 通常已经安装,但是在某些系统(例如 Mac OS X)上,该命令在无法访问的系统上挂起。(见解决方法)
nc -v -z -w 3 127.0.0.1 22 &> /dev/null && echo "Online" || echo "Offline"
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
(示例说明通过一个好的和坏的主机示例连接到端口 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
55813 次 |
| 最近记录: |