https://www.doubao.com/chat/38419710769535234
在企业网络运维中,管理员经常面临大量重复性工作——比如批量检测网段在线主机、监控端口状态、统计网络流量、批量配置网络设备等。这些工作手动操作效率低、易出错,而Shell编程作为Linux系统自带的轻量工具,无需额外安装依赖,就能快速实现自动化运维,大幅提升网络管理效率。
本文聚焦企业网络管理的核心场景,提供4个高频实用的Shell脚本,每个脚本均包含完整代码、详细解析和实操步骤,新手也能直接复制复用,同时讲解脚本优化思路,助力运维人员打造贴合自身企业的自动化工具。
一、核心场景1:网段在线主机扫描(企业局域网必备)
企业局域网中,经常需要快速排查指定网段的在线主机,判断设备是否正常联网。传统ping命令逐个检测效率极低,使用fping工具结合Shell脚本,可实现批量扫描,适用于10.0.0.0/24、192.168.1.0/24等常用网段。
1.1 环境准备(依赖fping工具)
fping是高效批量ping工具,比系统自带ping更适合网段扫描,需先按系统类型安装:
# Ubuntu/Debian 系统 sudo apt update sudo apt install fping -y # Rocky Linux/CentOS/RHEL系统(需先启用EPEL仓库) sudo dnf install epel-release -y sudo dnf install fping -y # 验证安装成功 fping -v # 输出版本信息即表示安装成功
1.2 完整扫描脚本
#!/bin/bash # 脚本功能:批量扫描指定网段在线主机,输出在线IP及数量,自动清理临时文件 # 适用场景:企业局域网设备排查、网络连通性检测 # 作者:CSDN-运维小助手 # 日期:2026-04-02 # 定义可修改变量(根据企业网段调整) IP_FILE="temp_ip_list.txt" # 临时IP列表文件(自动删除) SUBNET_PREFIX="192.168.1" # 网段前缀,如192.168.1对应192.168.1.0/24网段 TIMEOUT=500 # 超时时间(毫秒),网络不稳定可改为1000 INTERVAL=1 # ping包发送间隔(毫秒) # 检查fping工具是否安装 if ! command -v fping &> /dev/null; then echo "错误:未安装fping工具,请先执行安装命令!" exit 1 fi # 生成指定网段IP列表(1-254) echo "=== 开始生成${SUBNET_PREFIX}.0/24网段IP列表 ===" for ((i=1; i<=254; i++)); do echo "${SUBNET_PREFIX}.$i" >> $IP_FILE done echo "IP列表生成完成,共254个IP(临时存储于$IP_FILE)" # 批量扫描在线主机 echo -e "\n=== 开始扫描在线主机(预计3-5秒) ===" # fping核心参数:-a只输出在线IP,-f读取IP列表,-i间隔,-t超时,2>/dev/null忽略错误提示 ONLINE_HOSTS=$(fping -a -f $IP_FILE -i $INTERVAL -t $TIMEOUT 2>/dev/null) # 输出扫描结果 echo -e "\n========================================" echo "${SUBNET_PREFIX}.0/24网段扫描结果:" if [ -z "$ONLINE_HOSTS" ]; then echo "未发现在线主机!可能原因:1.网段错误;2.网络禁止ICMP协议;3.无设备在线;4.缺少root权限" else HOST_COUNT=$(echo "$ONLINE_HOSTS" | wc -l) echo "共发现 $HOST_COUNT 台在线主机:" echo "$ONLINE_HOSTS" | nl -w2 -s'. ' # 带序号输出,便于查看 fi echo "========================================" # 清理临时文件,避免占用磁盘空间 rm -f $IP_FILE echo -e "\n临时文件已清理,扫描结束!" exit 0
1.3 脚本解析与实操
变量定义:将网段前缀、超时时间等设为变量,后续修改网段时无需改动核心代码,适配不同企业网络环境。
依赖检查:脚本开头判断fping是否安装,避免因缺少工具导致脚本执行失败,提升健壮性。
实操步骤:
复制脚本,保存为scan_online_hosts.sh;
修改SUBNET_PREFIX为企业实际网段(如10.0.0);
赋予执行权限:chmod +x scan_online_hosts.sh;
执行脚本:sudo ./scan_online_hosts.sh(建议root权限执行,避免ping权限不足)。
二、核心场景2:端口状态监控(保障服务可用性)
企业网络中,Web服务(80/443端口)、数据库(3306端口)、SSH(22端口)等核心服务的端口状态,直接影响业务正常运行。以下脚本提供两种监控方式,适配本地端口监听和远程端口连通性检测。
2.1 本地端口监听监控(ss命令,无需额外安装)
#!/bin/bash # 脚本功能:监控本地指定端口是否处于监听状态,支持批量端口监控 # 适用场景:本地服务器核心端口监控、服务存活检测 # 用法:./monitor_local_port.sh 80 443 22(后面跟需要监控的端口) # 检查是否传入端口参数 if [ $# -eq 0 ]; then echo "用法错误:请传入需要监控的端口,例如:./monitor_local_port.sh 80 443 22" exit 1 fi # 循环监控每个端口 echo "=== 本地端口监听状态监控结果($(date +"%Y-%m-%d %H:%M:%S")) ===" for port in "$@"; do # 验证端口格式是否合法(1-65535) if ! [[ $port =~ ^[1-9][0-9]{0,4}$ && $port -le 65535 ]]; then echo "警告:端口$port 格式非法,跳过监控!" continue fi # 使用ss命令检查端口监听状态,精确匹配端口 if ss -lnt "( sport = :$port )" | grep -q LISTEN; then echo "✅ 端口 $port:正在监听(服务正常)" else echo "❌ 端口 $port:未监听(服务可能异常)" # 可选:添加告警逻辑(如邮件、短信),示例: # echo "端口$port未监听,服务异常!" | mail -s "端口监控告警" admin@company.com fi done exit 0
2.2 远程端口连通性监控(telnet+timeout)
#!/bin/bash # 脚本功能:监控远程主机指定端口的连通性,支持批量IP+端口组合 # 适用场景:跨服务器端口监控、网络设备端口检测 # 用法:./monitor_remote_port.sh 192.168.1.100:80 192.168.1.101:3306 # 检查是否传入IP:端口参数 if [ $# -eq 0 ]; then echo "用法错误:请传入IP:端口组合,例如:./monitor_remote_port.sh 192.168.1.100:80" exit 1 fi # 检查telnet和timeout工具是否安装 if ! command -v telnet &> /dev/null; then echo "错误:未安装telnet工具,请先安装!" exit 1 fi if ! command -v timeout &> /dev/null; then echo "错误:系统缺少timeout命令,无法控制连接超时!" exit 1 fi # 循环监控每个IP+端口组合 echo "=== 远程端口连通性监控结果($(date +"%Y-%m-%d %H:%M:%S")) ===" TIMEOUT_TIME=5 # 连接超时时间(秒) for addr in "$@"; do # 拆分IP和端口(按冒号分割) ip=$(echo $addr | cut -d: -f1) port=$(echo $addr | cut -d: -f2) # 验证IP和端口格式 if ! [[ $port =~ ^[1-9][0-9]{0,4}$ && $port -le 65535 ]]; then echo "警告:$addr 端口格式非法,跳过监控!" continue fi # 用timeout控制telnet连接时间,避免卡死 if timeout $TIMEOUT_TIME telnet $ip $port </dev/null 2>&1 | grep -q "Connected"; then echo "✅ $ip:$port:端口开放(连通正常)" else echo "❌ $ip:$port:端口关闭或无法连通" fi done exit 0
三、核心场景3:网络流量实时监控(排查带宽异常)
企业网络带宽异常(如流量突增、恶意占用)会影响业务正常运行,通过Shell脚本读取/proc/net/dev文件(系统自带,无需额外工具),可实时统计指定网卡的收发流量,快速定位带宽占用问题。
3.1 完整流量监控脚本
#!/bin/bash # 脚本功能:实时监控指定网卡的收发流量,计算每秒速率,格式化输出 # 适用场景:服务器带宽监控、流量异常排查 # 用法:./monitor_network_traffic.sh eth0(eth0为需要监控的网卡名称) # 检查是否传入网卡参数 if [ $# -ne 1 ]; then echo "用法错误:请传入需要监控的网卡名称,例如:./monitor_network_traffic.sh eth0" echo "提示:执行 ip addr 可查看所有网卡名称" exit 1 fi INTERFACE=$1 # 检查网卡是否存在 if ! ip addr show $INTERFACE &> /dev/null; then echo "错误:网卡$INTERFACE 不存在,请检查网卡名称!" exit 1 fi # 读取初始流量数据(单位:字节) read_rx1 rx1 tx1 <<< $(cat /proc/net/dev | grep -w $INTERFACE | awk '{print $2, $10}') sleep 1 # 间隔1秒,计算每秒速率 read_rx2 rx2 tx2 <<< $(cat /proc/net/dev | grep -w $INTERFACE | awk '{print $2, $10}') # 计算每秒收发流量(字节转KB) rx_speed=$(( (rx2 - rx1) / 1024 )) tx_speed=$(( (tx2 - tx1) / 1024 )) # 格式化输出结果 echo "=== 网卡$INTERFACE 实时流量监控($(date +"%Y-%m-%d %H:%M:%S")) ===" echo "接收速率:${rx_speed} KB/s" echo "发送速率:${tx_speed} KB/s" echo "========================================" # 可选:添加流量阈值告警(如接收速率超过1000KB/s告警) THRESHOLD=1000 if [ $rx_speed -gt $THRESHOLD ]; then echo "⚠️ 警告:接收速率超过${THRESHOLD}KB/s,可能存在带宽异常!" # echo "网卡$INTERFACE流量异常,接收速率:${rx_speed}KB/s" | mail -s "流量告警" admin@company.com fi exit 0
3.2 脚本核心解析
/proc/net/dev文件是Linux系统存储网络接口流量数据的核心文件,每行对应一个网卡,其中第2列是接收字节数,第10列是发送字节数。脚本通过两次读取该文件的差值,除以时间间隔(1秒),得到每秒流量速率,无需依赖iftop等第三方工具,轻量高效。
四、核心场景4:批量配置网络设备(多设备运维)
企业拥有多台交换机、路由器时,批量配置SNMP、端口限速等功能,手动操作耗时费力。通过Shell脚本模拟telnet登录,可实现多设备批量配置,适用于Cisco、H3C等主流网络设备。
#!/bin/bash # 脚本功能:批量登录网络设备,执行指定配置(如添加SNMP社区),记录操作日志 # 适用场景:多台交换机、路由器批量配置 # 前提:1. Linux服务器安装telnet客户端;2. 准备设备IP清单文件 # 定义变量(根据企业设备信息修改) TELNET_PWD="admin" # 设备telnet登录密码 EN_PWD="admin@123" # 设备特权模式密码(如Cisco的enable密码) DEVICE_LIST="device_list.txt" # 设备IP清单文件(每行一个IP) LOG_FILE="batch_config.log" # 操作日志文件 CONFIG_CMD=( # 需要执行的配置命令(可按需添加) "configure terminal" "snmp-server community public ro" "snmp-server community private rw" "exit" "wr" # 保存配置(不同设备命令可能不同,如H3C为save) ) # 检查依赖和文件 if ! command -v telnet &> /dev/null; then echo "错误:未安装telnet客户端,请先安装!" exit 1 fi if [ ! -f $DEVICE_LIST ]; then echo "错误:设备清单文件$DEVICE_LIST 不存在,请创建!" exit 1 fi # 清空日志文件(可选,保留历史日志可删除此行) > $LOG_FILE # 循环处理每台设备 echo "=== 开始批量配置网络设备($(date +"%Y-%m-%d %H:%M:%S")) ===" | tee -a $LOG_FILE for ip in $(cat $DEVICE_LIST); do echo -e "\n=== 处理设备:$ip ===" | tee -a $LOG_FILE # 先检测设备是否在线 if ! ping -W2 -c2 $ip &> /dev/null; then echo "$ip:设备离线,跳过配置" | tee -a $LOG_FILE continue fi # 模拟telnet登录,执行配置命令 ( sleep 2; echo $TELNET_PWD # 输入telnet密码 sleep 2; echo "en" # 进入特权模式 sleep 2; echo $EN_PWD # 输入特权模式密码 # 循环执行配置命令 for cmd in "${CONFIG_CMD[@]}"; do sleep 2; echo $cmd done sleep 10; echo "exit" # 退出登录 ) | telnet $ip &> /dev/null # 检查配置是否成功 if [ $? -eq 0 ]; then echo "$ip:配置成功" | tee -a $LOG_FILE else echo "$ip:配置失败,请手动检查" | tee -a $LOG_FILE fi done echo -e "\n=== 批量配置完成,日志已保存至$LOG_FILE ===" | tee -a $LOG_FILE exit 0
五、Shell脚本优化技巧(企业级适配)
上述脚本可根据企业实际需求优化,提升稳定性和实用性,核心优化方向如下:
定时执行:结合crontab定时运行脚本,实现无人值守监控。例如,每天凌晨2点扫描网段,每5分钟监控端口状态:
# 编辑crontab配置crontab -e# 添加如下内容(路径替换为实际脚本路径)0 2 * * * /root/scripts/scan_online_hosts.sh*/5 * * * * /root/scripts/monitor_local_port.sh 80 443 22告警机制:添加邮件、短信告警(如使用mail命令、企业微信机器人),异常时及时通知管理员,避免故障扩大。
参数化优化:将脚本中的固定参数(如网段、密码、阈值)提取到配置文件中,后续修改无需改动脚本核心代码,降低维护成本。
日志完善:增加详细日志记录(如操作时间、执行结果、错误信息),便于后续故障排查和审计。
六、实战注意事项
权限问题:部分操作(如ping、telnet、修改网络配置)需要root权限,执行脚本时建议添加sudo。
设备兼容性:不同品牌网络设备(如Cisco、H3C)的命令存在差异,批量配置时需根据设备型号调整配置命令。
安全防护:脚本中若包含设备密码、敏感信息,建议设置脚本权限为700(chmod 700 脚本名),避免权限泄露。
测试验证:新脚本在企业环境中使用前,先在测试机或非核心设备上验证,避免误操作导致网络故障。
七、总结
Shell编程是企业网络运维的“轻量利器”,无需复杂的开发环境,仅通过简单的命令组合和逻辑编写,就能解决批量监控、设备配置等高频痛点,大幅提升运维效率,降低人工操作失误率。
本文提供的4个核心场景脚本,覆盖了企业网络管理的大部分基础需求,读者可根据自身企业的网络环境、设备型号,灵活修改脚本参数和命令,打造专属的自动化运维工具。
如果在使用过程中遇到问题,或有其他个性化需求(如流量统计可视化、更复杂的设备配置脚本),欢迎在评论区留言交流!
✨ 原创不易,收藏+关注,后续持续更新企业运维Shell实战脚本!