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

Bal*_*man 15 bash shell solaris-10

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

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

ssh ipaddress "uname -a"
Run Code Online (Sandbox Code Playgroud)

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

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

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应该只扫描侦听守护进程,而不向它们发送任何数据.

  • 我建议在脚本中使用-w <seconds>作为超时.否则nc可能会在某些情况下永远挂起. (2认同)
  • 在我的macOS系统上,当服务器不可访问时,`nc -z $ server`无限期挂起,添加`-w 2`没什么区别。我认为-w标志用于终止已建立的连接,并且不会影响-z标志。因此,使用nc来检测无法访问的服务器似乎无济于事-因为它只能挂起一分钟左右-我希望在几秒钟后会消失的东西。 (2认同)
  • 编辑之前的评论:在我的 macOS 系统上,当服务器无法访问时,“nc -z $server 443”会无限期挂起,添加“-w 2”没有任何区别。这是使用内置 nc 的情况。我使用 Mac Ports 安装 gnetcat ...并且如果服务器无法访问,“gnetcat -z -w 2 $server 443”会在 2 秒后超时。 (2认同)

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)


jay*_*ngh 6

您可以使用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-pagepingpingSolaris框上的输出是不同的。另外,在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)

不幸的是,我没有手提包来帮助您。


Kat*_*tie 6

您可以在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
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)


Mik*_*e Q 6

一些更多的思考:使用 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)


Ivo*_*nov 5

您可以使用nc -z -G 2 SERVER_HOST PORT的方法有G代替WG用于在连接建立之前超时,因此如果主机无法访问,您会更快地知道