# Linux刷题 **Repository Path**: yomind/linux-flashing-questions ## Basic Information - **Project Name**: Linux刷题 - **Description**: 只是个人的一个简单代码测试 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-03 - **Last Updated**: 2026-09-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Linux OJ · 极简 Linux 刷题系统 在浏览器里刷 Linux 命令题:每道题分配一个**独立 Docker 容器**作为做题环境,网页内嵌真实终端,提交后在容器内运行校验命令做**状态判题**并评分。没有多余功能,只有刷题、判对错、评分。 三种模式: - **模拟测试**:从题库随机抽 20 道题,做题时不判分,交卷后统一评分并给逐题明细。 - **无限刷题**:不停随机出题,每题做完立即判分,答错立刻给参考答案,可随时退出。 - **自由练习**:自己挑某一道题反复练。 ## 架构 - **前端**:React + Vite + xterm.js(题目列表页 + 做题页) - **后端**:FastAPI(容器生命周期 / WebSocket 终端代理 / 判题 / 题库 / 进度) - **存储**:题库 = `questions/` 文件夹(YAML);做题记录 = SQLite(`data/linuxoj.db`) - **环境**:每次做题起一个资源受限的容器(默认 256MB 内存 / 1 CPU / 128 进程 / 默认无网),LVM/数据库等题会按需提高内存或开启特权模式,结束即销毁,空闲 30 分钟自动回收 ## 快速开始(本地开发) 前置:Docker、Python 3.11+、Node 18+。 ```bash # 1. 构建做题基础镜像(首次一次即可) docker build -t linux-oj/base:latest docker/base # RHCSA/RHCE 板块用的 AlmaLinux 9 镜像(练这两个板块才需要) docker build -t linux-oj/el9:latest docker/el9 # 2. 启动后端 cd backend pip install -r requirements.txt uvicorn app.main:app --port 8000 # 3. 启动前端(另开一个终端) cd frontend npm install npm run dev ``` 打开 http://localhost:5173 开始刷题。 ## 添加一道题 在 `questions/<分类>/questions.yaml` 里追加一条,**无需改代码**。同类型题目放在同一分类文件下,例如 `questions/text-processing/questions.yaml`: ```yaml category: 文本处理 questions: - id: my-question # 全局唯一 id title: 题目标题 difficulty: easy # easy / medium / hard tags: [文本处理] description: | 题面,支持 Markdown。 setup: | # 可选:容器启动后的初始状态脚本 echo hello > /root/data.txt setup_timeout: 60 # 可选:setup 超时秒数,默认 60(数据库等重环境可调大) network: false # 可选:是否允许容器联网,默认 false privileged: false # 可选:特权容器,LVM/loop 设备类题目需要 mem_limit: 256m # 可选:容器内存上限,默认 256m answer: | # 可选:无限刷题答错时展示的参考答案(Markdown) ```bash touch /root/answer.txt ``` checks: # 判题:逐条运行,exit 0 即得分 - name: 评分点描述 points: 100 run: test -f /root/answer.txt ``` 改完后调用 `POST /api/admin/reload`(或重启后端)生效。 建议在 `backend/questions_selftest.py` 的 `SOLUTIONS` 里给新题加一条参考答案,然后运行 `python questions_selftest.py`:它会对每道题起容器、执行参考答案、判题,必须满分才算通过, 用来保证判分脚本本身是对的。 **判题理念**:判「结果状态」而不是「敲了什么命令」——用任何方法达成目标都算对。 ## 批量生成题目 题库按 **29 个分类** 组织(含 RHCSA/RHCE 考试专区),约 **1800+** 道题,覆盖 Linux 基础命令与企业运维核心技能: | 分类 | 侧重命令/技能 | |------|-------------| | **Linux基础命令** | touch/head/tail/cut/tr/diff/md5sum/sha256sum/which/test/xargs/realpath/file/hardlink/printf | | 用户管理 | useradd/userdel/usermod/groupadd/passwd | | 文件权限 | chmod/chown/粘滞位/SGID/符号权限 | | 文件管理 | ln/mkdir/mv/cp/truncate | | 文件查找 | find/locate 模式 | | 文本处理 | grep/sed/awk/sort/uniq/wc/cut/paste | | 管道重定向 | \|/>/>>/tee/heredoc/2>&1 | | 进程管理 | ps/pgrep/kill/nice | | 压缩归档 | tar/gzip/zip | | 磁盘分析 | df/du | | 网络管理 | ip/route/curl/wget/ping/ss | | 性能监控 | uptime/free/uname/vmstat/iostat | | systemd服务 | unit/timer 文件编写 | | … | 以及 LVM/防火墙/SSH/数据库等运维题 | - **基础**:用户管理、文件权限、文件管理/查找、文本处理(grep/sed/awk)、管道重定向、压缩归档、Shell 脚本、定时任务 - **系统**:进程管理、磁盘分析、系统配置、内核与参数(sysctl/ulimit)、性能监控(load/mem/vmstat) - **存储**:存储与 LVM、文件系统(mkfs/mount/fstab/swap) - **网络与安全**:网络管理(ip/ss/route/DNS)、防火墙(iptables)、SSH 与远程、安全加固(sudoers/SUID/密码策略) - **服务与数据**:服务运维(Nginx/rsync/systemd)、systemd 服务单元、日志轮转、日志分析、数据库运维(SQLite/MariaDB 备份恢复) 带 `g-` 前缀的 id 由生成器批量产出。相关脚本在 `backend/`: ```bash python generate_questions.py 3500 # 按分类生成约 1800+ 道(重写 questions/,产出 generated_solutions.json) python validate_generated.py 2 # 每类模板随机抽 2 道跑参考答案,判分必须满分 python validate_one_template.py chmod # 验证某一类模板的全部题目 ``` 想加新题型:在 `generate_questions.py` 的 `CATEGORIES` 里加模板函数并归入对应分类,重新生成即可。重新生成会先读入手写题再写回对应分类文件。 ## 部署(Linux 服务器 + Jenkins CI/CD) 完整图文教程见 **[DEPLOY.md](DEPLOY.md)**(Gitee 上传 + Jenkins 自动部署)。 简要步骤: ```bash # 服务器上(首次) docker build -t linux-oj/base:latest docker/base docker build -t linux-oj/el9:latest docker/el9 docker compose -f docker-compose.prod.yml up -d --build # 访问 http://服务器IP ``` 推代码到 Gitee 后,Jenkins 会自动执行 `Jenkinsfile` 完成部署。 ## API 一览 | 方法 | 路径 | 说明 | | --- | --- | --- | | GET | `/api/questions` | 题目列表(含最好成绩) | | GET | `/api/questions/{id}` | 题目详情 | | GET | `/api/questions/{id}/attempts` | 历史提交 | | POST | `/api/sessions` | 开始做题(起容器) | | WS | `/api/sessions/{id}/terminal` | 网页终端 | | POST | `/api/sessions/{id}/judge` | 提交判题 | | POST | `/api/sessions/{id}/reset` | 重置环境 | | DELETE | `/api/sessions/{id}` | 结束做题(销毁容器) | | POST | `/api/admin/reload` | 热加载题库 |