以下是一系列实用的Shell脚本实例,涵盖了系统管理、文件处理、文本处理、网络操作等多个方面。这些脚本代码清晰,可以直接使用或根据需求修改。
#!/bin/bash
# 获取系统信息
echo "===== 系统信息 ====="
echo "主机名: $(hostname)"
echo "操作系统: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
echo "内核版本: $(uname -r)"
echo "CPU信息: $(lscpu | grep 'Model name' | cut -d':' -f2 | sed -e 's/^[ \t]*//')"
echo "内存总量: $(free -h | grep Mem | awk '{print $2}')"
echo "当前时间: $(date)"
echo "系统运行时间: $(uptime -p)"
#!/bin/bash
# 监控磁盘空间,超过阈值发送警告
THRESHOLD=90
EMAIL="admin@example.com"
for disk in $(df -h | grep '^/dev' | awk '{print $1}'); do
usage=$(df -h | grep $disk | awk '{print $5}' | tr -d '%')
if [ $usage -gt $THRESHOLD ]; then
echo "警告: 磁盘 $disk 使用率 $usage% 超过阈值 $THRESHOLD%" | mail -s "磁盘空间警报" $EMAIL
fi
done
#!/bin/bash
# 监控指定进程是否运行
PROCESS="nginx"
if pgrep -x "$PROCESS" >/dev/null; then
echo "$PROCESS 正在运行"
else
echo "$PROCESS 未运行,尝试启动..."
systemctl start $PROCESS
fi
#!/bin/bash
# 批量将.txt后缀改为.md
for file in *.txt; do
mv "$file" "${file%.txt}.md"
echo "已重命名: $file -> ${file%.txt}.md"
done
#!/bin/bash
# 查找并删除当前目录及子目录中的空文件
find . -type f -empty -print -delete
#!/bin/bash
# 备份指定目录到带时间戳的压缩包
BACKUP_DIR="/var/www/html"
DEST_DIR="/backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
tar -czf $DEST_DIR/backup_$TIMESTAMP.tar.gz $BACKUP_DIR
echo "备份完成: $DEST_DIR/backup_$TIMESTAMP.tar.gz"
#!/bin/bash
# 分析Nginx访问日志,统计访问量前10的IP
LOG_FILE="/var/log/nginx/access.log"
echo "访问量前10的IP:"
awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -nr | head -10
#!/bin/bash
# 处理CSV文件,提取特定列并计算平均值
INPUT="data.csv"
COLUMN=3 # 假设要处理第3列
awk -F',' -v col=$COLUMN 'NR>1 {sum+=$col; count++} END {print "平均值: " sum/count}' $INPUT
#!/bin/bash
# 批量替换多个文件中的字符串
OLD_STRING="旧文本"
NEW_STRING="新文本"
FILES="*.txt"
for file in $FILES; do
sed -i "s/$OLD_STRING/$NEW_STRING/g" $file
echo "已处理: $file"
done
#!/bin/bash
# 检查网站是否可访问
URL="https://example.com"
STATUS=$(curl -o /dev/null -s -w "%{http_code}\n" $URL)
if [ $STATUS -eq 200 ]; then
echo "$URL 可访问 (HTTP $STATUS)"
else
echo "$URL 不可访问 (HTTP $STATUS)"
fi
#!/bin/bash
# 批量Ping测试一组IP地址
IP_LIST="8.8.8.8 1.1.1.1 192.168.1.1"
for ip in $IP_LIST; do
if ping -c 1 $ip &> /dev/null; then
echo "$ip 可达"
else
echo "$ip 不可达"
fi
done
#!/bin/bash
# 简单的端口扫描工具
HOST="example.com"
PORTS="80 443 22 21 3306"
for port in $PORTS; do
timeout 1 bash -c "echo >/dev/tcp/$HOST/$port" 2>/dev/null && \
echo "端口 $port 开放" || \
echo "端口 $port 关闭"
done
#!/bin/bash
# 生成随机密码
LENGTH=12
PASSWORD=$(tr -dc 'A-Za-z0-9!@#$%^&*()' < /dev/urandom | head -c $LENGTH)
echo "生成密码: $PASSWORD"
#!/bin/bash
# 下载文件并校验MD5
URL="http://example.com/file.zip"
MD5="expected_md5_sum"
FILE="file.zip"
wget $URL -O $FILE
ACTUAL_MD5=$(md5sum $FILE | awk '{print $1}')
if [ "$ACTUAL_MD5" == "$MD5" ]; then
echo "文件校验成功"
else
echo "文件校验失败"
rm -f $FILE
fi
#!/bin/bash
# 添加每日备份定时任务
CRON_JOB="0 2 * * * /path/to/backup_script.sh"
(crontab -l 2>/dev/null; echo "$CRON_JOB") | crontab -
echo "定时任务已添加"
#!/bin/bash
# 批量创建用户并设置随机密码
USER_LIST="user1 user2 user3"
GROUP="developers"
groupadd $GROUP 2>/dev/null
for user in $USER_LIST; do
useradd -m -G $GROUP $user
PASSWORD=$(date +%s | sha256sum | base64 | head -c 12)
echo "$user:$PASSWORD" | chpasswd
echo "用户 $user 创建成功,密码: $PASSWORD"
done
#!/bin/bash
# 生成系统资源使用报告
REPORT_FILE="/tmp/system_report_$(date +%Y%m%d).txt"
{
echo "===== 系统资源报告 $(date) ====="
echo ""
echo "---- 内存使用 ----"
free -h
echo ""
echo "---- 磁盘使用 ----"
df -h
echo ""
echo "---- CPU使用率 ----"
top -bn1 | grep "Cpu(s)"
echo ""
echo "---- 运行进程数 ----"
ps -e | wc -l
} > $REPORT_FILE
echo "报告已生成: $REPORT_FILE"
#!/bin/bash
# 修复指定目录的文件权限
DIR="/var/www/html"
USER="www-data"
GROUP="www-data"
find $DIR -type d -exec chmod 755 {} \;
find $DIR -type f -exec chmod 644 {} \;
chown -R $USER:$GROUP $DIR
echo "权限已修复"
#!/bin/bash
# 简单的日志轮转脚本
LOG_FILE="/var/log/myapp.log"
MAX_SIZE="10M"
BACKUP_COUNT=5
if [ $(stat -c %s "$LOG_FILE" 2>/dev/null || echo 0) -gt $(numfmt --from=iec "$MAX_SIZE") ]; then
for i in $(seq $BACKUP_COUNT -1 2); do
[ -f "$LOG_FILE.$((i-1))" ] && mv "$LOG_FILE.$((i-1))" "$LOG_FILE.$i"
done
mv "$LOG_FILE" "$LOG_FILE.1"
touch "$LOG_FILE"
echo "日志已轮转"
fi
#!/bin/bash
# 批量将JPG图片转换为PNG格式
for img in *.jpg; do
convert "$img" "${img%.jpg}.png"
echo "已转换: $img -> ${img%.jpg}.png"
done
这些脚本涵盖了Linux系统管理中的常见任务,您可以根据实际需求进行修改和扩展。使用前请确保您理解脚本的功能,并在测试环境中验证后再在生产环境中使用。