尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

国赛脚本文件与答案视频导出:从换行符到录屏的实战避坑指南

国赛脚本文件与答案视频导出:从换行符到录屏的实战避坑指南 简介针对2023年国赛《网络建设与运维》技能大赛的备赛需求这份资料集收录了自动导出答案的脚本与配套操作视频帮助参赛选手从比赛系统的配置文件、日志中快速提取关键信息并按规范生成答案。包内共44个文件约10.95MB主要包含21个sh脚本面向Linux环境、9个ps1脚本面向Windows PowerShell、7个zbak备份、5个mp4操作演示、1个txt说明及1个附赠zip包覆盖网络设备、服务器、PC端等不同对象的配置导出。脚本针对不同平台分别调整兼容性与安全性兼顾可按需选用。目前已有154人学习适合备赛与赛后复盘可作重点参考。视频分别演示了server1、server2、Linux服务、Windows服务及网络设备的导出过程直观展示脚本运行环境与常见权限、安全问题的处理方式说明文档则帮助核对答案格式必要时可用备份文件恢复环境便于选手在实验环境中反复演练提升备赛效率。1. 国赛脚本文件到底是什么从赛题要求到自动化落地的第一道坎在“网络建设与运维”国赛现场脚本文件不是锦上添花的操作而是赛题明文要考核的交付物。常见的要求包括用 Bash 脚本批量创建用户、用 Python 脚本轮询服务端口、甚至用 expect 脚本自动登录网络设备导出配置而“导出答案视频”则是指把操作过程完整录屏最后和脚本文件、配置文件一起打包提交作为裁判复核的依据。我见过太多选手把精力全耗在敲命令上到交卷前才发现脚本文件没存对路径、视频格式不被识别白丢十几分。这篇文章就按“写脚本→跑脚本→导出答案视频→踩坑清账”的顺序把全流程讲透适合正在备赛的学生和带队的指导老师。2. 把脚本文件写对从双系统环境差异到常用脚本模板2.1 Windows 与 Linux 的脚本文件格式差异换行符和编码绝大多数选手喜欢在 Windows 上用记事本或 VS Code 编辑脚本再通过 SecureCRT、Xshell 传到 Linux 服务器。这里第一个坑就是换行符。Windows 保存文件默认用 CRLF回车换行作为行尾Linux 只认 LF换行。Bash 解析脚本时每行结尾的\r会被当成命令的一部分于是报$\r: command not found看着像玄学其实是行尾符没换。解决方法有两种第一在编辑器的状态栏里把“行尾符”改成 LFVS Code 就是右下角点一下CRLF再选LF。第二如果文件已经传上服务器直接在 Linux 上转# 把脚本里的 \r 字符删掉全局替换 sed -i s/\r$// check_port.sh # 或者更省事用 dos2unix 命令 dos2unix check_port.shsed -i的s/\r$//意思是匹配每行末尾的回车符并删除-i表示原地修改。dos2unix 是专门干这事的工具有些发行版没装可以用apt install dos2unix先装上。还有一个坑是编码Windows 中文环境默认 GBK脚本里写的中文注释传到 Linux 上会乱码甚至某些字符会导致解释器报错。建议所有脚本文件统一用 UTF-8 无 BOM 保存。判断有没有 BOM 可以看文件头head -c 3 check_port.sh | xxd如果输出是ef bb bf就说明有 UTF-8 BOMBash 会把#!这一行识别成带隐藏字符的解析导致#!/bin/bash失效。解决也很简单在 VS Code 里重新以“UTF-8 without BOM”保存或者用sed -i 1s/^\xef\xbb\xbf// 文件删掉前三个字节。下面给一个算是国赛出镜率很高的脚本模板读一个“IP端口”清单逐项探测连通性输出结果到终端。用这个可以快速核对服务是否全部监听#!/bin/bash # 功能批量检查服务端口是否可达 # 用法./check_port.sh ip_list.txt # ip_list.txt 每行格式192.168.1.1 80 while read ip port; do if timeout 2 nc -zv $ip $port /dev/null 21; then echo [OK] $ip:$port 可达 else echo [FAIL] $ip:$port 不可达 fi done $1这个脚本的逻辑是while read ip port从文件里读取两列timeout 2限制 2 秒超时防止某个端口卡住整个循环nc -zv是 netcat 的探针模式-z只扫描不发送数据-v输出详细信息后面的/dev/null 21把正常输出和错误输出全丢进黑洞只保留我们自定义的[OK]或[FAIL]。参数$1是调用时传入的清单文件路径比如./check_port.sh ip_list.txt。如果你把超时改成timeout 5那就适合对网络延迟较大的设备做测试现场一般 2 秒够用。2.2 用脚本文件批量生成网络设备配置一个可直接改的模板网络建设与运维赛项里常要求给多台交换机创建 VLAN、划分接口、配置链路聚合。如果一台一台手敲既慢又容易漏最后核对配置时发现少了一条只能重来。常见做法是用一个循环脚本批量生成配置片段再贴进设备或者用 TFTP 传输。下面这个模板能在 5 分钟内生成 3 台交换机的 VLAN 配置#!/bin/bash # 批量生成交换机 VLAN 配置片段 # 用法./gen_vlan.sh生成到 config_out/ 目录 device_listsw1 sw2 sw3 vlan_start10 vlan_count5 mkdir -p config_out for dev in $device_list; do cat config_out/${dev}_vlan.txt EOF ! vlan batch ${vlan_start} to $((vlan_start vlan_count - 1)) ! interface GigabitEthernet 0/0/1 port link-type access port default vlan ${vlan_start} ! EOF echo 已生成 ${dev}_vlan.txt done逻辑说明for dev in $device_list遍历设备名cat 文件 EOF是 heredoc 语法把中间的内容写到文件里直到遇到单独的EOF结束。变量替换要注意${vlan_start}是普通变量展开$((vlan_start vlan_count - 1))是算术运算算出来是 14也就是生成了 VLAN 10 到 14。EOF这个结束标志必须顶格写不能有前导空格或 Tab否则会被当成普通文本写进文件。实际比赛里你可能会把device_list换成设备的实际名称把vlan_start和vlan_count改成赛题要求的数值。还有一个更进阶的玩法用 expect 脚本自动登录设备执行这些配置但 expect 对交互超时和设备回显很敏感稍不注意就卡在[Y/N]确认上。我的建议是能离线生成配置文件就不要用 expect除非赛题明确要求“必须通过脚本登录设备完成配置”。2.3 脚本文件里最常见的三个参数坑写脚本逻辑不难难的是那些看着莫名其妙的行为。我给自己学生列过一张“脚本文件参数避坑单”最常犯的就是下面三条。第一变量赋值时等号两边不能有空格。写成name TomShell 会认为name是一个命令是它的参数直接报command not found。正确写法是nameTom。这个坑在中文输入法切英文时尤其容易犯因为空格键一敲就习惯了。第二双引号和单引号的变量扩展规则不同。echo 路径是 $PATH会把$PATH展开成环境变量的值如果写echo 路径是 $PATH则原样输出$PATH这个字符串。在循环里处理带空格的文件名时如果忘了加双引号Shell 会把一个文件路径拆成两三个词导致No such file or directory。所以凡是引用变量的地方我一般都会默认加双引号除非明确要通配符展开。第三特殊字符会被提前解释。mkdir一个目录名字里带*或?时如果没加引号这些字符会被当前目录下的文件名替换掉变成一堆你没想到的参数。还有$(date)这类命令替换如果只是想用普通字符串一定要用单引号包起来。赛题里如果让你在脚本里写个带$的密码不用单引号的话密码里的$1、$2都会被当成位置参数直接变成空值。遇到这种情况我习惯先把密码写到一个单独文件脚本里用read读取而不是直接硬编码。这三个坑在赛场上属于“翻车率”最高的因为它们不会在语法检查时报错只有运行到那一行才炸。最好的办法是写完脚本后先不管逻辑对不对在本地用一个echo或者printf的干跑模式跑一遍把所有变量打出来看看再实际执行。3. 让脚本文件跑起来PowerShell 拒绝执行与命令识别不了的排查3.1 “无法将 pnpm 识别为 cmdlet”这一类报错的真正根源在比赛备赛阶段很多选手是在 Windows 上装了各种命令行工具然后打开 PowerShell 敲命令。如果你输入pnpm、claude、git、vcpkg或者wsl结果出现“无法将 pnpm 项识别为 cmdlet、函数、脚本文件或可运行程序的名称”的报错先别急着怀疑工具没装。这个报错的本质是PowerShell 在执行命令时会沿着 PATH 环境变量列出的目录去找对应的可执行文件如果找不到就报“识别为 cmdlet”错误。常见原因有三类工具确实没安装安装后没有把安装目录加入 PATH新装工具后没有重新打开终端PATH 没刷新。另外如果你在 PowerShell 里直接敲ls、grep这些 Linux 命令Windows 自带的 PowerShell 里其实有ls的别名但grep没有所以也会报错。这不算脚本文件的问题而是命令不存在。排查方法很简单用where.exe或者Get-Command看看到底有没有这个命令# 查看 pnpm 的实际路径 where.exe pnpm # 查看执行策略状态 Get-ExecutionPolicy -List如果where.exe能找到路径但执行还是报错那大概率是权限问题如果找不到就去检查安装目录是否在系统环境变量里。在国赛的 Linux 服务器上command -v pnpm也是同样的玩法可以用来确认命令是否存在。3.2 修改 PowerShell 执行策略放开脚本文件运行权限的两种方式另一个高频报错是“由于在此系统上禁止运行脚本”。如果你写了一个.ps1文件双击或者用 PowerShell 运行Windows 默认执行策略是 Restricted直接拒绝。国赛中如果要在 Windows 环境中跑自动化检查脚本必须先放开策略。有两种放开的粒度。临时放开只对当前 PowerShell 窗口有效关闭后恢复默认适合只跑一次的情况。永久修改针对当前用户以后每次打开 PowerShell 都能有效# 查看当前策略Restricted 表示禁止运行脚本 Get-ExecutionPolicy # 只对当前窗口放行无需管理员 Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass # 对当前用户永久放行允许本地脚本运行 Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned参数说明RemoteSigned表示本地创建的脚本可以直接运行从网络下载的脚本必须经过签名。如果比赛机器是完全隔离的也可以用Unrestricted省得下载来的脚本又触发限制。改完后一定要再用Get-ExecutionPolicy确认看到RemoteSigned才算成功。注意如果用管理员身份开 PowerShell还需要确认修改没有被组策略锁死否则会提示被覆盖。这里要提一句很多人遇到的npm.ps1无法加载就是执行策略卡住了 npm 的 PowerShell 脚本并不是 npm 本身坏了。改完策略之后npm命令一般就能正常跑。3.3 脚本文件语法检查跑之前先过这一遍写完脚本不检查就真刀真枪上赛场是备赛的大忌。常见做法是使用各语言的语法检查命令先扫一遍明显错误再实际执行。# Bash 语法检查只解析不执行报错会指出行号 bash -n check_port.sh # Python 语法检查编译成字节码同样不执行 python -m py_compile auto_backup.py # 调试执行打印每一条命令展开后的真实内容 bash -x check_port.sh ip_list.txtbash -n能抓住漏写fi、done、括号不成对这类低级错误但它不会发现变量名拼错或逻辑错误。想要追踪逻辑用bash -x跑一遍每条命令执行前Shell 会先展开变量然后把命令打印到标准错误前面带一个号。通过看号行的内容能直观发现 IP 地址是不是变成了空值、文件名是不是被拆碎。Python 这边py_compile主要是验证缩进和语法真正逻辑跑偏还得靠输出日志。我建议所有选手在 VS Code 里装上 ShellCheck 插件保存脚本时它会自动提示SC2086这类变量未加引号的警告。虽然比赛现场不一定允许装插件但备赛时用它养成习惯能明显减少“没写错但一跑就炸”的情况。4. 导出答案视频录制、压缩与提交的实操流程4.1 录屏参数怎么设分辨率、帧率与码率的取舍国赛要求导出答案视频本质上是把操作过程录下来作为裁判复核“你是不是真的自己做的”的证据。录屏软件一般选 OBS Studio免费、参数可控不会在关键时候弹广告。但参数设不好视频要么糊得看不清命令要么大到传输超时。我的建议是分辨率直接拉满到 1920x1080如果屏幕分辨率低于这个先在虚拟机里调高分辨率再录。有些选手嫌麻烦用默认的 1280x720结果回放时脚本里的单词都看不清评委只能看到光标在跳这样的视频等于没交。帧率不需要高15fps 足够因为命令行的操作变化频率很低30fps 只会让文件体积翻倍还白白占 CPU。码率方面H.264 编码下用 CRF 恒定质量模式值设在 22 到 25 之间既清晰又不会两小时产出 20GB。如果软件提供“CBR 码率”选项设 8Mbps 到 10Mbps 也是一个稳妥范围。录屏时还要注意音频轨除非常务规定要录制语音解说否则强烈建议关闭麦克风采集。开着麦克风不仅让文件变大比赛现场键盘声和环境噪音也会被录进去容易让裁判觉得你这边环境混乱。我用 OBS 的习惯是只录“显示采集”不录“显示器音频”导出 MP4因为 MP4 在任何播放器上都能解码。4.2 导出的答案视频如何和脚本文件对应命名与存档规范到了比赛后半段选手往往手忙脚乱录了视频想不起来哪段对应哪个任务。我给团队定的规则是每完成一个任务就录一段独立的视频不要全程录一个多小时。这样不仅回放方便出了问题也只影响一小段。命名统一按“任务号-步骤号_操作对象.mp4”来例如01-02_sw1_vlan.mp4 02-01_nginx_service.mp4 03-03_mysql_backup.mp4同时维护一个 CSV 清单把任务编号、视频文件、脚本文件、完成时间对应起来任务编号,操作对象,视频文件,脚本文件,完成时间(分钟),备注 01-02,sw1,01-02_sw1_vlan.mp4,01-02_sw1_vlan.sh,8,已核对 02-01,nginx,02-01_nginx_service.mp4,02-01_nginx_service.sh,6,端口状态需复查这个清单看着土但价值极大。它既是提交附件的目录索引又是你复盘时的进度表。如果某一项备注里写了“需复查”录像回放时直接拖到对应时间段几秒钟就能定位问题。比起黑匣子式地录一整场再回头大海捞针效率高一个量级。4.3 用脚本文件辅助生成导出的答案清单手动写 CSV 太容易漏文件尤其交卷前十分钟人一紧张就丢三落四。我写了一个 Python 脚本扫描答案目录下的视频和脚本自动生成带文件大小和时间戳的清单。这样不仅不会漏还能顺便检查文件是否都已生成# scan_answers.py # 用法python scan_answers.py 答案目录 输出csv import os import sys import csv from datetime import datetime def scan_dir(path): items [] for root, dirs, files in os.walk(path): for f in files: if f.endswith((.mp4, .sh, .py, .conf, .txt)): full os.path.join(root, f) stat os.stat(full) items.append({ name: f, path: full, size_kb: round(stat.st_size / 1024, 1), mtime: datetime.fromtimestamp(stat.st_mtime).strftime(%Y-%m-%d %H:%M:%S) }) return items if __name__ __main__: src sys.argv[1] if len(sys.argv) 1 else . out sys.argv[2] if len(sys.argv) 2 else answer_list.csv items scan_dir(src) with open(out, w, newline, encodingutf-8-sig) as f: writer csv.DictWriter(f, fieldnames[name, path, size_kb, mtime]) writer.writeheader() writer.writerows(items) print(f已生成 {out}共 {len(items)} 个文件)逻辑很简单os.walk递归遍历目录f.endswith过滤出常见的脚本和视频扩展名os.stat拿到文件大小和修改时间csv.DictWriter写表头和数据。注意编码用utf-8-sig这样生成的 CSV 用 Excel 打开不会中文乱码。参数说明sys.argv[1]是答案目录不填默认当前目录sys.argv[2]是输出 CSV 文件名。备赛最后一晚跑一遍这个脚本看到所有需要的 .mp4 和 .sh 都在列表里心里就有底了。5. 国赛脚本文件与答案导出的 5 个典型踩坑记录5.1 脚本文件相关的三个高频坑第一个坑CRLF 换行导致命令全部报错。现象是脚本在 Windows 上写好传到 Linux 执行每一行都蹦出$\r: command not found。原因是换行符没改成 LFBash 把回车符当成了命令的一部分。解决方法是sed -i s/\r$// 脚本名或者直接dos2unix并且编辑器统一设置行尾符为 LF。这个坑几乎每个赛季都会遇到一次血泪经验教训出来的。第二个坑PowerShell 提示“禁止运行脚本”。现象是在 Windows 上写好.ps1运行时报“因为在此系统上禁止运行脚本”。原因是执行策略默认是 Restricted。解决方法是Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned改完再确认一遍。如果只是在 VS Code 的终端里跑-Scope Process -ExecutionPolicy Bypass也可以临时绕过。第三个坑脚本权限不足。现象是./check.sh执行时提示Permission denied。原因是文件没有执行权限或者所在分区挂了noexec选项。解决方法是chmod x check.sh。如果是在挂载为 noexec 的分区上跑可以用bash check.sh直接让 Bash 解释执行绕开执行权限检查。比赛机上常见/home目录分区被设置了 noexec这时候把脚本挪到/tmp或者/usr/local/bin下跑也是一个办法。5.2 导出答案视频的两个致命坑第四个坑视频体积爆炸上传超时。现象是录了一个小时视频有 8GB提交时直接失败。原因是录屏参数没控制可能是默认的“无损”或超高码率。解决是用 ffmpeg 重新压一遍ffmpeg -i raw_video.mkv -c:v libx264 -crf 28 -preset fast -an output.mp4参数说明-c:v libx264指定 H.264 编码-crf 28表示恒定质量档位值越大文件越小、质量越低28 是性价比较高的起点-preset fast在压缩速度和文件大小之间取平衡-an直接去掉音轨。压完之后基本能缩小到原来的三分之一到五分之一视频里的命令行文字仍然清晰可读。第五个坑录屏黑屏只有鼠标光标。现象是录完回放画面全黑只能看到自己的鼠标在动。原因通常是虚拟机没有开启 3D 加速或录屏软件采集模式不对。解决方法是先关闭 Windows 的桌面合成器比如禁用 Aero 透明效果再换 OBS 的“显示捕获”而不是“窗口捕获”如果还是黑屏升级虚拟机的显卡驱动到标准 VGA。还有一种情况是持屏软件权限不够以管理员身份运行录屏程序就好了。6. 让脚本文件成为你的“后悔药”赛前自动化自检与备份技巧这一招是我带赛这几年压箱底的东西写一个“赛前自检脚本”开机后先跑它再动手配置。脚本会检查所有关键服务和端口把结果输出到带时间戳的文件里录屏开始前先把这个报告打开让镜头拍到。这样后面对答案视频每一段都能对应上自检报告中的状态。#!/bin/bash # pre_check.sh 比赛前30分钟运行 time$(date %Y%m%d_%H%M%S) reportcheck_${time}.txt services(nginx mysql sshd) for s in ${services[]}; do if systemctl is-active --quiet $s; then echo [OK] $s $report else echo [FAIL] $s $report fi done for p in 80 3306 22; do if ss -tlnp | grep -q :$p ; then echo [OK] 端口 $p 监听中 $report else echo [FAIL] 端口 $p 未监听 $report fi done echo 自检完成$report这个脚本的思路是用systemctl is-active检查服务运行状态ss -tlnp加上grep -q :$p 来判断端口是否被监听。-q参数让 grep 不输出内容只返回退出码。输出文件check_时间戳.txt会记录每一行状态之后对照视频里的时间轴一眼就能看出哪个服务在什么时刻挂了。我的习惯是进入考场第一件事不是敲命令而是先启动录屏然后跑一遍这个自检脚本。这样做有两个好处第一万一后面配置翻车可以用自检报告快速定位是开赛前就缺服务还是中途配置错误第二自检报告的文件名带时间戳相当于给视频标注了“基准时间”回放时看着报告能精准跳到对应操作段。去年带的一位选手就是因为自检发现 sshd 没有开机自启提前处理了最后没在服务部署题上丢分。这一招希望你也能用上。本文还有配套的精品资源点击获取
返回列表