28

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

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

ssh ipaddress "uname -a"

设置了无密码认证。如果我没有得到任何输出,我将生成一封邮件。

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

7 回答 7

53

您可以做的最简单的检查可能是用于netcat检查开放端口。

要检查 SSH(端口 22)的可达性,你可以这样做

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

从手册页:

-z   指定 nc 应该只扫描监听守护进程,而不向它们发送任何数据。

于 2015-12-18T14:53:54.347 回答
33

您的 ssh 命令将测试的不仅仅是服务器是否可访问 - 要使其工作,ssh 服务器必须正在运行,并且一切都必须通过身份验证正确。

要查看服务器是否已启动,只需简单的 ping 操作如何?

ping -c1 -W1 $ip_addr && echo 'server is up' || echo 'server is down'
于 2012-01-20T06:44:53.743 回答
11

您可以使用 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
于 2015-11-03T18:51:02.603 回答
7

更多思考:使用 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
于 2019-05-09T15:29:18.097 回答
5

您可以使用远程服务器ping -c4 $ip_address$ip_addressip 并解析输出以捕获成功的数据包和/或失败的数据包,并用于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-pageping. 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 盒子来帮助您。

于 2012-01-20T06:51:17.097 回答
5

您可以使用该nc -z -G 2 SERVER_HOST PORT方法 withG而不是WG在连接建立之前用于超时,所以如果主机不可达,你会更快地知道

于 2018-11-02T15:26:29.663 回答
0

您可以使用以下命令,

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

你不能使用 $ip_addr 因为它会删除你的 IP 的第一个数字。

于 2014-02-12T10:07:32.490 回答