Shell脚本编程是Linux运维工程师的必备技能,它能将重复性工作自动化,大幅提升效率。本文将通过一个综合实战项目,带领你从零开始编写一个集网络扫描、系统监控和FTP自动上传于一体的Linux监控脚本,并实现定时任务,让你真正掌握Shell脚本编程的核心技巧。即使你是小白,只要跟着步骤操作,也能轻松完成!
我们将开发一个名为 auto_ops.sh 的脚本,它实现以下三大功能:
在开始编写Shell脚本编程之前,请确保你的Linux系统(如CentOS/Ubuntu)已安装以下工具:
# Ubuntu/Debiansudo apt-get install nmap ftp -y# CentOS/RHELsudo yum install nmap ftp -y
如果你希望使用更强大的FTP客户端,可以安装lftp,但本文使用标准的ftp命令以保证通用性。
我们将使用nmap工具实现网络扫描脚本。以下脚本扫描192.168.1.0/24网段,找出存活主机,并进一步扫描常见端口(22,80,443,3306)。
#!/bin/bash# 网络扫描脚本 (scan.sh)NETWORK="192.168.1.0/24"OUTPUT_FILE="scan_result_$(date +%Y%m%d).txt"echo "开始扫描网络 $NETWORK ..." | tee $OUTPUT_FILE# 使用nmap -sn进行ping扫描发现存活主机nmap -sn $NETWORK | grep "Nmap scan report" | awk "{print $5}" > alive_hosts.txtecho "存活主机列表:" | tee -a $OUTPUT_FILEcat alive_hosts.txt | tee -a $OUTPUT_FILE# 对每个存活主机进行端口扫描for host in $(cat alive_hosts.txt); do echo "扫描主机 $host 的开放端口..." | tee -a $OUTPUT_FILE nmap -p 22,80,443,3306 $host | grep -E "^[0-9]" | tee -a $OUTPUT_FILEdoneecho "网络扫描完成,结果保存在 $OUTPUT_FILE" 将上述脚本保存为scan.sh,并赋予执行权限:chmod +x scan.sh。执行后即可生成扫描报告。
接下来开发Linux监控脚本,实时获取系统负载。我们设定阈值:CPU>80%,内存>90%,磁盘>90%时报警。
#!/bin/bash# 系统监控脚本 (monitor.sh)LOG_FILE="monitor_$(date +%Y%m%d).log"THRESHOLD_CPU=80THRESHOLD_MEM=90THRESHOLD_DISK=90# 获取CPU使用率(取空闲值的补数)CPU_IDLE=$(top -bn1 | grep "Cpu(s)" | awk "{print $8}" | cut -d"%" -f1)CPU_USAGE=$(echo "100 - $CPU_IDLE" | bc)# 获取内存使用率MEM_TOTAL=$(free -m | awk "/^Mem:/{print $2}")MEM_USED=$(free -m | awk "/^Mem:/{print $3}")MEM_USAGE=$(echo "scale=2; $MEM_USED * 100 / $MEM_TOTAL" | bc)# 获取磁盘使用率(根分区)DISK_USAGE=$(df -h / | awk "NR==2 {print $5}" | cut -d"%" -f1)echo "===== $(date) 系统监控报告 =====" | tee -a $LOG_FILEecho "CPU使用率: $CPU_USAGE%" | tee -a $LOG_FILEecho "内存使用率: $MEM_USAGE%" | tee -a $LOG_FILEecho "磁盘使用率: $DISK_USAGE%" | tee -a $LOG_FILE# 阈值判断if (( $(echo "$CPU_USAGE > $THRESHOLD_CPU" | bc -l) )); then echo "警告:CPU使用率超过阈值 $THRESHOLD_CPU%!" | tee -a $LOG_FILEfiif (( $(echo "$MEM_USAGE > $THRESHOLD_MEM" | bc -l) )); then echo "警告:内存使用率超过阈值 $THRESHOLD_MEM%!" | tee -a $LOG_FILEfiif [ $DISK_USAGE -gt $THRESHOLD_DISK ]; then echo "警告:磁盘使用率超过阈值 $THRESHOLD_DISK%!" | tee -a $LOG_FILEfi 此脚本使用了bc进行浮点数比较,若未安装请执行sudo apt-get install bc。保存为monitor.sh并赋予执行权限。
最后,实现FTP自动上传功能,将生成的扫描结果和监控日志上传到远程FTP服务器。假设FTP服务器地址为192.168.1.100,用户名为uploader,密码为pass123。
#!/bin/bash# FTP上传脚本 (ftp_upload.sh)FTP_SERVER="192.168.1.100"FTP_USER="uploader"FTP_PASS="pass123"REMOTE_DIR="/backup"LOCAL_FILES="scan_result_.txt monitor_.log"echo "开始上传文件到FTP服务器..."ftp -n $FTP_SERVER <注意:
ftp命令的自动化脚本通过here document实现,避免交互输入。保存为ftp_upload.sh并赋予执行权限。4. 整合脚本:一键执行所有任务
为了便于使用,我们创建一个主脚本
auto_ops.sh,依次调用上述三个模块,并加入简单的日志记录。#!/bin/bash# 主控脚本 auto_ops.shBASE_DIR=$(cd "$(dirname "$0")"; pwd)LOG_DIR="$BASE_DIR/logs"mkdir -p $LOG_DIRcd $LOG_DIRecho "[$(date)] 开始执行自动化运维脚本" >> run.log# 执行网络扫描$BASE_DIR/scan.sh# 执行系统监控$BASE_DIR/monitor.sh# 执行FTP上传$BASE_DIR/ftp_upload.shecho "[$(date)] 所有任务执行完毕" >> run.log将所有脚本放在同一目录,执行
chmod +x auto_ops.sh,然后运行./auto_ops.sh即可完成扫描、监控和上传的完整流程。5. 设置定时任务(cron)实现自动化
要让Linux监控脚本和网络扫描脚本定期执行,可以借助cron。执行
crontab -e,添加以下行:# 每天凌晨2点执行扫描和监控,并上传结果0 2 * * * /home/user/scripts/auto_ops.sh >/dev/null 2>&1这样,每天凌晨2点脚本会自动运行,所有报告都会上传到FTP服务器,你可以随时查看历史数据。
6. 总结与扩展
通过本项目,你亲手编写了一个实用的Shell脚本编程综合工具,涵盖了网络扫描脚本、Linux监控脚本和FTP自动上传。你可以在此基础上扩展更多功能,例如:
- 增加邮件报警功能(使用
sendmail)。- 将监控数据可视化(通过Web展示)。
- 支持多台服务器的分布式监控。
- 使用FTP自动上传加密传输(如SFTP)。
希望本文能帮助你深入理解Shell脚本编程,并将这些技能应用到实际工作中。如果你有任何问题,欢迎在评论区留言交流!
本文关键词:Shell脚本编程、Linux监控脚本、FTP自动上传、网络扫描脚本
本文由主机测评网于2026-03-11发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20260330505.html