Shell脚本是系统运维工作当中最重要的一部分之一,能够通过编写Shell脚本来自动化执行系统管理任务,提高工作效率,减少出错概率。在这篇文章中,我将介绍运维常用的Shell脚本源码。
1. 自动清理日志文件
#!/bin/bash
find /path/to/logs -type f -mtime +7 -name "*.log" -exec rm {} \;
这个脚本可以定期清理指定目录下7天前的所有日志文件,以防止磁盘空间被占满。
2. 自动备份数据
#!/bin/bash
mysqldump -u root -pPASSWORD --all-databases > /path/to/backup/all-databases.sql
这个脚本可以自动备份MySQL数据库的所有表到指定路径。
3. 添加用户
#!/bin/bash
USERNAME="newuser"
PASSWORD=$(openssl rand -base64 12)useradd $USERNAME -m -s /bin/bash
echo "$USERNAME:$PASSWORD" | chpasswd
这个脚本可以添加一个新用户并随机生成密码。
4. 部署应用程序
#!/bin/bash APPLICATION_NAME="myapp" VERSION="1.0.0" cd /path/to/source/$APPLICATION_NAME git fetch origin $VERSION git checkout $VERSION mvn clean package cd /path/to/deploy/$APPLICATION_NAME rm -rf * cp /path/to/source/$APPLICATION_NAME/target/*.jar . java -jar *.jar
这个脚本可以部署一个Java应用程序。它会从Git仓库中拉取指定版本的代码,并使用Maven构建该应用程序。然后将编译后的Jar包复制到指定目录并启动。
5. 定时检查系统资源
#!/bin/bash ALERT_CPU=90 ALERT_MEMORY=80 while true; do CPU=$(top -bn1 | grep load | awk '{printf "%.2f%%\n", $(NF-2)}') MEMORY=$(free | awk '/Mem/{printf "%.2f%%\n", $3/$2*100}') if (( $(echo "$CPU >= $ALERT_CPU" |bc -l) )); then echo "CPU usage is too high: $CPU" | mail -s "Alert from Server" [email protected] fi if (( $(echo "$MEMORY >= $ALERT_MEMORY" |bc -l) )); then echo "Memory usage is too high: $MEMORY" | mail -s "Alert from Server" [email protected] fi sleep 60 done
这个脚本可以定期检查系统的CPU和内存使用情况,并在达到预警值时通过邮件发送通知给管理员。
6. 自动更新操作系统
#!/bin/bash apt-get update apt-get upgrade -y
这个脚本可以自动更新Ubuntu操作系统的所有软件包。
7. 自动重启服务
#!/bin/bash SERVICE_NAME="myservice" if systemctl is-active --quiet $SERVICE_NAME; then systemctl restart $SERVICE_NAME fi
这个脚本可以检查指定的服务是否在运行,如果是则重启该服务。
8. 监控日志文件
#!/bin/bash LOG_FILE="/path/to/log/file.log" KEYWORD="error" tail -f $LOG_FILE | while read LINE; do if echo $LINE | grep $KEYWORD; then echo "Found keyword '$KEYWORD' in log file at $(date)" | mail -s "Alert from Server" [email protected] fi done
这个脚本可以实时监控一个日志文件,并在文件中出现指定关键字时通过邮件发送通知给管理员。
9.磁盘监控
磁盘空间监控脚本可用于检查服务器磁盘空间是否已满或接近饱和状态,并在达到警戒线时发送告警邮件或其他通知。
#!/bin/bash
# 设置告警阈值
threshold=90# 获取当前磁盘使用率
disk_usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')# 判断是否需要发送告警邮件
if [ "$disk_usage" -ge "$threshold" ]; then
echo "磁盘使用率已超过$threshold%,请及时清理!" | mail -s "磁盘空间告警" [email protected]
fi
解释:
#!/bin/bash
:指定脚本执行的解释器为bash。threshold=90
:设置磁盘使用率的告警阈值为90%。disk_usage=
df -h / | awk 'NR==2 {print $5}' | sed 's/%//'``:使用df
命令获取当前磁盘使用情况,再用awk
和sed
提取出使用率,并去除百分号。if [ "$disk_usage" -ge "$threshold" ]; then
:如果磁盘使用率超过了告警阈值,则执行下一步操作。echo "磁盘使用率已超过$threshold%,请及时清理!" | mail -s "磁盘空间告警" [email protected]
:向指定的用户邮箱发送告警邮件。
10. 网络监控脚本
以下是一个简单的网络监控shell脚本:
#!/bin/bash
# 设置网络检测地址
url="https://www.example.com/"# 执行网络请求并获取状态码
status_code=$(curl -o /dev/null --silent --head --write-out '%{http_code}\n' "$url")# 判断状态码是否为200 OK
if [ "$status_code" -ne "200" ]; then
echo "网络异常,请检查网络连接!"
fi
解释:
#!/bin/bash
:指定脚本执行的解释器为bash。url="https://www.example.com/"
:设置需要检测的网络地址,这里以示例网站为例。status_code=$(curl -o /dev/null --silent --head --write-out '%{http_code}\n' "$url")
:使用curl
命令向指定地址发送请求,并将响应状态码赋值给status_code
变量。if [ "$status_code" -ne "200" ]; then
:如果状态码不为200,则执行下一步操作。echo "网络异常,请检查网络连接!"
:输出网络异常的提示信息。
可以将该脚本设置为定时任务,每隔一定时间执行一次,以实现网络连接的自动监测和告警。
11.安全审计脚本
#!/bin/bash
# 获取当前登录用户数量
user_count=$(who | wc -l)# 获取最近10分钟成功登录的IP地址列表
ip_list=$(grep "Accepted password" /var/log/auth.log | grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | sort | uniq)# 输出统计结果
echo "当前登录用户数量:$user_count"
echo "最近10分钟成功登录的IP地址列表:"
echo "$ip_list"
解释:
#!/bin/bash
:指定脚本执行的解释器为bash。user_count=$(who | wc -l)
:使用who
命令获取当前登录用户列表,并用wc
命令统计行数,赋值给user_count
变量。ip_list=$(grep "Accepted password" /var/log/auth.log | grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | sort | uniq)
:在/var/log/auth.log
文件中查找最近10分钟内成功登录的记录,提取出IP地址列表,并去重排序,赋值给ip_list
变量。echo "当前登录用户数量:$user_count"
:输出当前登录用户数量的统计结果。echo "最近10分钟成功登录的IP地址列表:"
:输出最近10分钟内成功登录的IP地址列表的提示信息。echo "$ip_list"
:输出IP地址列表。
可以将该脚本设置为定时任务,每隔一定时间执行一次,以实现安全审计的自动检测和告警。