Runner
runner.sh 是套件協調器,負責依序執行套件目錄中所有已編號的腳本、擷取輸出並記錄結果元資料。它安裝於 VM 上的 /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 變數自動寫入。若要在部署後變更目標,請直接在 VM 上編輯此檔案。
環境變數覆蓋
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。 -
驗證套件 — 確認指定的套件目錄存在於 suites 目錄下。若未找到,則列出可用套件。
-
建立結果目錄 — 建立
/opt/traffic-generator/results/<timestamp>-<suite>/並寫入初始meta.json,狀態設為status: running。 -
執行腳本 — 依名稱排序後,迭代套件目錄中符合
[0-9]*的檔案。略過不可執行的檔案。將TARGET_FQDN作為第一個引數傳入。將輸出擷取至<script-name>.log。 -
記錄結果 — 以完成時間戳記及通過/失敗/略過的計數更新
meta.json。