
Shell脚本的woesCoursebook脚本编程安全课【免费下载链接】coursebookOpen Source Introductory Systems Programming Textbook for the University of Illinois项目地址: https://gitcode.com/GitHub_Trending/co/coursebook写 Shell 脚本人人都会echo hello但能跑和跑得安全之间隔着无数新手踩过的坑。Coursebook 是伊利诺伊大学开源的入门系统编程教材Open Source Introductory Systems Programming Textbook它最被低估的宝藏不是章节正文而是 _scripts/ 目录里十几个构建脚本——从校验 TeX 日志到推送发布整条流水线都由 Shell 脚本把关。这篇指南把其中最有代表性的5 堂脚本编程安全课拆给你看新手照着检查能避开 Shell 脚本最常见的翻车模式。一、认识 Coursebook 的 Shell 脚本工具箱整个仓库的自动化逻辑集中在几个文件里文件角色Makefile构建 PDF / EPUB 的总入口order.yaml章节顺序清单脚本据此逐章处理_scripts/install.shCI 安装阶段锁定版本、装依赖_scripts/script.shCI 构建阶段编译 逐项质量门禁_scripts/deploy.sh发布阶段把产物推到部署分支每个脚本的分工都能在 _scripts/Readme.md 里查到一句话说明——脚本也要有文档这本身就是好习惯。二、第一课用 set -e 让错误当场倒下新手脚本最常见的 woes某一步失败了脚本却若无其事地跑到最后产出一份看起来正常的坏结果。Coursebook 的所有脚本开头都有一句保命符set -e/set -o errexit任何命令失败脚本立即退出见 deploy.sh、script.shset -u引用未定义变量直接报错而不是悄悄输出空串见 check_tex_logs.shset -o pipefail管道中任何一环失败都算失败见 compare_pdf_text.sh更值得学的是例外管理确实允许失败的非致命步骤会显式写成|| true并注释原因如 site_deploy.sh#L27-L33。快速失败是原则例外必须写出来——而不是靠运气。三、第二课锁定版本 SHA256 校验和下载不裸奔install.sh 安装 pandoc 时的写法是依赖下载的教科书级示范PANDOC_VERSION3.10.2 wget -q .../pandoc-${PANDOC_VERSION}-1-amd64.deb echo ${PANDOC_SHA256} ${PANDOC_DEB} | sha256sum -c -三个要点缺一不可钉死精确版本3.10.2而非 3.x并在注释里写清为什么是这个版本下载后先验 SHA256 校验和文件被篡改或下错当场拒绝安装留好回滚方案脚本注释里直接写明旧版本来源与恢复步骤install.sh#L21-L23装 EPUBCheck 时同样先检查 Java 是否存在、只装最小 JREinstall.sh#L43-L47——依赖越少攻击面越小。四、第三课变量加引号路径不裸奔看 check_verapdf.sh#L13-L18 处理文件路径的方式dir$(cd $(dirname $pdf) pwd) docker run --rm -v $dir:/data $VERAPDF_IMAGE ... /data/$base每一处变量都包在双引号里。原因很朴素文件名一旦含空格或特殊字符不加引号的$pdf会被 shell 拆成多个参数轻则逻辑错乱重则执行到意料之外的命令。同理push_to_wiki.sh 用mktemp -d生成随机临时目录而不是手写/tmp/wiki既避免命名冲突也避免别人抢先创建目录。五、第四课退出码是一份契约重试要有限次好的 Shell 脚本像一份 API 文档。compare_pdf_text.sh 明确约定0 通过、1 内容不一致、2 输入不可用check_tex_logs.sh 则把错误 / 警告 / 缺失字符分开计数只让真正致命的问题TeX 错误、缺字触发失败退出。重试逻辑也要有限且有退避看 site_retry.sh#L3-L6最多重试NUM_RETRIES次失败时先清理site_cleanup.sh再 sleepBUILD_TIME秒而不是死循环硬刷。六、第五课令牌与密钥的安全处理 发布阶段最需要小心密钥Coursebook 的做法值得逐条抄作业令牌不进日志用内置 token 拼 HTTPS 克隆地址由 Actions 自动脱敏并特意不 echo 含令牌的 URLpush_to_wiki.sh#L11-L16令牌即改即还原deploy.sh 临时改写 origin 推送推完立刻换回旧地址deploy.sh#L47-L52SSH 密钥最小化IdentitiesOnlyyes -F /dev/null让 ssh 只用指定的那一把钥匙site_deploy.sh#L6密钥缺失时优雅跳过部署钥匙文件不存在就跳过而非报错保证 fork 环境也能跑通push_to_wiki.sh#L39-L43七、动手本地跑一遍 Coursebook 构建流水线仓库只读也能玩克隆下来先读脚本、再跑构建观察门禁如何工作。git clone https://gitcode.com/GitHub_Trending/co/coursebook.git coursebook cd coursebook bash -n _scripts/install.sh # 语法检查0 秒上手 make epub # 需要 pandocPDF 构建则需 TeX Live见 Makefile构建产物里的每一张章节图——比如这张 TCP 头部示意图——都必须带 alt 文本才能通过 alt_lint.py 和 epub_check 门禁EPUB 构建时脚本还会自动把.eps转成.png。内容可访问性也是被脚本验收的不只是排版问题。关于标签化 PDF 构建的完整背景可以读 docs/pdf-tagging-spike.md 了解整套门禁设计。八、新手 Shell 脚本安全检查清单 ✅#检查项Coursebook 出处1开头有set -e必要时加set -u -o pipefailscript.sh2非致命步骤显式|| true并注释原因site_deploy.sh3下载的依赖钉版本 验 SHA256install.sh#L24-L294变量一律加双引号临时目录用mktemp -dpush_to_wiki.sh#L95退出码语义明确0 通过 / 1 业务失败 / 2 环境错误compare_pdf_text.sh#L6-L106重试有限次、有退避、先清理site_retry.sh7令牌不进日志、用完即还原、密钥最小化deploy.sh#L47-L528每个脚本都有一句话文档_scripts/Readme.md小结Shell 脚本的 woes 大多不是语法问题而是失败时怎么办的问题。Coursebook 用一套真实的开源教材构建流水线证明了——快速失败、锁定版本、加引号、讲退出码、管好密钥五件事做好脚本就能安全地跑在生产环境里。【免费下载链接】coursebookOpen Source Introductory Systems Programming Textbook for the University of Illinois项目地址: https://gitcode.com/GitHub_Trending/co/coursebook创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考