一、自动化脚本里最常见的巡检维度

原笔记把脚本里常用的检查分成几类:

  • 端口:判断端口是否监听、是否能连通
  • 进程:判断服务进程是否存在、是否异常
  • 网络:判断主机连通性、流量和 DNS 解析
  • Web/API:判断 HTTP 请求是否正常
  • 系统全能:用综合工具观察系统状态

Shell 自动化之所以离不开这些命令,是因为很多巡检脚本本质上就是:

1、采集一组系统信息 2、用判断逻辑分析结果 3、输出可读结论或触发告警

二、端口检查通常分两步

原笔记对端口检查的拆分非常清晰:

2.1 先看端口是否存在

也就是确认本机有没有进程在监听指定端口,常用命令包括:

ss -lntup | grep 80
netstat -lntup | grep 80
lsof -i:80

其中:

  • ss:现代 Linux 上更常用
  • netstat:历史上更常见
  • lsof -i:80:从“占用文件/端口的进程”视角看问题

2.2 再看端口能不能访问

监听存在,并不代表一定能从网络上连通。原笔记列出的工具有:

telnet host port
nc -w 1 -z host port
nmap -p 80 host

最常用于自动化脚本的是 ncnmap,因为它们更容易做非交互式判断。

三、除了端口,还要掌握哪些基础巡检命令

3.1 进程检查

原笔记建议重点掌握:

  • ps
  • top
  • iotop

这些命令分别适合:

  • 看进程是否存在
  • 看 CPU 占用和系统整体运行态势
  • 看 IO 压力是否异常

3.2 网络检查

原笔记提到:

  • ping:检查基础连通性
  • iftop:看网络流量
  • dig:看 DNS 解析

其中 ping 的两个常用参数值得记住:

ping -c 2 -W 1 192.168.1.20
  • -c:发送次数
  • -W:等待超时时间

3.3 Web 和 API 检查

Web 层最常见的检查工具是:

  • curl
  • wget

原笔记还专门点了 curl 常用参数:

  • -v:显示详细交互信息
  • -L:跟随跳转
  • -H:自定义请求头
  • -I:只取响应头
  • -w:按格式输出
  • -o:把内容输出到文件
  • -s:静默模式

3.4 系统级综合观察

原笔记推荐了 atop

yum install atop -y
systemctl enable atop
systemctl start atop
atop

它适合做更综合的系统分析,尤其是在需要同时看 CPU、内存、磁盘和进程行为的时候。

四、实战:检查指定主机端口是否可访问

原笔记给出的综合案例,是用 Shell 脚本检查目标地址的端口是否可用:

#!/bin/bash
url=$1
port=$2

. /etc/init.d/functions

[ $# -ne 2 ] && {
    action "请输入url 端口" /bin/false
    exit 1
}

[[ $port =~ ^[0-9]+$ ]] || {
    action "请输入有效的端口" /bin/false
    exit 2
}

port_count=$(nmap -p $port $url | grep -wc open)
if [ $port_count -eq 1 ]; then
    action "$url $port 是通畅的" /bin/true
else
    action "$url $port 是不通畅的" /bin/false
fi

这个脚本的关键点在于:

  • 先检查参数个数
  • 再检查端口格式
  • 再用工具做实际连通性验证
  • 最后输出统一结果

这已经是一个很典型的巡检脚本骨架。

五、非交互式端口测试还可以怎么做

原笔记还补充了 telnetnc 的用法。

5.1 telnet 的非交互检查方式

echo q | telnet -e q 192.168.1.20 22
echo $?

如果返回值为 0,通常说明连接成功。

5.2 用 nc 直接写进判断

if nc -w 1 -z $dst $port; then
    action "地址:$dst 端口:$port is ok" /bin/true
else
    action "地址:$dst 端口:$port is failed" /bin/false
fi

在很多现代环境里,nc 会比 telnet 更适合脚本化使用。

六、实战:检查指定 URL 是否正常

原笔记第二个案例,是对 URL 进行健康检查:

#!/bin/bash
url=$1

check_url() {
    [[ $url =~ ^[0-9a-zA-Z./:]+$ ]] || {
        echo "请输入有效的URL地址"
        exit 1
    }
}

url_status() {
    status_code=$(curl -s -I $url | awk 'NR==1{print $2}')
    [ -z "$status_code" ] && {
        echo "$url 请求失败"
        exit 2
    }

    if [ $status_code -lt 400 ]; then
        echo "URL正常"
    else
        echo "$url 请求失败"
    fi
}

main() {
    check_url
    url_status
}

main

这个脚本背后的思路非常值得复用:

  • 用正则先做格式校验
  • curl -I 取响应头
  • 用状态码判断请求是否成功

七、wget 也是 URL 检查的备用方案

原笔记同时给出了 wget 的无输出探测方式:

wget -q --spider www.baidu.com
echo $?

这里的返回值也能直接拿来做判断:

  • 0:请求成功
  • 0:请求失败

当环境里没有 curl 或你希望更轻量地做“站点能否访问”的判断时,这种写法很实用。

八、写巡检脚本时最推荐的套路

把原笔记的巡检案例合并起来,可以总结成下面这套固定流程:

1、接参数。 2、校验参数格式。 3、调用系统命令采集状态。 4、用判断逻辑得出结论。 5、输出成功/失败结果。

无论你是在写端口检测、接口探活,还是服务上线前的预检脚本,基本都可以沿用这套结构。