Runner
runner.sh 是套件编排器,负责按顺序执行套件目录中所有编号脚本、捕获输出并记录结果元数据。它安装在虚拟机的 /opt/traffic-generator/suites/runner.sh 路径下。
runner.sh <suite-name> [--dry-run]参数:
| 参数 | 是否必填 | 描述 |
|---|---|---|
suite-name | 是 | 套件目录名称(例如 web-app-attacks、api-attacks) |
--dry-run | 否 | 打印将要执行的内容,但不实际运行任何脚本 |
示例:
# 运行 web-app-attacks 套件/opt/traffic-generator/suites/runner.sh web-app-attacks
# 演练模式预览 api-attacks 脚本/opt/traffic-generator/suites/runner.sh api-attacks --dry-run
# 运行机器人模拟/opt/traffic-generator/suites/runner.sh bot-simulationconfig.env
Section titled “config.env”Runner 从 /opt/traffic-generator/config.env 读取配置:
# 必填:目标 FQDN(F5 XC 负载均衡器域名)TARGET_FQDN=demo.example.com
# 可选:用于基线测试的直接源站 IP(绕过 F5 XC)TARGET_ORIGIN_IP=该文件在 Terraform 部署时根据 target_fqdn 和 target_origin_ip 变量自动写入。若需在部署后更改目标,请直接在虚拟机上编辑此文件。
环境变量覆盖
Section titled “环境变量覆盖”config.env 中的任何变量均可在运行套件前通过导出方式覆盖:
# 仅为本次运行覆盖目标 FQDNTARGET_FQDN=staging.example.com /opt/traffic-generator/suites/runner.sh web-app-attacks
# 通过 export 覆盖export TARGET_FQDN=staging.example.com/opt/traffic-generator/suites/runner.sh web-app-attacks配置文件路径本身也可以被覆盖:
CONFIG_FILE=/tmp/my-config.env /opt/traffic-generator/suites/runner.sh web-app-attacks--dry-run 标志会打印每个将要执行的脚本,而不实际运行:
/opt/traffic-generator/suites/runner.sh web-app-attacks --dry-run输出:
=== 01-sqli.sh ===[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/01-sqli.sh demo.example.com=== 02-xss.sh ===[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/02-xss.sh demo.example.com=== 03-command-injection.sh ===[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/03-command-injection.sh demo.example.com=== 04-path-traversal.sh ===[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/04-path-traversal.sh demo.example.com=== 05-nikto-scan.sh ===[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/05-nikto-scan.sh demo.example.com=== 06-nuclei-scan.sh ===[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/06-nuclei-scan.sh demo.example.com=== Suite Complete ===Passed: 0 | Failed: 0 | Skipped: 6Results: /opt/traffic-generator/results/20260425-143000-web-app-attacks可使用演练模式在部署后验证套件结构,或在针对新目标运行套件前进行预览。
每次套件运行都会创建一个带时间戳的结果目录:
/opt/traffic-generator/results/<YYYYMMDD-HHMMSS>-<suite-name>/目录结构:
/opt/traffic-generator/results/20260425-143000-web-app-attacks/ meta.json 01-sqli.sh.log 02-xss.sh.log 03-command-injection.sh.log 04-path-traversal.sh.log 05-nikto-scan.sh.log 06-nuclei-scan.sh.log每个脚本的标准输出和标准错误均被捕获到以脚本命名的 .log 文件中。
meta.json 格式
Section titled “meta.json 格式”meta.json 文件记录套件执行的元数据:
{ "suite": "web-app-attacks", "target": "demo.example.com", "started": "2026-04-25T14:30:00Z", "completed": "2026-04-25T14:45:23Z", "status": "completed", "passed": 5, "failed": 1, "skipped": 0}| 字段 | 描述 |
|---|---|
suite | 套件名称 |
target | 本次运行使用的目标 FQDN |
started | 套件启动的 UTC 时间戳 |
completed | 套件完成的 UTC 时间戳 |
status | 执行期间为 running,完成后为 completed |
passed | 以退出码 0 退出的脚本数量 |
failed | 以非零退出码退出的脚本数量 |
skipped | 被跳过的脚本数量(不可执行或演练模式) |
单独运行脚本
Section titled “单独运行脚本”每个脚本均可在不使用 Runner 的情况下独立执行:
# 直接运行单个脚本/opt/traffic-generator/suites/web-app-attacks/01-sqli.sh demo.example.com
# 运行特定的 API 攻击脚本/opt/traffic-generator/suites/api-attacks/01-vampi-owasp-top10.sh demo.example.com脚本接受目标 FQDN 作为第一个位置参数。脚本不会直接读取 config.env——只有 Runner 才会读取。独立运行时,必须显式传入 FQDN。
按顺序运行所有套件
Section titled “按顺序运行所有套件”要依次运行所有套件:
for suite in web-app-attacks api-attacks bot-simulation reconnaissance ssl-scanning javascript-exploits traffic-generation; do echo "=========================================" echo "Starting suite: ${suite}" echo "=========================================" /opt/traffic-generator/suites/runner.sh "$suite" echo ""done这将在所有 F5 XC 安全功能上生成全面的流量。根据目标响应时间,完整运行预计需要 45 至 80 分钟。
通过 SSH 远程执行
Section titled “通过 SSH 远程执行”无需维持 SSH 会话,即可从本地计算机运行套件:
TGEN_IP=$(terraform output -raw public_ip)
# 运行单个套件ssh azureuser@${TGEN_IP} '/opt/traffic-generator/suites/runner.sh web-app-attacks'
# 运行套件并覆盖目标ssh azureuser@${TGEN_IP} 'TARGET_FQDN=staging.example.com /opt/traffic-generator/suites/runner.sh api-attacks'
# 在后台运行(断开连接后安全)ssh azureuser@${TGEN_IP} 'nohup /opt/traffic-generator/suites/runner.sh web-app-attacks > /tmp/web-app-attacks.log 2>&1 &'
# 稍后检查结果ssh azureuser@${TGEN_IP} 'ls -la /opt/traffic-generator/results/ | tail -5'ssh azureuser@${TGEN_IP} 'cat /opt/traffic-generator/results/$(ls -t /opt/traffic-generator/results/ | head -1)/meta.json'对于长时间运行的套件,请使用 nohup 或 tmux 防止 SSH 断开连接时进程被终止:
ssh azureuser@${TGEN_IP} 'tmux new-session -d -s traffic "/opt/traffic-generator/suites/runner.sh reconnaissance"'
# 稍后重新连接以查看进度ssh -t azureuser@${TGEN_IP} 'tmux attach-session -t traffic'-
加载配置 —— Runner 读取
config.env(或CONFIG_FILE覆盖路径),然后检查环境中的TARGET_FQDN。 -
验证套件 —— 确认指定套件目录存在于套件目录下。若未找到,则列出可用套件。
-
创建结果目录 —— 创建
/opt/traffic-generator/results/<timestamp>-<suite>/目录,并写入初始meta.json(status: running)。 -
执行脚本 —— 按名称排序遍历套件目录中匹配
[0-9]*的文件。跳过不可执行的文件。将TARGET_FQDN作为第一个参数传入。将输出捕获到<script-name>.log。 -
记录结果 —— 使用完成时间戳及通过/失败/跳过计数更新
meta.json。