1、检测两台服务器指定目录下的文件一致性
dir=/data/web
# 定义远程服务器的IP(B机)
b_ip=192.168.72.128
# 1. 在本地服务器执行:遍历dir目录下的所有文件,生成每个文件的MD5值,保存到本地临时文件
md5_a.txt find $dir -type f | xargs md5sum > /tmp/md5_a.txt
# 2. 通过SSH远程在B机执行:遍历B机相同目录下的所有文件,生成MD5值,保存到B机的临时文件md5_b.txt
ssh $b_ip "find $dir -type f | xargs md5sum > /tmp/md5_b.txt"
# 3. 读取本地md5_a.txt中的所有MD5值,循环逐一对比(awk '{print $2}':提取md5_a.txt中的MD5值字段)
awk '{print $2}' /tmp/md5_a.txt | while read f do
# 3.1 检查当前MD5值是否存在于B机的md5_b.txt中
if grep -q "$f" /tmp/md5_b.txt; then
# 3.2 若存在:分别提取本地和B机中该MD5值对应的文件名
md5_a=$(grep "$f" /tmp/md5_a.txt | awk '{print $1}')
# 本地文件的路径
md5_b=$(grep "$f" /tmp/md5_b.txt | awk '{print $1}')
# B机文件的路径 # 3.3 对比本地与B机的文件名是否一致(判断文件内容是否相同)
if [ "$md5_a" != "$md5_b" ]; then
echo "文件内容不一致:$f" # 提示MD5相同但文件名(路径)不匹配
验证结果
2、定时清空文件内容,定时记录文件大小
# 定义日志文件路径:格式为“/tmp/小时-日期.log”(例如/tmp/14-2025-12-28.log) logfile=/tmp/`date +%H-%F`.log
# 获取当前小时(例如“00”“12”“14”)
n=`date +%H`
# 判断当前是否为0点(00)或12点(12)
if [ $n -eq 00 ] || [ $n -eq 12 ]
then
# 若为0点/12点:清空/data/log/目录下的所有文件
for i in `find /data/log/ -type f` # 遍历/data/log/下的所有普通文件
true > $i # 用true命令清空文件
# 若不是0点/12点:统计/data/log/目录下所有文件的大小,追加到日志文件
for i in `find /data/log/ -type f` # 遍历/data/log/下的所有普通文件
du -sh $i >> $logfile # 统计文件大小(-s:仅显示总和;-h:人类可读格式),并追加到logfile
验证结果
3、检测网卡流量,并按规定格式记录在日志中
#设置语言为英文,保障输出结果是英文,否则会出现bug
LANG=en
logfile=/tmp/`date +%d`.log
#将下面执行的命令结果输出重定向到logfile日志中
exec >> $logfile
date +"%F %H:%M"
#sar命令统计的流量单位为kb/s,日志格式为bps,因此要*1000*8
sar -n DEV 1 3|grep Average|grep ens33|awk '{print $2,"\t","input:","\t",$5*1000*8,"bps","\n",$2,"\t","output:","\t",$6*1000*8,"bps"}'
echo "####################"
#因为执行sar命令需要59秒,因此不需要sleep
验证结果
4、计算文档每行出现的数字个数,并计算整个文档的数字总数
#使用awk只输出文档行数(截取第一段)
n=`wc -l a.txt|awk '{print $1}'`
sum=0
#文档中每一行可能存在空格,因此不能直接用文档内容进行遍历
for i in `seq 1 $n`
do
#输出的行用变量表示时,需要用双引号
line=`sed -n "$i"p a.txt`
#wc -L选项,统计最长行的长度
n_n=`echo $line|sed s'/[^0-9]//'g|wc -L`
echo $n_n
sum=$[$sum+$n_n]
done
echo "sum:$sum"
验证结果
注:如果没有a.txt 需要自己手动配
5、监测 Nginx 访问日志 502 情况,并做相应动作
假设服务器环境为 lnmp,近期访问经常出现 502 现象,
且 502 错误在重启 php-fpm 服务后消失,因此需要编写监控脚本,
一旦出现 502,则自动重启 php-fpm 服务。
log="/data/log/access.log"
N=30 # 定义阈值
# 查看日志的最新300条,并统计502的次数(修复变量赋值语法)
err=$(tail -n 300 $log | grep -c " 502 ")
# 数值比较
if [ "$err" -ge "$N" ]; then
# 模拟重启
echo "【验证成功】检测到502错误数:$err,触发php-fpm重启(模拟)"
# /etc/init.d/php-fpm restart 2> /dev/null
# 设定60s延迟防止脚本bug导致无限重启php-fpm服务
sleep 60
验证结果
6、扫描主机端口状态
# 接收外部传入的主机IP(执行脚本时需传入,例如:./脚本名 192.168.1.1)
HOST=$1
# 定义需要扫描的端口列表(多个端口用空格分隔)
PORT="22 25 80 8080"
# 循环遍历每个端口,逐一检测状态 for PORT in $PORT; do
# 核心检测逻辑:通过/dev/tcp(Bash内置的TCP通信接口)尝试连接目标端口
# &>/dev/null:将连接的输出和错误都重定向到空(静默检测)
if echo &>/dev/null > /dev/tcp/$HOST/$PORT; then echo "$PORT open" # 连接成功,输出“端口开放”
else echo "$PORT close" # 连接失败,输出“端口关闭”
验证结果
7创建10个用户,并分别设置密码,密码要求10位且包含大小写字母以及数字,
最后需要把每个用户的密码存在指定文件中。
# 生成10个用户(00-09)
for u in $(seq -w 0 09); do
username="user_$u"
# 1. 创建用户(如果不存在)
if ! id "$username" &> /dev/null; then
useradd "$username"
echo "已创建用户:$username"
else
echo "用户 $username 已存在,跳过创建"
fi
# 2. 生成10位密码(-l 10:长度10;-s 0:无特殊字符;-d 2:至少2个数字;-C 2:至少2个大写;-c 2:至少2个小写)
password=$(openssl rand -base64 12 | tr -dc 'A-Za-z0-9' | head -c 10)
# 3. 安全设置用户密码(用chpasswd避免交互)
echo "$username:$password" | chpasswd
echo "已设置用户 $username 的密码"
# 4. 保存用户和密码到文件
echo "$username $password" >> /tmp/userpassword
done
echo "操作完成!用户密码已保存到:/tmp/userpassword"
验证结果
8、批量修改服务器用户密码
Linux主机SSH连接信息:旧密码
# 定义旧密码文件路径(存储远程服务器的IP、用户名、旧密码、端口) OLD_INFO=old_pass.txt
# 定义新密码文件路径(保存修改后的新密码信息)
NEW_INFO=new_pass.txt
# 循环读取旧密码文件中的IP
for IP in $(awk '/^[^#]/{print $1}' $OLD_INFO); do
# 从旧密码文件中提取当前IP对应的用户名
USER=$(awk -v I=$IP 'I==$1{print $2}' $OLD_INFO)
# 从旧密码文件中提取当前IP对应的旧密码
PASS=$(awk -v I=$IP 'I==$1{print $3}' $OLD_INFO)
# 从旧密码文件中提取当前IP对应的SSH端口
PORT=$(awk -v I=$IP 'I==$1{print $4}' $OLD_INFO)
# 生成8位随机密码(仅包含大小写字母和数字)
# openssl rand:生成随机字符串;tr -dc:过滤非字母数字字符;head -c 8:截取8位 NEW_PASS=$(openssl rand -base64 10 | tr -dc 'A-Za-z0-9' | head -c 8)
# 将新密码信息(IP、用户名、新密码、端口)追加到新密码文件
echo "$IP $USER $NEW_PASS $PORT" >> $NEW_INFO
# 使用expect实现SSH自动交互,修改远程用户密码
expect -c " set timeout 2 # 设置连接超时时间为2秒
spawn ssh -p $PORT $USER@$IP # 启动SSH连接(指定端口和用户)
expect { # 若出现yes/no(首次连接),自动发送yes并继续 \"(yes/no)\" {send \"yes\r\";exp_continue} # 若出现password:,自动发送旧密码并继续 \"password:\" {send \"$PASS\r\";exp_continue} # 若成功登录(出现$USER@提示符),自动执行修改密码命令后退出 \"$USER@\" {send \"echo '$NEW_PASS' | passwd --stdin $USER\r exit\r\";exp_continue} } "
验证结果
9、查看CPU资源占用率的脚本文件#!/bin/bash
# 定义一个函数来显示CPU占用率
show_cpu() {
# 使用top命令获取CPU占用率信息,并只显示第一行(包含CPU占用率的部分)
top -bn1 | grep "Cpu(s)"
}
# 调用函数显示CPU占用率
show_cpu
#另一个
#!/bin/bash
# 定义一个函数来显示指定时间间隔的平均CPU占用率
show_cpu_avg() {
interval=$1
mpstat -P ALL $interval 1 | tail -n +3
}
# 调用函数显示过去5秒的平均CPU占用率
show_cpu_avg 5
~
验证结果
10、生成磁盘使用情况的
# 定义日志文件的路径和名称
LOG_FILE="/tmp/2.log"
# 使用df命令获取磁盘使用情况,并格式化输出
DISK_USAGE=$(df -h)
# 将磁盘使用情况追加到日志文件中
echo "$(date '+%Y-%m-%d %H:%M:%S') - Disk Usage:" >> "$LOG_FILE"
echo "$DISK_USAGE" >> "$LOG_FILE"
echo "--------------------------------------------------------" >> "$LOG_FILE"
echo "$(date '+%Y-%m-%d %H:%M:%S') - Disk Usage:"
echo "$DISK_USAGE"
# 完成提示
echo "你的磁盘使用情况被记录到 $LOG_FILE"
验证结果