Blog

入门 Linux 的 30天自学计划番外: Shell 大作战

Cover Image for 入门 Linux 的 30天自学计划番外: Shell 大作战
ZD
ZD

背景

书接上回 入门 Linux 的 30天自学计划,编写完第一版的 30 天自学计划之后,总觉得还不够,还不够有趣,学过习的大家都知道,肯教材,动手找文献总是无趣的,怎么能让学习的过程寓教于乐,轻松又持久呢?

答案的就是游戏。将学习、复习变成一个游戏,通过手脑并用的过程,加强记忆,相信我的学员能出色完成教学大纲的学习。

进度

借助 AI 的 神力,目前已经完成了部分游戏内容,在线体验地址点击 Shell Wizard

游戏策划

我:依据上面的全部内容,设计一个有趣的网页小游戏,帮助学习者首先记住这些命令,然后理解每一个命令的使用。

我举个例子,学习命令单调,但是学习参数,可能就会有不一样的体验。以 “-a” 参数为例,有哪些命令可以使用 "-a" 参数,差异是什么,可以通过互动让使用者补全命令。

接下来你开始策划


太棒了!这是一个非常有创意和实际意义的想法。将学习融入到游戏中,特别是针对枯燥的命令记忆,效果会事半功倍。

我将为你设计一个名为 “Shell Wizard: Red Hat Edition” 的网页小游戏。这个游戏将包含多个模式,旨在帮助学习者在 Red Hat/CentOS/Rocky Linux 环境下,通过互动和实践,掌握核心的运维命令和参数。


游戏名称:Shell Wizard: Red Hat Edition

游戏理念:

你是一个初出茅庐的“Shell 小巫师”,你的任务是掌握强大的 Linux 命令行魔法,成为一名合格的 Red Hat 系统管理员。通过一系列挑战和谜题,你将逐步解锁命令的奥秘。

游戏风格:

  • 视觉: 模仿命令行界面 (CLI) 风格,深色背景,绿色/蓝色/白色等亮色字体。使用等宽字体,模拟终端输出。
  • 音效: 简单的敲击键盘声、正确/错误提示音效。
  • 氛围: 学习与挑战并存,强调动手实践。

游戏模块:

游戏将分为四个核心模块,每个模块针对不同的学习目标:


模块一:命令速记挑战 (Command Recall Race)

  • 目标: 快速记忆和输入常用命令。
  • 玩法:
    1. 任务显示: 屏幕上方会显示一个具体、简短的运维任务描述(例如:“查看当前工作目录的完整路径。”,“更新系统所有软件包。”)。
    2. 计时输入: 下方有一个终端模拟的输入框,玩家需要在限定时间内(例如:10-15 秒)输入完成任务所需的命令。
    3. 即时反馈:
      • 正确: 屏幕显示 [正确!],并简要解释命令的作用,然后进入下一题。
      • 错误: 屏幕显示 [错误!],并给出正确命令和解释,然后进入下一题。
      • 超时: 屏幕显示 [超时!],并给出正确命令和解释,然后进入下一题。
    4. 积分与进度: 每答对一题加分,答错或超时扣分。显示当前题数/总题数。
  • Red Hat 命令示例:
    • ls (列出目录内容)
    • cd (切换目录)
    • pwd (显示当前路径)
    • mkdir (创建目录)
    • rm (删除文件)
    • cat (查看文件内容)
    • less (分页查看文件)
    • grep (搜索文本)
    • sudo dnf update (更新系统)
    • sudo dnf install httpd (安装软件包)
    • systemctl status sshd (查看服务状态)
    • ip addr (查看网络信息)
    • ping (测试网络连通性)
    • ssh (远程连接)
    • ps aux (查看所有进程)
    • top (实时监控进程)
    • df -h (查看磁盘空间)

模块二:参数迷宫 (Parameter Puzzle)

  • 目标: 深入理解命令参数的含义,以及同一参数在不同命令中的差异。

  • 玩法:

    1. 参数提示: 屏幕中央显示一个命令参数(例如:-a)。
    2. 场景挑战: 接着下方会出现几个不同的场景描述,每个场景对应一个不完整的命令,玩家需要补全缺失的命令或选择正确的解释。
    3. 互动方式:
      • 填空题:___ -a ... 这样的结构中,填入正确的命令。
      • 选择题: 针对某个参数,提供多个解释选项,玩家选择正确项。
    4. 详细反馈: 无论对错,都会给出详细的解释,对比该参数在不同命令中的具体作用和潜在注意事项。
  • Red Hat 命令及参数示例 (以 -a 为例):

    • 场景 1 (填空):

      • 问题: "我需要列出当前目录下所有的文件,包括隐藏文件。我会使用哪个命令?请补全命令:___ -a"
      • 正确答案: ls
      • 解释: "ls -a:在 ls 命令中,-a (all) 参数用于显示所有文件和目录,包括以 . 开头的隐藏文件。这是最常用的 ls 参数之一。"
    • 场景 2 (填空):

      • 问题: "我想将用户 john 添加到 developers 这个附加组。我会使用哪个命令?请补全命令:___ -aG developers john"
      • 正确答案: usermod
      • 解释: "usermod -aG:在 usermod 命令中,-a (append) 参数必须与 -G 参数一起使用,用于将用户追加到指定的附加组中,而不是覆盖原有的附加组。这在用户组管理中非常重要,避免误操作删除现有组。"
    • 场景 3 (填空):

      • 问题: "我想查看所有已安装的 RPM 软件包列表。我会使用哪个 rpm 命令?请补全命令:rpm ___a"
      • 正确答案: -q (或 q)
      • 解释: "rpm -qa:在 rpm 命令中,-q (query) 表示查询,而 -a (all) 表示所有。组合起来 rpm -qa 用于查询系统上所有已安装的 RPM 软件包。如果你只输入 rpm -qa,它会列出所有已安装的包,例如:bash-4.4.20-1.el8.x86_64。"
    • 场景 4 (选择题 - 以 -r 为例):

      • 问题: "在 grep 命令中,-r 参数有什么作用?"
      • 选项:
        • A. 忽略大小写
        • B. 递归地搜索子目录
        • C. 只显示匹配行数
        • D. 反向匹配
      • 正确答案: B
      • 解释: "grep -r:在 grep 命令中,-r (recursive) 用于递归地搜索指定目录下的所有文件。例如:grep -r "error" /var/log 会在 /var/log 及其子目录中所有文件中搜索 'error' 字符串。"
      • 对比: "rm -r 则表示递归删除,cp -r 表示递归复制目录。同一个 -r 参数在不同命令中都表示“递归”,但应用场景不同,务必根据命令功能理解其具体行为。"

模块三:命令串联挑战 (Command Builder Challenge)

  • 目标: 锻炼玩家构建多步骤复杂命令和使用管道的能力。
  • 玩法:
    1. 任务描述: 屏幕上方显示一个详细的运维任务(例如:“查找 /var/log 目录下所有以 .log 结尾且大小超过 1MB 的文件,并将其内容通过分页方式显示出来。”)。
    2. 命令/参数库: 下方提供一个可拖拽的命令和参数块库(例如:find, grep, |, less, tail, -name, -size, -f, -exec, xargs 等)。
    3. 构建区域: 玩家将命令和参数块拖拽到中间的构建区域,按照正确的顺序拼接成一个完整的命令。
    4. 执行与反馈: 玩家点击“执行”按钮。
      • 正确: 游戏模拟执行结果,显示 [任务完成!],并给出标准的解决方案,详细解释每一步的作用和命令的逻辑。
      • 错误: 游戏会高亮显示命令中语法错误或逻辑不通的部分,并提供提示或分步解释。
  • Red Hat 场景示例:
    • 场景 1: "在 /etc 目录下查找所有名称中包含 conf 字符串的文件,并只显示文件名。"
      • 期望命令: find /etc -name '*conf*' -type f -printf "%f\n" (或 find /etc -name '*conf*' -type f | xargs -n 1 basename)
    • 场景 2: "实时查看 messages 日志文件,并只显示包含 'fail' 或 'error' 关键字的行。"
      • 期望命令: tail -f /var/log/messages | grep -E 'fail|error'
    • 场景 3: "找到系统中所有由 nginx 用户拥有的文件,并将它们的权限修改为只有所有者可读写(600)。"
      • 期望命令: find / -user nginx -exec chmod 600 {} \;

模块四:运维故障演练 (Troubleshooting Simulation)

  • 目标: 模拟初级运维故障场景,培养系统排查和解决问题的思维。
  • 玩法:
    1. 故障现象: 屏幕显示一个简单的“故障现象”描述(例如:“网站无法访问。”,“服务器负载异常高。”)。
    2. 排查选项: 游戏提供几个可能的排查步骤作为多项选择。
    3. 分支决策: 玩家选择最合理的第一步。根据玩家的选择,游戏会:
      • 正确选择: 进入下一个逻辑排查步骤,或直接判定解决。
      • 错误选择: 提供反馈,解释为什么这个选择不妥,并引导回正确方向或直接给出解决方案。
    4. 最终解决方案: 玩家成功排查并“修复”故障后,游戏会总结完整的排查思路和解决方案。
  • Red Hat 场景示例:
    • 故障 1: "用户反馈无法 SSH 连接到服务器。"
      • 排查选项:
        • A. ping 服务器 IP
        • B. systemctl status sshd
        • C. firewall-cmd --list-all
        • D. 重启服务器
      • 理想路径: ping (确认网络) -> systemctl status sshd (确认服务运行) -> firewall-cmd --list-all (确认防火墙未阻止端口) -> 检查 auth.logsecure 日志 (/var/log/secure)。
    • 故障 2: "Web 服务 (Nginx) 无法启动。"
      • 排查选项:
        • A. systemctl status nginx
        • B. journalctl -xeu nginx
        • C. 检查 Nginx 配置文件 (/etc/nginx/nginx.conf)
        • D. 检查 80 端口是否被占用 (ss -tulnp | grep :80)
      • 理想路径: systemctl status nginx (看状态及错误信息) -> journalctl -xeu nginx (查看详细日志) -> ss -tulnp | grep :80 (端口冲突) -> 检查配置文件语法。
    • 故障 3: "服务器磁盘空间不足,导致新文件无法写入。"
      • 排查选项:
        • A. df -h
        • B. du -sh /*
        • C. 清理 /tmp 目录
        • D. 重启服务器
      • 理想路径: df -h (定位哪个分区满了) -> du -sh /* (定位哪个目录大) -> 清理大文件或旧日志。

技术实现设想:

  • 前端: HTML、CSS、JavaScript。
    • 使用 CSS 实现命令行风格的 UI。
    • JavaScript 负责游戏逻辑(计时、问题加载、答案判断、交互反馈、分数计算)。
  • 数据: 所有题目、答案、解释等数据以 JSON 格式存储,纯前端加载和处理,无需后端服务器,方便部署为静态网页。

未来扩展:

  • 成就系统: 完成特定挑战或达到高分,解锁“Shell 大师”等成就。
  • 排行榜: 记录玩家分数,增加竞争性。
  • 自定义挑战: 允许玩家根据自己的薄弱环节,自定义练习内容。
  • 更多模块: 例如,文件权限迷阵(专门针对 chmod, chown)、进程信号发射(模拟 kill 命令发送信号)。

这个游戏设计兼顾了趣味性、互动性和学习效率,特别是加入了 Red Hat 特有的命令和故障排查思路,能更好地帮助初学者从零开始,在实践中快速成长为合格的初级 IT 运维人员。