utils/sql_drills
Krzysztof kuhy Rudnicki de7d5d17eb sql_drills: no root shell for learner SQL
Learner SQL piped into the mysql client could run `\! id` as container
root and read every DB. Now: --binary-mode (client commands error out),
a refused-backslash-line guard, learner exec as uid 65534, and a random
root password (0600 file, via env, adopted live on a legacy container).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WzxdWYGW5NZL5uVpnqmNKo
2026-11-02 16:05:59 +01:00
..
scripts Add sql_drills engine package 2026-11-02 13:53:39 +01:00
sql_drills sql_drills: no root shell for learner SQL 2026-11-02 16:05:59 +01:00
.pre-commit-config.yaml Add sql_drills engine package 2026-11-02 13:53:39 +01:00
install.sh Add sql_drills engine package 2026-11-02 13:53:39 +01:00
pyproject.toml sql_drills: no root shell for learner SQL 2026-11-02 16:05:59 +01:00
README.md sql_drills: no root shell for learner SQL 2026-11-02 16:05:59 +01:00
requirements.txt Add sql_drills engine package 2026-11-02 13:53:39 +01:00

SQL drill engine (MySQL 8.0.33 + PostgreSQL 18.6, one container each): import sql_drills as sd. Drills: sd.run(id, sql, dialect). LeetCode examples: sd.run_problem(slug_or_statement, sql, dialect). Data: $SQL_DRILLS_DATA. Install: ./install.sh. Root password: random, ~/.config/sql_drills/root_password (0600); learner SQL runs as a per-run user, client commands (\!) refused.