附录A4:练习清单 - 10个真实场景迷你任务
附录A4|练习清单:10个真实场景迷你任务
大家好,我是小林。
学完Linux命令后,你可能会问:"这些命令我都懂了,但怎么在实际工作中运用呢?"这个问题问得很好!就像学游泳一样,看再多的教程也不如下水练习。
这份练习清单设计了10个真实的工作场景,每个场景都是一个迷你项目。通过完成这些任务,你将真正掌握Linux命令的实战技能。每个任务都模拟了实际工作中可能遇到的情况,让你在练习中建立信心。
任务清单概览
任务编号 | 任务名称 | 涉及章节 | 预计时间 | 难度 |
---|---|---|---|---|
01 | 项目文件整理与权限设置 | 第3-4章 | 15分钟 | ⭐⭐ |
02 | Web服务器日志分析 | 第5、7章 | 20分钟 | ⭐⭐⭐ |
03 | 系统资源监控报告 | 第9章 | 15分钟 | ⭐⭐ |
04 | 批量文件重命名与整理 | 第3、7章 | 25分钟 | ⭐⭐⭐ |
05 | 网络连接诊断与排查 | 第10章 | 20分钟 | ⭐⭐⭐ |
06 | 用户权限管理与配置 | 第4章 | 20分钟 | ⭐⭐⭐ |
07 | 数据备份与压缩打包 | 第3章 | 15分钟 | ⭐⭐ |
08 | 进程管理与服务控制 | 第8章 | 20分钟 | ⭐⭐⭐ |
09 | 配置文件批量修改 | 第5、7章 | 25分钟 | ⭐⭐⭐⭐ |
10 | 系统安全审计脚本 | 第4、9章 | 30分钟 | ⭐⭐⭐⭐ |
任务01:项目文件整理与权限设置
场景描述:你刚接手一个混乱的项目目录,需要整理文件结构并设置合适的权限。
任务要求:
- 在家目录创建
project_cleanup
目录 - 创建以下文件结构:
src/
目录:包含3个.py
文件config/
目录:包含1个配置文件logs/
目录:空目录README.md
文件
- 设置正确的权限:
- 所有
.py
文件:755权限 - 配置文件:600权限
- 目录:755权限
- README文件:644权限
- 所有
验证命令:
# 检查目录结构
$ find project_cleanup -type f | sort
# 检查权限
$ find project_cleanup -name "*.py" -exec ls -la {} \;
$ find project_cleanup -name "config*" -exec ls -la {} \;
学习目标:
- 熟练使用
mkdir
创建目录结构 - 掌握
touch
创建文件 - 熟练使用
chmod
设置不同类型文件的权限 - 学会用
find
命令验证结果
任务02:Web服务器日志分析
场景描述:你需要分析Web服务器的访问日志,找出最热门的页面和异常访问。
准备数据:
# 创建模拟日志文件
$ cat > access.log << 'EOF'
192.168.1.100 - - [02/Sep/2025:10:30:15 +0800] "GET /index.html HTTP/1.1" 200 1024
192.168.1.101 - - [02/Sep/2025:10:31:20 +0800] "GET /about.html HTTP/1.1" 200 2048
192.168.1.102 - - [02/Sep/2025:10:32:25 +0800] "GET /admin/login.php HTTP/1.1" 403 512
192.168.1.100 - - [02/Sep/2025:10:33:30 +0800] "GET /index.html HTTP/1.1" 200 1024
192.168.1.103 - - [02/Sep/2025:10:34:35 +0800] "GET /products.html HTTP/1.1" 200 3072
192.168.1.101 - - [02/Sep/2025:10:35:40 +0800] "GET /contact.html HTTP/1.1" 200 1536
EOF
任务要求:
- 统计每个页面的访问次数
- 找出所有403错误的访问
- 计算总访问量
- 找出访问最频繁的IP地址
参考命令:
# 统计页面访问次数
$ awk '{print $7}' access.log | sort | uniq -c | sort -nr
# 找出403错误
$ grep " 403 " access.log
# 计算总访问量
$ wc -l access.log
# 找出最频繁的IP
$ awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -1
学习目标:
- 掌握
grep
过滤日志内容 - 学会用
awk
提取特定字段 - 熟练使用
sort
和uniq
进行统计 - 理解管道命令的组合使用
任务03:系统资源监控报告
场景描述:你需要生成一个系统资源使用情况的报告,帮助管理员了解系统状态。
任务要求:
- 检查磁盘使用情况,找出使用率超过80%的分区
- 查看内存使用情况
- 检查CPU负载
- 找出占用内存最多的前5个进程
- 将所有信息保存到
system_report.txt
文件
参考命令:
# 创建系统报告
$ {
echo "=== 系统资源监控报告 ==="
echo "生成时间:$(date)"
echo ""
echo "=== 磁盘使用情况 ==="
df -h | awk '$5+0 > 80 {print $0}'
echo ""
echo "=== 内存使用情况 ==="
free -h
echo ""
echo "=== CPU负载 ==="
uptime
echo ""
echo "=== 内存占用最多的进程 ==="
ps aux --sort=-%mem | head -6
} > system_report.txt
验证命令:
$ cat system_report.txt
学习目标:
- 掌握
df
查看磁盘使用情况 - 学会用
free
查看内存状态 - 理解
uptime
的输出含义 - 熟练使用
ps
查看进程信息 - 学会使用重定向和命令组
任务04:批量文件重命名与整理
场景描述:你有一个包含大量照片的文件夹,需要按照日期重新组织。
准备数据:
# 创建模拟照片文件
$ mkdir photos
$ cd photos
$ touch IMG_20240901_001.jpg IMG_20240901_002.jpg IMG_20240902_001.jpg
$ touch IMG_20240903_001.jpg IMG_20240903_002.jpg IMG_20240903_003.jpg
$ touch vacation_beach.jpg vacation_mountain.jpg family_dinner.jpg
任务要求:
- 按日期创建子目录:
2024-09-01
、2024-09-02
、2024-09-03
- 将
IMG_*
文件移动到对应的日期目录 - 将其他照片移动到
misc
目录 - 重命名所有文件,添加序号前缀
参考脚本:
#!/bin/bash
# 照片整理脚本
# 创建日期目录
for date in 2024-09-01 2024-09-02 2024-09-03; do
mkdir -p "$date"
done
# 移动IMG文件到对应目录
for file in IMG_*.jpg; do
if [[ $file =~ IMG_([0-9]{4})([0-9]{2})([0-9]{2})_ ]]; then
year=${BASH_REMATCH[1]}
month=${BASH_REMATCH[2]}
day=${BASH_REMATCH[3]}
dest_dir="$year-$month-$day"
mv "$file" "$dest_dir/"
fi
done
# 创建misc目录并移动其他文件
mkdir -p misc
mv *.jpg misc/ 2>/dev/null || true
# 添加序号前缀
cd misc
count=1
for file in *.jpg; do
mv "$file" "$(printf "%03d_%s" $count "$file")"
((count++))
done
学习目标:
- 掌握文件批量操作技巧
- 学会使用正则表达式处理文件名
- 理解循环和条件判断在脚本中的应用
- 熟练使用
mv
命令整理文件
任务05:网络连接诊断与排查
场景描述:用户报告无法访问某个网站,你需要诊断网络问题。
任务要求:
- 检查网络连接状态
- 测试DNS解析
- 追踪路由路径
- 检查端口连通性
- 生成诊断报告
参考命令:
# 网络诊断脚本
$ cat > network_diag.sh << 'EOF'
#!/bin/bash
TARGET="google.com"
echo "=== 网络诊断报告 ==="
echo "目标:$TARGET"
echo "检测时间:$(date)"
echo ""
# 检查网络接口
echo "=== 网络接口状态 ==="
ip addr show | grep -E "inet|UP"
echo ""
# 测试DNS解析
echo "=== DNS解析测试 ==="
nslookup $TARGET
echo ""
# 测试连通性
echo "=== 连通性测试 ==="
ping -c 4 $TARGET
echo ""
# 追踪路由
echo "=== 路由追踪 ==="
traceroute $TARGET
echo ""
# 检查端口
echo "=== 端口检查 ==="
nc -zv $TARGET 80 2>&1 | head -3
EOF
$ chmod +x network_diag.sh
$ ./network_diag.sh
学习目标:
- 掌握基本网络诊断命令
- 学会使用
ping
测试连通性 - 理解
traceroute
的路由追踪 - 学会用
nslookup
检查DNS解析
任务06:用户权限管理与配置
场景描述:你需要为新入职的开发者配置系统权限,确保他们能够正常工作。
任务要求:
- 创建新用户
developer1
- 创建开发组
devteam
- 将用户添加到开发组和其他必要组(docker, sudo)
- 创建共享开发目录
/opt/projects
- 设置合适的权限和SGID位
参考命令:
#!/bin/bash
# 开发者环境配置脚本
USERNAME="developer1"
GROUP="devteam"
PROJECT_DIR="/opt/projects"
# 创建用户和组
sudo useradd -m -s /bin/bash $USERNAME
sudo groupadd $GROUP
# 设置密码
echo "请为用户 $USERNAME 设置密码:"
sudo passwd $USERNAME
# 添加用户到组
sudo usermod -aG $GROUP $USERNAME
sudo usermod -aG docker $USERNAME
sudo usermod -aG sudo $USERNAME
# 创建项目目录
sudo mkdir -p $PROJECT_DIR
sudo chown root:$GROUP $PROJECT_DIR
sudo chmod 775 $PROJECT_DIR
sudo chmod g+s $PROJECT_DIR
# 验证设置
echo "=== 用户信息 ==="
id $USERNAME
echo ""
echo "=== 目录权限 ==="
ls -ld $PROJECT_DIR
学习目标:
- 掌握用户和组管理命令
- 理解权限和所有权设置
- 学会配置SGID位
- 了解开发环境的权限配置
任务07:数据备份与压缩打包
场景描述:你需要定期备份重要的项目数据,创建增量备份和完整备份。
任务要求:
- 创建备份目录结构
- 备份
/etc
目录(完整备份) - 备份用户主目录(排除缓存文件)
- 创建压缩包并添加时间戳
- 验证备份完整性
参考脚本:
#!/bin/bash
# 备份脚本
BACKUP_DIR="/backup/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# 完整备份 /etc 目录
echo "备份 /etc 目录..."
sudo tar -czf $BACKUP_DIR/etc_backup_$(date +%H%M).tar.gz /etc
# 备份用户主目录(排除缓存)
echo "备份用户目录..."
tar -czf $BACKUP_DIR/home_backup_$(date +%H%M).tar.gz \
--exclude=.cache \
--exclude=.local/share/Trash \
/home/$USER
# 创建备份清单
echo "创建备份清单..."
cat > $BACKUP_DIR/backup_manifest.txt << EOF
备份时间:$(date)
备份内容:
- etc_backup_*.tar.gz: 系统配置文件完整备份
- home_backup_*.tar.gz: 用户主目录备份(排除缓存)
EOF
# 验证备份
echo "验证备份完整性..."
for file in $BACKUP_DIR/*.tar.gz; do
echo "检查 $file"
tar -tzf $file > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "✓ 备份完整"
else
echo "✗ 备份损坏"
fi
done
echo "备份完成:$BACKUP_DIR"
学习目标:
- 掌握
tar
命令的各种选项 - 学会创建压缩包和排除文件
- 理解备份策略和验证方法
- 熟练使用时间戳和变量
任务08:进程管理与服务控制
场景描述:系统运行缓慢,你需要找出占用资源过多的进程并管理系统服务。
任务要求:
- 找出占用CPU最多的前5个进程
- 找出占用内存最多的前5个进程
- 检查系统服务状态
- 重启指定的系统服务
- 生成进程监控报告
参考命令:
#!/bin/bash
# 进程监控脚本
REPORT_FILE="process_report_$(date +%Y%m%d_%H%M).txt"
{
echo "=== 进程监控报告 ==="
echo "生成时间:$(date)"
echo ""
# CPU占用最多的进程
echo "=== CPU占用最多的进程 ==="
ps aux --sort=-%cpu | head -6
echo ""
# 内存占用最多的进程
echo "=== 内存占用最多的进程 ==="
ps aux --sort=-%mem | head -6
echo ""
# 系统服务状态
echo "=== 系统服务状态 ==="
systemctl list-units --type=service --state=running | head -10
echo ""
# 检查特定服务
echo "=== 关键服务状态 ==="
for service in sshd nginx apache2; do
if systemctl is-active --quiet $service; then
echo "✓ $service 运行中"
else
echo "✗ $service 已停止"
fi
done
echo ""
# 系统负载
echo "=== 系统负载 ==="
uptime
echo ""
# 建议操作
echo "=== 建议操作 ==="
echo "1. 检查CPU占用过高的进程是否正常"
echo "2. 监控内存使用趋势"
echo "3. 确保关键服务正常运行"
} > $REPORT_FILE
echo "监控报告已生成:$REPORT_FILE"
学习目标:
- 掌握
ps
命令的各种用法 - 学会使用
systemctl
管理服务 - 理解系统负载和进程监控
- 学会生成和管理监控报告
任务09:配置文件批量修改
场景描述:服务器迁移后,需要批量修改配置文件中的IP地址和路径。
准备数据:
# 创建模拟配置文件
$ mkdir config_backup
$ cat > app.conf << 'EOF
# 应用配置文件
server_ip = 192.168.1.100
database_host = 192.168.1.100
log_path = /var/log/app/
temp_dir = /tmp/app/
max_connections = 100
EOF
$ cat > database.conf << 'EOF
# 数据库配置文件
host = 192.168.1.100
port = 3306
data_dir = /var/lib/mysql/
log_file = /var/log/mysql/mysql.log
EOF
任务要求:
- 备份所有配置文件
- 将所有
192.168.1.100
替换为10.0.0.100
- 将所有
/var/log
路径改为/opt/logs
- 验证修改结果
- 生成修改报告
参考脚本:
#!/bin/bash
# 配置文件批量修改脚本
OLD_IP="192.168.1.100"
NEW_IP="10.0.0.100"
OLD_LOG_PATH="/var/log"
NEW_LOG_PATH="/opt/logs"
BACKUP_DIR="config_backup_$(date +%Y%m%d)"
# 创建备份目录
mkdir -p $BACKUP_DIR
echo "=== 配置文件修改报告 ==="
echo "修改时间:$(date)"
echo ""
# 处理所有.conf文件
for config_file in *.conf; do
if [ -f "$config_file" ]; then
echo "处理文件:$config_file"
# 备份原文件
cp "$config_file" "$BACKUP_DIR/"
# 显示修改前的内容
echo "修改前IP地址:"
grep -n "$OLD_IP" "$config_file" || echo "未找到"
# 执行替换
sed -i "s/$OLD_IP/$NEW_IP/g" "$config_file"
sed -i "s|$OLD_LOG_PATH|$NEW_LOG_PATH|g" "$config_file"
# 显示修改后的内容
echo "修改后IP地址:"
grep -n "$NEW_IP" "$config_file" || echo "未找到"
echo "---"
fi
done
# 生成汇总报告
echo "=== 修改汇总 ==="
echo "处理的配置文件:"
ls -la *.conf 2>/dev/null || echo "无.conf文件"
echo ""
echo "备份位置:$BACKUP_DIR"
echo ""
echo "修改内容:"
echo "- IP地址:$OLD_IP → $NEW_IP"
echo "- 日志路径:$OLD_LOG_PATH → $NEW_LOG_PATH"
学习目标:
- 掌握
sed
批量替换文本 - 学会处理配置文件的备份和恢复
- 理解正则表达式在文件修改中的应用
- 学会生成修改报告和验证结果
任务10:系统安全审计脚本
场景描述:作为系统管理员,你需要定期进行安全审计,检查系统的安全状况。
任务要求:
- 检查具有sudo权限的用户
- 找出所有UID为0的用户
- 检查空密码用户
- 检查重要文件权限
- 检查开放的端口
- 生成安全审计报告
参考脚本:
#!/bin/bash
# 系统安全审计脚本
REPORT_FILE="security_audit_$(date +%Y%m%d).txt"
{
echo "=== 系统安全审计报告 ==="
echo "审计时间:$(date)"
echo "审计主机:$(hostname)"
echo ""
# 检查sudo用户
echo "=== 具有sudo权限的用户 ==="
grep -E "^sudo:" /etc/group | cut -d: -f4 | tr ',' '\n' | grep -v "^$"
echo ""
# 检查UID为0的用户
echo "=== UID为0的用户 ==="
awk -F: '$3 == 0 {print $1}' /etc/passwd
echo ""
# 检查空密码用户(需要root权限)
echo "=== 空密码用户检查 ==="
if [ "$EUID" -eq 0 ]; then
awk -F: '($2 == "") {print $1}' /etc/shadow
else
echo "需要root权限执行此检查"
fi
echo ""
# 检查重要文件权限
echo "=== 重要文件权限检查 ==="
important_files=("/etc/passwd" "/etc/shadow" "/etc/sudoers")
for file in "${important_files[@]}"; do
if [ -f "$file" ]; then
perms=$(ls -la "$file" | awk '{print $1}')
echo "$file: $perms"
fi
done
echo ""
# 检查开放端口
echo "=== 开放端口 ==="
ss -tuln | grep LISTEN
echo ""
# 检查最近登录
echo "=== 最近登录用户 ==="
last -n 10 | head -10
echo ""
# 安全建议
echo "=== 安全建议 ==="
echo "1. 定期检查用户权限和sudo访问"
echo "2. 确保只有必要的用户具有管理员权限"
echo "3. 监控异常登录活动"
echo "4. 保持系统和软件包更新"
echo "5. 定期审查开放端口和服务"
} > $REPORT_FILE
echo "安全审计报告已生成:$REPORT_FILE"
echo "请仔细检查报告中的安全风险"
学习目标:
- 掌握系统安全检查的基本方法
- 学会检查用户权限和文件权限
- 理解端口和服务监控
- 学会生成专业的安全审计报告
练习建议
如何有效使用这些练习
- 循序渐进:按顺序完成练习,每个练习都是在前一个基础上的提升
- 理解原理:不要只是复制粘贴命令,要理解每个命令的作用
- 实践验证:完成每个任务后,用不同的方法验证结果
- 扩展思考:思考如何改进这些脚本,或者应用到其他场景
学习路径建议
初学者:
- 先完成任务01、03、07(基础文件操作)
- 然后尝试任务02、04(文本处理)
- 最后练习任务05、10(系统管理)
进阶用户:
- 重点练习任务06、08、09(系统配置)
- 挑战任务10(安全审计)
- 尝试优化和扩展示例脚本
常见问题解决
遇到错误时:
- 仔细阅读错误信息
- 检查命令语法和文件路径
- 使用
man
命令查看帮助文档 - 在测试环境中反复试验
提高效率:
- 使用
history
查看命令历史 - 创建常用命令的别名
- 编写自己的函数库
- 建立个人笔记和速查表
进阶挑战
完成所有基础练习后,可以尝试以下进阶挑战:
- 自动化运维:将这些练习组合成一个完整的系统管理脚本
- 监控告警:创建实时监控系统,在异常情况发生时发送告警
- 批量部署:编写脚本在多台服务器上批量执行配置
- 性能优化:分析系统瓶颈并优化性能
记住,真正的技能来自于不断的练习和实际应用。这些练习为你提供了一个良好的起点,但真正的掌握需要在日常工作中不断实践和总结。
祝你练习愉快,成为Linux命令行高手!🚀