
在日常运维工作中,shell脚本被誉为运维领域的利器。伴随着人工智能大模型的飞速进步,其智能编程能力使得脚本的功能得到了显著提升。然而,即便是大模型编写的脚本,也必须经过经验丰富的运维工程师的严格审查,以保证脚本的安全性、稳定性和兼容性。在此,我分享10个实用的shell脚本案例,旨在帮助大家在工作中巧妙运用,提高运维效率。
1、检测两台服务器制定目录下的文件一致性
#!/bin/bash
严禁对特定内容进行篡改,确保信息的准确性与真实性,维护知识体系的完整性。
检测两台服务器指定目录下的文件一致性
严禁对特定内容进行篡改,确保信息的准确无误,维护知识的纯洁性。
#通过对比两台服务器上文件的md5值,达到检测一致性的目的
dir=/data/web
b_ip=192.168.88.10
对指定目录内的所有文件进行逐一检索,并将这些文件名作为md5sum指令的输入参数,通过这种方式计算出每个文件的MD5校验码,然后将这些校验码记录到指定的文件里。
在指定目录中查找所有文件类型为文件的项,并将这些文件通过管道传递给md5sum命令,最后将生成的MD5校验和输出到临时文件/tmp/md5_a.txt中。
执行命令ssh连接至$b_ip,然后使用find命令在$dir目录下查找所有文件类型为f的文件,通过xargs命令传递给md5sum进行MD5值计算,最后将结果输出到/tmp目录下的md5_b.txt文件中。
scp $b_ip:/tmp/md5_b.txt /tmp
#将文件名作为遍历对象进行一一比对
在执行过程中,需遍历由`awk`命令生成的包含数字2的行,这些行是从`/tmp/md5_a.txt`文件中筛选出来的。
do
以a设备为基准,若b设备在遍历目标文件集合时未发现相关文件,则应立即展示“文件不存在”的输出信息。
若在/tmp/md5_b.txt文件中通过grep命令搜索不区分大小写地查找文件名$f,且不输出任何内容。
then
执行grep命令,筛选出包含文件名$f的行,然后通过awk命令输出每一行,最终得到md5_a的值。
执行grep命令,筛选出包含文件名$f的行,然后通过awk命令输出每一行,结果赋值给变量md5_b。
#当文件存在时,如果md5值不一致则输出文件改变的结果
if [ $md5_a != $md5_b ]
then
echo "$f changed."
fi
else
echo "$f deleted."
fi
done
2、定义一个颜色输出字符串函数
#方法1:
function echo_color() {
if [ $1 == "green" ]; then
echo -e "[32;40m$2[0m"
elif [ $1 == "red" ]; then
echo -e "[31;40m$2[0m"
fi
}
#方法2:
function echo_color() {
case $1 in
green)
echo -e "[32;40m$2[0m"
;;
red)
echo -e "[31;40m$2[0m"
;;
*)
执行命令:显示“示例:echo_color 红色 字符串”
esac
}
#使用方法:echo_color green "test"
关键字定义一个函数,可加或不加。
3、从 FTP 服务器下载文件
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: $0 filename"
fi
dir=$(dirname $1)
file=$(basename $1)
ftp -n -v << EOF # -n 自动登录
open 192.168.1.10 # ftp服务器
user admin password
binary # 设置ftp传输模式为二进制,避免MD5值不同或.tar.gz压缩包格式错误
cd $dir
get "$file"
EOF
4、检查软件包是否安装
#!/bin/bash
若执行rpm -q sysstat命令后无输出显示至终端,则
系统状态工具已成功安装,当前已部署。
else
系统提示:“sysstat尚未安装!”
fi
5、检查服务状态
#!/bin/bash
PORT_C 是通过执行命令 `ss -anu` 并使用 `grep -c 123` 进行筛选,得到的匹配项数量。
PS_C是通过执行命令`ps -ef`筛选出所有进程,然后使用`grep ntpd`进一步过滤出与`ntpd`相关的进程,最后通过`grep -vc grep`排除掉自身进程,从而得到的结果。
若$PORT_C的值等于0,或者$PS_C的值同样等于0,则。
输出“内容”至邮件命令,指定“主题”作为邮件标题,并发送至dst@example.com邮箱地址。
fi
6、检查主机存活状态
方法1:将错误IP放到数组里面判断是否ping失败三次
#!/bin/bash
IP地址列表包括192.168.18.1、192.168.1.1以及192.168.18.2。
for IP in $IP_LIST; do
NUM=1
while [ $NUM -le 3 ]; do
若执行ping命令,仅发送一次数据包至指定IP地址,且结果不显示任何信息;
执行IPping操作后,结果显示成功。
break
else
执行命令显示:“IP地址的Ping操作未能成功,失败次数为$NUM次。”
FAIL_COUNT[$NUM]=$IP
let NUM++
fi
done
若${#FAIL_COUNT[*]}的值等于3,则;
显示 "${FAIL_COUNT[1]}" 的Ping操作未能成功!
unset FAIL_COUNT[*]
fi
done
方法2:将错误次数放到变量里面判断是否ping失败三次
#!/bin/bash
IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2"
for IP in $IP_LIST; do
FAIL_COUNT=0
for ((i=1;i<=3;i++)); do
if ping -c 1 $IP >/dev/null; then
执行了IP地址的ping操作,结果显示连接成功。
break
else
执行IPping操作时,发现第$i次尝试未能成功,提示失败信息。
let FAIL_COUNT++
fi
done
若失败次数达到3次,则
echo "$IP Ping is failure!"
fi
done
采用for循环机制,一旦检测到ping操作成功,便立即终止循环;若未能中断循环,则表明ping操作未能成功。
#!/bin/bash
ping_success_status() {
若执行ping命令,参数-c设置为1,针对IP地址进行操作,且将输出重定向至空设备文件/dev/null,则:
echo "$IP Ping is successful."
continue
fi
}
IP_LIST="192.168.18.1 192.168.1.1 192.168.18.2"
for IP in $IP_LIST; do
ping_success_status
ping_success_status
ping_success_status
echo "$IP Ping is failure!"
done
7、监控CPU、内存和硬盘利用率
1)CPU
借助 工具来分析CPU统计信息。
#!/bin/bash
DATE=$(date +%F" "%H:%M)
获取IP地址的命令如下:通过ifconfig命令获取eth0接口的信息,然后使用awk命令对结果进行分割处理,以冒号和空格为分隔符,筛选出inet addr字段,并打印出第四个字段的内容,此命令仅适用于CentOS6系统。
MAIL="example@mail.com"
若未成功调用vmstat命令,则不执行。
执行“vmstat”命令时未找到,请确保已安装procps软件包。
exit 1
fi
执行vmstat命令后,通过awk工具筛选出第三行,并提取出第13个字段,最终将此值赋给变量US。
执行命令`vmstat`后,通过`awk`命令筛选出第三行,并提取该行的第十四个字段,将其赋值给变量`SY`。
获取IDLE值的过程如下:首先执行vmstat命令,然后通过awk命令筛选出第三行,最后打印出该行的第15个字段。
执行vmstat命令后,通过awk命令筛选出第三行,并提取第16个字段,然后将该字段的值赋给变量WAIT。
USE=$(($US+$SY))
if [ $USE -ge 50 ]; then
echo "
Date: $DATE
Host: $IP
Problem: CPU utilization $USE
使用命令行工具,以“CPU Monitor”为主题,向指定邮箱发送邮件,命令格式为:mail -s "CPU Monitor" $MAIL
fi
2)内存
#!/bin/bash
DATE=$(date +%F" "%H:%M)
获取IP地址的操作如下:首先执行ifconfig eth0命令,然后通过awk命令以冒号和空格为分隔符,筛选出inet addr相关的行,接着打印出该行中的第四个字段。
MAIL="example@mail.com"
执行free -m命令后,通过awk命令筛选出内存信息,并提取第二列数据,最终将结果赋值给TOTAL变量。
执行free -m命令后,通过awk命令筛选内存信息,并计算得出可用内存量,具体操作如下:先从输出结果中选取包含“Mem”的行,然后提取该行中的第三、第六和第七个字段,最后计算这三个字段之间的差值,得到的结果即为USE变量所代表的可用内存量。
FREE=$(($TOTAL-$USE))
# 内存小于1G发送报警邮件
if [ $FREE -lt 1024 ]; then
echo "
Date: $DATE
Host: $IP
问题在于:总计金额为$TOTAL,已使用金额为$USE,剩余金额为$FREE。
请勿发送带有“内存监控”主题的邮件给$MAIL地址。
fi
3)硬盘
#!/bin/bash
DATE=$(date +%F" "%H:%M)
IP=$(ifconfig eth0 |awk -F [ :]+ /inet addr/{print $4} )
MAIL="example@mail.com"
执行命令`fdisk -l`后,通过管道将输出结果传递给`awk`工具,以冒号和空格为分隔符进行分割。在`awk`的初始化部分设置输出字段分隔符为等号,并针对以“Disk”开头的行进行处理。使用`printf`函数输出设备名称和对应的容量,单位为GB。
执行df -h命令后,通过awk命令处理输出结果,设置输出字段分隔符为等号,筛选以"/dev"开头的行,并打印出该行的第一个字段、第五个字段(转换为整数)以及第六个字段。
for i in $PART_USE; do
PART变量通过将字符串$i分割,以"="为分隔符,选取第一个部分。
USE=$(echo $i |cut -d"=" -f2)
MOUNT变量被赋予值,该值是通过将变量i中的内容按照等号进行分割,然后选取分割后的第三个部分来获取的。
if [ $USE -gt 80 ]; then
echo "
Date: $DATE
Host: $IP
Total: $TOTAL
Problem: $PART=$USE($MOUNT)
禁止发送主题为“磁盘监控”的邮件,使用命令行参数“-s”和邮件地址变量“$MAIL”。
fi
done
8、批量主机磁盘利用率监控
前提监控端和被监控端SSH免交互登录或者密钥登录。
创建一个配置文档,用于记录受监控主机的SSH接入详情,文档中的数据格式包括:主机的IP地址、用户名以及端口号。
#!/bin/bash
HOST_INFO=host.info
遍历IP列表,其中每个IP地址均通过执行awk命令筛选得出,该命令仅选取不以#开头的行,并将每行的第一个字段打印出来,这些字段对应于$HOST_INFO文件中的内容。
USER变量通过执行awk命令得到,该命令带有变量ip的值,并设定条件ip等于第一个参数,然后输出第二个字段,该操作针对文件$HOST_INFO进行。
PORT值通过执行awk命令获取,该命令携带变量ip并引用IP地址,接着在$HOST_INFO文件中搜索匹配的IP,当找到匹配项时,打印出第三列的值。
TMP_FILE=/tmp/disk.tmp
使用ssh命令,以$PORT端口连接到$USER用户,登录至$IP地址的主机,执行df -h命令,并将结果显示输出至$TMP_FILE文件中。
执行命令后,得到的USE_RATE_LIST变量包含了以下内容:awk程序在BEGIN块中设置输出字段分隔符为等号,接着对文件$TMP_FILE进行遍历,遇到以/dev开头的行时,打印出该行的第一个字段和第五个字段,并将第五个字段转换为整数。
针对USE_RATE列表中的每个USE_RATE值,依次执行:
PART_NAME=${USE_RATE%=*}
USE_RATE=${USE_RATE#*=}
if [ $USE_RATE -ge 80 ]; then
警告:$PART_NAME分区使用率已达$USE_RATE%!
fi
done
done
9、检查网站可用性
1)检查URL可用性
方法1:
check_url() {
HTTP_CODE变量通过执行curl命令获取,该命令将输出重定向到/dev/null,设置连接超时为3秒,以静默模式运行,并将HTTP状态码写入变量中,命令参数为$1。
若HTTP响应码并非200,则
发出警告:对"$1"的访问尝试失败!
fi
}
方法2:
check_url() {
若执行wget命令时,设置超时为10秒,尝试次数为1次,以蜘蛛模式运行,并将输出重定向到null设备,若该操作未能成功完成,则:
echo "Warning: $1 Access failure!"
fi
}
使用方法:
2)判断三次URL可用性
思路与上面检查主机存活状态一样。
采用循环策略,一旦达成目标便立即终止当前循环,若未果则继续执行至流程末尾。
#!/bin/bash
check_url() {
HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $1)
若HTTP响应码等于200,
continue
fi
}
URL列表包括:www.baidu.com,以及www.agasgf.com。
for URL in $URL_LIST; do
check_url $URL
check_url $URL
check_url $URL
系统提示:请注意,对"$URL"的访问尝试未能成功!
done
方法2:错误次数保存到变量
#!/bin/bash
URL_LIST="www.baidu.com www.agasgf.com"
for URL in $URL_LIST; do
FAIL_COUNT=0
for ((i=1;i<=3;i++)); do
执行curl命令后,将得到的HTTP状态码赋值给变量HTTP_CODE,命令参数包括输出到空设备、连接超时设置为3秒、静默模式、写入格式为HTTP状态码,并指定了URL地址。
若HTTP状态码并非200,则禁止执行。
let FAIL_COUNT++
else
break
fi
done
if [ $FAIL_COUNT -eq 3 ]; then
警告:对$URL的访问尝试未能成功!
fi
done
方法3:错误次数保存到数组
#!/bin/bash
URL_LIST="www.baidu.com www.agasgf.com"
for URL in $URL_LIST; do
NUM=1
while [ $NUM -le 3 ]; do
HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $URL)
if [ $HTTP_CODE -ne 200 ]; then
创建数组,使用$NUM作为索引,将$IP作为数组元素。
let NUM++
else
break
fi
done
若失败计数数组中的元素总数等于3,则。
echo "Warning: $URL Access failure!"
unset FAIL_COUNT[*] #清空数组
fi
done
10、检查MySQL主从同步状态
#!/bin/bash
USER=bak
PASSWD=123456
执行查询命令后,获取的IO线程状态信息经过处理,其中使用了awk命令对特定字段进行筛选,并利用gsub函数消除了冒号后的空格,最终得到的结果被赋值给IO_SQL_STATUS变量。
for i in $IO_SQL_STATUS; do
THREAD_STATUS_NAME=${i%:*}
THREAD_STATUS=${i#*:}
若"$THREAD_STATUS"的值并非"是",则
输出提示:错误信息,MySQL主从复制中,$THREAD_STATUS_NAME 状态显示为 $THREAD_STATUS。
fi
done
扫一扫在手机端查看
- 上一篇:php include目录 PHP相对路径解决方案_PHP中路径问题的解决方案
- 下一篇:WordPress functions.php 自定义函数引用_WordPress如何引用同一个目录下的所有php文件
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。


客服1