用于检查服务器是否可访问的Shell脚本?

时间:2012-01-20 06:40:01

标签: bash shell solaris-10

我在不同的位置有5台Solaris服务器。 由于各种原因(由于网络问题或服务器本身突然停机),有时某些服务器无法从我的位置访问。

所以我想写一个Bash shell脚本来检查它们是否可以访问。我试过的是:

ssh ipaddress "uname -a"

设置密码减少身份验证。如果我没有得到任何输出,我将生成一封邮件。

  1. 还有其他方法可以检查服务器的可访问性吗?
  2. 哪一个是最好的方式?
  3. 我尝试过的是正确的吗?

6 个答案:

答案 0 :(得分:24)

您的ssh命令将测试的次数超过服务器是否可访问 - 为了使其正常工作,ssh服务器必须正在运行,并且一切都必须正确进行身份验证。

要查看服务器是否已启动,只需简单的ping即可?

ping -c1 -W1 $ip_addr && echo 'server is up' || echo 'server is down'

答案 1 :(得分:5)

您可以使用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

答案 2 :(得分:4)

您可以使用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。 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盒来帮助你。

答案 3 :(得分:0)

您可以使用以下命令,

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

你不能使用$ ip_addr,因为它会删除你的第一个IP号码。

答案 4 :(得分:0)

您可以将nc -z -G 2 SERVER_HOST PORTG一起使用W -> G方法,而不是在建立连接之前使用NaN进行超时,这样它的主机将无法访问,您会更快地知道

答案 5 :(得分:0)

更多值得深思的地方:使用nmap或nc,切勿ping通。

Ping::为什么不应该使用ping? (1)最好同时检查系统和端口。 (2)由于icmp回声在许多情况下被阻止,因此ping不可靠。

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用户(主要是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