與超時安全:`.inprogress` 哨兵、磁盤滿防護(hù)與并行作業(yè)超時機(jī)制深度解析)
滲透測試網(wǎng)絡(luò)安全應(yīng)用安全【免費(fèi)下載鏈接】reconftwreconFTW is a tool designed to perform automated recon on a target domain by running the best set of tools to perform scanning and finding out vulnerabilities項目地址https://gitcode.com/gh_mirrors/re/reconftw點(diǎn)擊查看免費(fèi)下載reconFTW 是面向 bug bounty、滲透測試與安全研究場景的 Bash 偵察編排框架其 Phase 1Resilient Resume Timeout Safety集中解決長時間掃描面臨的四類可靠性問題中斷后無法續(xù)跑、磁盤中途寫滿、并行批處理被卡死作業(yè)拖垮、DNS 枚舉無限期掛起。本文基于 01-CONTEXT.md 的完整設(shè)計決策D-01D-17結(jié)合 modules/core.sh、lib/parallel.sh、modules/utils.sh、modules/modes.sh 與 reconftw.cfg 的實際實現(xiàn)講清每個機(jī)制的觸發(fā)鏈路、配置方法與源碼級依據(jù)。讀完你既能掌握PRESERVEtrue續(xù)跑、PARALLEL_JOB_TIMEOUT_SECONDS限時等實戰(zhàn)配置也能理解這套設(shè)計為何選哨兵文件 EXIT trap而非 PID/時間戳方案。一、Phase 1 的邊界與目標(biāo)四項 v1 需求Phase 1 要解決的核心問題長時間掃描在遭遇中斷、磁盤壓力或卡死工具時不能靜默產(chǎn)出截斷結(jié)果也不能在續(xù)跑時浪費(fèi)數(shù)小時重復(fù)勞動。按 ROADMAP.md 的定義Phase 1 覆蓋 REQUIREMENTS.md 中的四項 v1 需求拆分為三個計劃計劃機(jī)制對應(yīng)需求01-01.inprogress哨兵生命周期 續(xù)跑檢測RESIL-0101-02函數(shù)邊界處周期性df檢查磁盤滿中途防護(hù)RESIL-0201-03lib/parallel.sh中PARALLEL_JOB_TIMEOUT_SECONDS強(qiáng)制執(zhí)行 reconftw.cfgDNS 超時默認(rèn)值RESIL-03、PERF-02范圍內(nèi)改動面生命周期包裝位于 modules/core.sh 的start_func/end_func并行作業(yè)機(jī)制位于 lib/parallel.sh磁盤輔助函數(shù)位于 modules/utils.sh四項配置默認(rèn)值位于 reconftw.cfg。明確不在范圍內(nèi)推遲到其他階段MIN_DISK_SPACE_GB的 2-vs-5 不一致問題DOCS-02Phase 5、逐工具線程上限PERF-01Phase 3、針對新超時/心跳路徑的并行覆蓋測試TEST-01Phase 4。從 PROJECT.md 可以看到Phase 1 的五項成果RESIL-01/02/03、PERF-02 及 01-04/01-05 兩個缺口修復(fù)均已標(biāo)記為 Validated說明下述設(shè)計與實現(xiàn)已經(jīng)落地為倉庫中的真實代碼。二、.inprogress哨兵生命周期與續(xù)跑檢測RESIL-012.1 哨兵文件的形態(tài)純空文件D-01設(shè)計決策 D-01 規(guī)定哨兵文件是一個純空文件${called_fn_dir}/.inprogress_fn。start_func負(fù)責(zé)touch創(chuàng)建它end_func負(fù)責(zé)在touch既有的.fn成功檢查點(diǎn)之前刪除它。不攜帶任何 JSON 元數(shù)據(jù)、PID 或時間戳。源碼印證modules/core.shstart_funcL1441-L1469function start_func() { # Mid-run disk-full guard (D-07/D-09): abort BEFORE any state write _check_disk_mid_run || _abort_disk_full ... # Resume sentinel (RESIL-01 / D-01): touch .inprogress_fn as a crash-leftover marker if [[ -n ${called_fn_dir:-} ]]; then touch $called_fn_dir/.inprogress_${1} 2/dev/null || true fi log_json INFO ${1} Function started description${2} ... }對應(yīng) modules/core.shend_funcL1471-L1507# Resume sentinel (RESIL-01 / D-01): remove .inprogress_fn BEFORE touching # the .fn success checkpoint. A crash between the rm and the touch leaves # .fn absent — the existing checkpoint guard re-enters the function on the # next run. .fn is the source of truth; .inprogress_fn is a surface # indicator only. if [[ -n ${called_fn_dir:-} ]]; then rm -f $called_fn_dir/.inprogress_${fn} 2/dev/null || true touch $called_fn_dir/.${fn} 2/dev/null || true fi關(guān)鍵語義.fn是事實來源決定是否重跑.inprogress_fn只是表面指示器用于發(fā)生了什么的報告不參與控制流。若函數(shù)在rm與touch之間崩潰.fn缺失下次運(yùn)行的檢查點(diǎn)守衛(wèi)會自然重入該函數(shù)——這正是透明續(xù)跑得以成立的原因見 2.5。2.2 過時檢測clean-exit-gated trapD-02D-02 規(guī)定過時檢測采用以干凈退出為門檻的 trap 清理機(jī)制modules/modes.sh 的start()L13 起初始化模塊級標(biāo)志_RECON_CLEAN_EXITfalse實際在 L16并安裝一個獨(dú)立的 EXIT-only trap調(diào)用_cleanup_inprogresstrap 清掃以_RECON_CLEAN_EXITtrue為門檻該值由end()工作流收尾函數(shù)的最后一條可執(zhí)行語句設(shè)置因此干凈遍歷不會殘留任何.inprogress_*文件而 SIGINT/SIGTERM經(jīng)由cleanup_on_exittrap 調(diào)用exit 130不會翻轉(zhuǎn)該標(biāo)志EXIT trap 以_RECON_CLEAN_EXITfalse觸發(fā)哨兵得以保留——下次運(yùn)行看到哨兵并發(fā)出 WARN 續(xù)跑橫幅。trap 安裝源碼modules/modes.sh L122-L123trap cleanup_on_exit INT TERM trap _cleanup_inprogress EXIT # silent EXIT-only sentinel sweep (D-02)標(biāo)志翻轉(zhuǎn)源碼modules/modes.sh L526-L532end()收尾# Mark clean traversal so the EXIT traps _cleanup_inprogress sweeps # ... (bypasses end() — SIGINT/SIGTERM via cleanup_on_exit, an # internal abort like _abort_disk_fulls exit 1, or an unhandled error) _RECON_CLEAN_EXITtrueEXIT trap 實現(xiàn)modules/utils.sh_cleanup_inprogressL153-L157function _cleanup_inprogress() { [[ ${_RECON_CLEAN_EXIT:-false} true ]] || return 0 [[ -n ${called_fn_dir:-} ]] rm -f ${called_fn_dir}/.inprogress_* 2/dev/null return 0 }注意start()中還已存在一個 ERR trapmodules/modes.sh L140 附近新增的 EXIT trap 必須與它組合而非替換——可通過單個注冊字符串鏈?zhǔn)綊於鄠€ handler或重構(gòu)為同時調(diào)用兩者的單一_recon_exit_hook。2.3 為何棄用 PID / 時間戳方案D-03D-03 解釋了選型的理由項目是單操作員、單目標(biāo)約束見 PROJECT.md Constraints 與 CLAUDE.md同一called_fn_dir永遠(yuǎn)不會被并發(fā)運(yùn)行競爭。這一約束使得目錄里還留著哨兵 之前崩潰過成為安全推斷從而完全不需要 PID 存活探測或時間戳過時窗口。PID 方案在長時運(yùn)行機(jī)器上還會因PID 回收而失效舊進(jìn)程的 PID 可能被新進(jìn)程復(fù)用導(dǎo)致誤判存活。因此規(guī)劃階段明確要求不要出于保險重新引入 PID/時間戳元數(shù)據(jù)——在單操作員約束下更簡單的設(shè)計才是正確的設(shè)計見原文檔 Specific Ideas 小節(jié)。2.4 續(xù)跑報告單行橫幅而非逐函數(shù)徽章D-04D-04 規(guī)定當(dāng)start()時發(fā)現(xiàn)一個或多個.inprogress_*文件在 recon 橫幅頂部輸出一行匯總WARN resume: N functions re-running after interruption (fn_a, fn_b)之后靜默繼續(xù)——不做逐函數(shù)RESUME徽章不在模塊區(qū)內(nèi)部增加額外噪聲。JSONL 日志同步輸出levelWARN funcresume reasoninprogress_leftover funcsfn_a,fn_b。該設(shè)計刻意保持OK/WARN/FAIL/SKIP徽章詞匯不變徽章詞匯表鎖定于 CONVENTIONS.md匯總行是唯一的續(xù)跑專屬 UI。橫幅渲染方式用現(xiàn)有_print_msg WARN還是新_print_resume_banner輔助函數(shù)屬于規(guī)劃層渲染選擇由于它是 WARN 級別在默認(rèn)OUTPUT_VERBOSITY1下即可見而_print_error路徑的磁盤滿錯誤則始終可見。2.5PRESERVEfalse清理與透明重執(zhí)行D-05 / D-06D-05PRESERVEfalse默認(rèn)在運(yùn)行開始前就會清空.fn檢查點(diǎn)同一個循環(huán)也必須清理任何孤兒.inprogress_*文件保證PRESERVEfalse的運(yùn)行永不報告續(xù)跑。而PRESERVEtrue時trap 清理 殘留檢測邏輯正是續(xù)跑得以工作的機(jī)制。D-06函數(shù)重執(zhí)行是透明的。既有檢查點(diǎn)守衛(wèi)[[ ! -f $called_fn_dir/.${FUNCNAME[0]} ]] || [[ $DIFF true ]]本就會重跑.fn不存在的函數(shù)——崩潰的函數(shù)從未到達(dá)end_func其.fn必然缺失守衛(wèi)自然重入。哨兵文件純粹服務(wù)于發(fā)生了什么的表面報告不驅(qū)動控制流。這與 ROADMAP.md 的成功標(biāo)準(zhǔn) 1 完全一致中斷sub_brute后以PRESERVEtrue重跑產(chǎn)生清晰的.inprogress_sub_brute指示且僅重執(zhí)行該函數(shù)——已完成的函數(shù)保留.func檢查點(diǎn)并被跳過。三、磁盤滿中途防護(hù)RESIL-023.1 檢查節(jié)奏每個函數(shù)邊界D-07D-07 規(guī)定檢查節(jié)奏為每次start_func/end_func邊界新增輔助函數(shù)_check_disk_mid_run位于 modules/utils.sh緊挨既有check_disk_space()start_func在既有函數(shù)體之前調(diào)用它end_func在 touch 檢查點(diǎn)之后調(diào)用它。源碼印證start_func第一行即_check_disk_mid_run || _abort_disk_fullmodules/core.sh L1444end_func在持久化.status_fn之后、收尾之前再次執(zhí)行_check_disk_mid_run || _abort_disk_fullmodules/core.sh L1575注釋明確說明在.fn與.status_fn可靠寫入之后執(zhí)行讓已完成的函數(shù)留下完整成功記錄在此中止可保護(hù)下一個函數(shù)不在無余量狀態(tài)下運(yùn)行。成本評估每次調(diào)用約 1ms一個掃描約 100 次函數(shù)邊界總開銷可忽略不引入后臺監(jiān)視進(jìn)程。3.2 閾值單一來源復(fù)用MIN_DISK_SPACE_GBD-08D-08 規(guī)定閾值就是 pre-flight 檢查所用的同一個MIN_DISK_SPACE_GB單一事實來源實現(xiàn)如下modules/utils.sh L449-L453# Mid-run disk-full check: thin wrapper around check_disk_space using MIN_DISK_SPACE_GB (D-07/D-08). function _check_disk_mid_run() { check_disk_space ${MIN_DISK_SPACE_GB:-5} ${dir:-.} return $? }底層的check_disk_space()modules/utils.sh L432-L447用df -Pk計算可用 GB跨 macOS/Linux 可移植返回 0/1 并填充DISK_SPACE_INFO。Phase 5DOCS-02將解決reconftw.cfg中MIN_DISK_SPACE_GB2reconftw.cfg L49與 modules/modes.shstart()中${MIN_DISK_SPACE_GB:-5}回退默認(rèn)值 5 之間的差異Phase 1 刻意不碰這兩處運(yùn)行期讀到哪個值就用哪個值也不引入獨(dú)立的中途旋鈕。3.3 中止策略整輪硬中止D-09D-09 規(guī)定磁盤滿時硬中止整個運(yùn)行_check_disk_mid_run返回非零 → 調(diào)用_abort_disk_full。實現(xiàn)modules/utils.sh L455-L460function _abort_disk_full() { _print_error disk_full: aborting (${DISK_SPACE_INFO:-disk space exhausted}) log_json ERROR ${FUNCNAME[1]:-main} Disk space exhausted reasondisk_full info${DISK_SPACE_INFO:-unknown} exit 1 }它輸出disk_full: aborting (availXGB, reqYGB at dir)形式的錯誤、記錄log_json ERROR disk_full abort_run然后exit 1。此時 D-02 的 Bash EXIT trap 會在退出路上觸發(fā)清空所有.inprogress_*——后續(xù)運(yùn)行不會看到虛假的續(xù)跑條件。軟中止與暫停等待方案均被否決單操作員項目快速失敗fail-fast才是正確選擇。3.4 ENOSPC 檢測機(jī)制僅邊界dfD-10D-10 明確檢測機(jī)制只有邊界df不做run_command的 stderr 掃描No space left on device不做每個重定向的失敗 trap。這是有意識接受的權(quán)衡某個工具在單個函數(shù)內(nèi)部耗盡磁盤如gotator寫出 2GB 詞表時該函數(shù)可能產(chǎn)生截斷輸出但下一次start_func會在造成進(jìn)一步破壞前中止整個運(yùn)行。pre-flight 5GB 余量 Phase 5 的 DOCS-02 對齊讓這種情況成為罕見邊緣場景對 v1 而言全量逐寫 trap 屬于過度設(shè)計。四、PARALLEL_JOB_TIMEOUT_SECONDS強(qiáng)制執(zhí)行RESIL-034.1 默認(rèn)值0禁用、顯式啟用D-11D-11 規(guī)定默認(rèn)值PARALLEL_JOB_TIMEOUT_SECONDS0禁用、opt-in隨 reconftw.cfg 發(fā)布并附文檔注釋明確建議長掃描用3600CI 運(yùn)行用600。這樣在運(yùn)行的掃描零風(fēng)險被過度激進(jìn)的默認(rèn)值殺死且向后兼容。實際配置reconftw.cfg L330-L331PARALLEL_JOB_TIMEOUT_SECONDS0 # 0 disables; e.g. 3600 for long scans, 600 for CI PARALLEL_KILL_GRACE_SECONDS10 # Seconds between TERM and KILL when enforcing PARALLEL_JOB_TIMEOUT_SECONDS規(guī)劃層面特意強(qiáng)調(diào)不要提議非零默認(rèn)值見原文檔 Specific Ideas。4.2 執(zhí)行點(diǎn)既有 batch-flush 心跳循環(huán)D-12D-12 規(guī)定執(zhí)行點(diǎn)位于既有的batch-flush 心跳循環(huán)lib/parallel.shparallel_funcs的 batch 等待區(qū)。該循環(huán)原本每PARALLEL_HEARTBEAT_SECONDS默認(rèn) 20s用kill -0 ${batch_pids[$idx]}輪詢存活 PID擴(kuò)展后為每個存活 PID 計算now - batch_starts[$idx]若超過PARALLEL_JOB_TIMEOUT_SECONDS且變量 0則調(diào)用_timeout_kill_job。實際源碼lib/parallel.sh L516-L524batch flush 心跳內(nèi)for idx in ${!batch_pids[]}; do if kill -0 ${batch_pids[$idx]} 2/dev/null; then alive1 job_dur$((now - batch_starts[$idx])) # Timeout enforcement (RESIL-03 / D-11..D-14): fires regardless of # verbosity (CR-02 fix). Uses hoisted _to from outer scope. if (( _to 0 )) (( job_dur _to )); then _timeout_kill_job ${batch_pids[$idx]} ${batch_funcs[$idx]} $job_dur fi ...CR-02 缺口修復(fù)使超時執(zhí)行與--quiet無關(guān)心跳循環(huán)在超時啟用或verbose 進(jìn)度開啟時即運(yùn)行見 L508 與 L629 的循環(huán)條件保證 CI 場景--quiet下超時依然生效。注意 lib/parallel.sh 的注釋還記錄了一個已知細(xì)節(jié)PARALLEL_HEARTBEAT_SECONDS0會完全禁用該循環(huán)從而也禁用超時執(zhí)行WR-05計劃在 Phase 5 DOCS-01 處理。4.3 殺進(jìn)程行為TERM 后 KILLD-13D-13 規(guī)定先 TERM 再 KILL新旋鈕PARALLEL_KILL_GRACE_SECONDS10默認(rèn)。_timeout_kill_job先發(fā)kill -TERM $pid隨后以 1 秒間隔輪詢kill -0 $pid直至寬限期結(jié)束若仍存活則kill -KILL $pid。這符合 Unix 關(guān)停語義并能對付無視 TERM 的工具。實現(xiàn)lib/parallel.sh_timeout_kill_jobL77-L105function _timeout_kill_job() { local pid$1 func_name$2 duration_sec$3 local grace${PARALLEL_KILL_GRACE_SECONDS:-10} [[ $grace ~ ^[0-9]$ ]] || grace10 _kill_tree $pid TERM local i for ((i0; igrace; i)); do kill -0 $pid 2/dev/null || break sleep 1 done _kill_tree $pid KILL ...CR-03 修復(fù)讓_timeout_kill_job切換為進(jìn)程樹擊殺_kill_treelib/parallel.sh L55-L66通過pgrep -P遞歸遍歷先信號化葉子節(jié)點(diǎn)再信號化父節(jié)點(diǎn)確保真正的底層外部工具puredns、dnsx、ffuf、axiom-scan 等被終止而不只是包裝子 shell——修復(fù)前的行為是只殺包裝 PID導(dǎo)致工具被孤兒化到 PID 1 后繼續(xù)超時運(yùn)行。若宿主機(jī)缺pgrep則優(yōu)雅退化為僅殺包裝與補(bǔ)丁前行為一致運(yùn)行不失敗。進(jìn)程組擊殺方案kill -- -pgid被否決因為 modules/modes.sh L17 顯式set m禁用了作業(yè)控制包裝子 shell 沒有獨(dú)立 pgid。4.4 超時報告FAIL reasontimeoutD-14D-14 規(guī)定被擊殺作業(yè)的徽章為FAIL原因timeout持久化到.status_fnFAIL與.status_reason_fntimeout復(fù)用 modules/core.sh 既有的狀態(tài)持久化模式原文檔引用 L1505-L1509當(dāng)前實現(xiàn)位于end_func的 L1547-L1552。批計數(shù)器failed于是RECON_PARTIAL_RUNtrue由既有聚合器自動跟隨??刂婆_徽章輸出FAIL func_name 600s (timeout)。_timeout_kill_job中的持久化與結(jié)構(gòu)化日志lib/parallel.sh L96-L104if [[ -n ${called_fn_dir:-} ]]; then printf FAIL\n ${called_fn_dir}/.status_${func_name} 2/dev/null || true printf timeout\n ${called_fn_dir}/.status_reason_${func_name} 2/dev/null || true fi if declare -F log_json /dev/null 21; then log_json ERROR ${func_name} Job timed out reasontimeout duration_sec${duration_sec} fi下游_parallel_emit_job_outputlib/parallel.sh L235-L363讀取這兩個文件并在 FAIL 徽章上渲染reason: timeout無需任何 schema 擴(kuò)展。實際殺延遲 閾值 約 1s心跳輪詢節(jié)奏PARALLEL_KILL_GRACE_SECONDS此計算已寫進(jìn) reconftw.cfg L328-L329 的注釋。4.5 本地與 Axiom 通用D-15D-15 強(qiáng)調(diào)超時對本地與 axiom 分布式作業(yè)同樣適用——兩者的并行批處理包裝是同一代碼路徑無特例。Axiom 無需改動超時擊殺發(fā)生在父 shell 的parallel_funcs心跳層、每個作業(yè)子 shell 之前從并行批處理內(nèi)部發(fā)起的 axiom 分布式作業(yè)在本地子 shell 層被擊殺axiom-scan命令被終止其本身會向遠(yuǎn)端節(jié)點(diǎn)發(fā)信號這已足夠。五、DNS 超時默認(rèn)值PERF-025.1 默認(rèn)值從0改為非零D-16D-16 規(guī)定 reconftw.cfg 中兩個 DNS 超時默認(rèn)值從0改為DNS_BRUTE_TIMEOUT6h # timeout/gtimeout duration for DNS bruteforce (0 disables hard-timeout). Default protects against hung resolvers. DNS_RESOLVE_TIMEOUT4h # timeout/gtimeout duration for DNS resolve (0 disables hard-timeout). Default protects against hung resolvers.當(dāng)前實現(xiàn)位于 reconftw.cfg L414-L415規(guī)劃文檔中的原始引用行號為 L387-L388隨階段推進(jìn)行號有位移。這兩個值都經(jīng)由_run_dns_with_heartbeatmodules/utils.sh L1434 附近透傳該輔助函數(shù)尊重0禁用——非零的h后綴時長被timeout/gtimeout原樣接受。輔助函數(shù)本身零代碼改動只改 cfg 默認(rèn)值加內(nèi)聯(lián)文檔注釋。5.2 超時觸發(fā)后的呈現(xiàn)D-17D-17 規(guī)定硬超時觸發(fā)時既有的_run_dns_with_heartbeat已經(jīng)返回非零并輸出清晰的日志行無需新增呈現(xiàn)邏輯——既有的徽章路徑end_func的WARN已足夠。JSONL 日志條目應(yīng)攜帶reasondns_hard_timeout讓下游工具Phase 4 測試、AI 報告能夠區(qū)分該原因。這與 ROADMAP.md 成功標(biāo)準(zhǔn) 4 一致新裝reconftw.cfg出廠即帶非零DNS_BRUTE_TIMEOUT6h與DNS_RESOLVE_TIMEOUT4h默認(rèn)值卡死的 DNS 運(yùn)行以日志化超時中止而不是無限期阻塞。它修復(fù)了 CONCERNS.md 中兩個硬超時守衛(wèi)默認(rèn)0禁用大詞表上的長 DNS 爆破可能無限期運(yùn)行的性能隱患。六、可復(fù)用資產(chǎn)與集成點(diǎn)速查6.1 既有可復(fù)用資產(chǎn)資產(chǎn)位置在 Phase 1 中的作用check_disk_space()modules/utils.sh L432已返回 0/1 并填充DISK_SPACE_INFO_check_disk_mid_run包裝它無需重實現(xiàn)df解析start_func/end_funcmodules/core.sh L1441 / L1471并行安全的逐函數(shù)開始時間戳與record_func_timing保留哨兵操作插入指定位置_run_dns_with_heartbeatmodules/utils.sh L1434已尊重0disabled并接受timeout/gtimeout風(fēng)格時長DNS 硬超時只改 cfg心跳循環(huán)lib/parallel.sh L508-L544 / L629-L665已迭代存活 PID超時擊殺檢查插入其中狀態(tài)持久化模式modules/core.sh L1547-L1552.status_fn與.status_reason_fn模式已存在超時報告D-14直接復(fù)用log_json輔助函數(shù)各模塊D-09、D-14、D-17 復(fù)用同一調(diào)用形態(tài)log_json LEVEL func msg keyval ...6.2 集成點(diǎn)清單start()modules/modes.sh L13安裝_cleanup_inprogress的 EXIT/INT/TERM trapD-02、在首個模塊開始前輸出續(xù)跑匯總橫幅D-04、承載PRESERVEfalse孤兒清理循環(huán)D-05。既有 ERR trapmodules/modes.sh L140 附近新 EXIT trap 必須與之組合而非替換。reconftw.cfg本階段四處配置——PARALLEL_JOB_TIMEOUT_SECONDS0、PARALLEL_KILL_GRACE_SECONDS10并行旋鈕應(yīng)緊鄰PARALLEL_HEARTBEAT_SECONDS文檔區(qū)實際位于 reconftw.cfg L328-L331以及DNS_BRUTE_TIMEOUT6h、DNS_RESOLVE_TIMEOUT4h兩處取值變更reconftw.cfg L414-L415。Axiom 無改動見 4.5 節(jié)。6.3 既有模式約束徽章詞匯表鎖定OK/WARN/FAIL/SKIP/CACHE/INFO/RUNCONVENTIONS.md。超時擊殺 FAILD-14磁盤滿中止 FAILD-09續(xù)跑提示 WARND-04不引入任何新徽章值。verbosity 門控OUTPUT_VERBOSITY0/1/2已管控哪些_print_msg/notification調(diào)用可見。續(xù)跑匯總行是 WARN 級別默認(rèn) verbosity 1 下可見磁盤滿錯誤走_(dá)print_error始終可見。CLI-over-config 重應(yīng)用本階段新增旋鈕如PARALLEL_KILL_GRACE_SECONDS不需要 CLI 標(biāo)志env-var/cfg 覆蓋已足夠若日后加標(biāo)志遵循reconftw.sh的CLI_*重應(yīng)用模式。Source guards本階段不新增 lib 文件全部改動進(jìn)既有 lib/parallel.sh、modules/core.sh、modules/utils.sh、modules/modes.sh、reconftw.cfg通過編輯既有文件保持 source-guard 模式。6.4 命名約定D-01 之外的私有輔助函數(shù)名_check_disk_mid_run、_abort_disk_full、_timeout_kill_job、_cleanup_inprogress遵循 CONVENTIONS.md 的下劃線前綴私有約定當(dāng)前源碼均以function關(guān)鍵字聲明符合函數(shù)命名規(guī)則。JSONL 日志的 key/value 拼寫reasoninprogress_leftover、reasontimeout、reasondns_hard_timeout沿用 modules/core.sh 既有模式。七、推遲項與邊界明確不做的內(nèi)容原文檔 Deferred 小節(jié)列出的刻意推遲項理解它們有助于避免在后續(xù)使用中誤以為存在缺失功能逐工具超時覆蓋如PARALLEL_TIMEOUT_DNS_BRUTE_SECONDSv1 討論后否決用戶可上調(diào)PARALLEL_JOB_TIMEOUT_SECONDS以容納最慢工具。僅在真實調(diào)優(yōu)需求出現(xiàn)后重新評估。函數(shù)中段的磁盤后臺心跳監(jiān)視器能在下一個邊界前捕獲單個函數(shù)燒盤但鑒于 5GB pre-flight 余量被否決為過度設(shè)計若遙測顯示截斷事件可在未來可觀測性里程碑考慮。逐重定向 ENOSPC trap包裹每個/最徹底但侵入全代碼庫v1 不在范圍內(nèi)。MIN_DISK_SPACE_GB2-vs-5 對齊明確歸 Phase 5DOCS-02Phase 1 刻意不碰 reconftw.cfg 與 modules/modes.sh 的取值。新代碼路徑的測試Phase 4TEST-01覆蓋parallel_funcs超時擊殺路徑哨兵生命周期與磁盤滿處理測試可并入該階段——Phase 1 交付行為Phase 4 交付覆蓋率。從 ROADMAP.md 可以看到Phase 1 還額外完成了 01-04_RECON_CLEAN_EXIT門控對應(yīng) RESIL-01/CR-01與 01-05超時執(zhí)行脫離--quiet門控 _kill_tree進(jìn)程樹擊殺對應(yīng) RESIL-03/CR-02、CR-03兩個缺口閉合計劃。八、實戰(zhàn)配置速查將以下配置應(yīng)用于 reconftw.cfg 即可啟用 Phase 1 的三大實戰(zhàn)能力# --- 續(xù)跑RESIL-01--- # PRESERVEtrue 時中斷后重跑會檢測 .inprogress_* 哨兵并只重執(zhí)行崩潰函數(shù) PRESERVEtrue # --- 磁盤滿中途防護(hù)RESIL-02--- # 閾值沿用 pre-flight 的 MIN_DISK_SPACE_GB注意 cfg 寫 2、modes.sh 回退 5 的差異歸 Phase 5 MIN_DISK_SPACE_GB5 # --- 并行作業(yè)超時RESIL-03--- # 0 禁用長掃描建議 3600CI 建議 600 PARALLEL_JOB_TIMEOUT_SECONDS600 # 先 TERM、寬限期后仍存活再 KILL 的間隔秒數(shù) PARALLEL_KILL_GRACE_SECONDS10 # --- DNS 硬超時PERF-02--- # 0 禁用硬超時默認(rèn)值已保護(hù)免受掛死 resolver 阻塞 DNS_BRUTE_TIMEOUT6h DNS_RESOLVE_TIMEOUT4h典型場景與預(yù)期行為中斷續(xù)跑sub_brute執(zhí)行中被 Ctrl-C → 重跑PRESERVEtrue→ 橫幅輸出WARN resume: 1 functions re-running after interruption (sub_brute)其余已完函數(shù)因.fn存在被跳過。磁盤寫滿運(yùn)行中途可用空間跌破MIN_DISK_SPACE_GB→ 下一函數(shù)邊界_check_disk_mid_run失敗 →_abort_disk_full輸出disk_full: aborting (...)并exit 1EXIT trap 順帶清理哨兵后續(xù)運(yùn)行不誤報續(xù)跑??ㄋ拦ぞ吣巢⑿凶鳂I(yè)超過PARALLEL_JOB_TIMEOUT_SECONDS→_kill_tree TERM寬限 10s→_kill_tree KILL→ 徽章FAIL func_name 600s (timeout)failed使RECON_PARTIAL_RUNtrue批次繼續(xù)而非整體停擺。DNS 掛起resolver 卡死導(dǎo)致 DNS 爆破超過6h/ 解析超過4h→_run_dns_with_heartbeat經(jīng)timeout/gtimeout終止并返回非零日志攜帶reasondns_hard_timeoutend_func以WARN徽章呈現(xiàn)。九、總結(jié)Phase 1 以哨兵文件 干凈退出門控 trap替代 PID/時間戳方案把續(xù)跑檢測收斂為純表面指示讓控制流繼續(xù)由.fn檢查點(diǎn)驅(qū)動以邊界df檢查 硬中止攔截磁盤寫滿避免截斷輸出污染后續(xù)管線以heartbeat 循環(huán)內(nèi)的 TERM→KILL 進(jìn)程樹擊殺為并行批處理提供每作業(yè)時限并以6h/4h的 DNS 硬超時默認(rèn)值堵住無限阻塞。四者共用既有徽章詞匯、log_json形態(tài)與狀態(tài)持久化模式未新增任何配置之外的運(yùn)行面——整套設(shè)計在單操作員、fail-fast、向后兼容三大約束下用最小的機(jī)制面換取確定性的恢復(fù)與中止語義。對希望在長時偵察中保住已投入計算、又能防止環(huán)境故障靜默劣化輸出的使用者而言這四項配置與行為是優(yōu)先理解的可靠性基座。贊分享滲透測試網(wǎng)絡(luò)安全應(yīng)用安全【免費(fèi)下載鏈接】reconftwreconFTW is a tool designed to perform automated recon on a target domain by running the best set of tools to perform scanning and finding out vulnerabilities項目地址https://gitcode.com/gh_mirrors/re/reconftw點(diǎn)擊查看免費(fèi)下載相關(guān)推薦ESPHome 完整指南4 步讓 ESP8266 說出溫濕度數(shù)據(jù)ESPHome 完整指南4 步讓 ESP8266 說出溫濕度數(shù)據(jù) 抽屜里那塊吃灰的 NodeMCU加上不到 50 行的 YAML幾分鐘之后它的溫濕度讀數(shù)就滲透測試網(wǎng)絡(luò)安全應(yīng)用安全如何購買第一臺云服務(wù)器用于個人知識庫網(wǎng)站如何購買第一臺云服務(wù)器用于個人知識庫網(wǎng)站 《toBeBetterJavaer》二哥的Java進(jìn)階之路在「知識庫搭建」章節(jié)完整記錄了它的知識庫網(wǎng)站從碼云 P滲透測試網(wǎng)絡(luò)安全應(yīng)用安全Grist如何用關(guān)系型表格管理復(fù)雜數(shù)據(jù)Grist如何用關(guān)系型表格管理復(fù)雜數(shù)據(jù) 客戶表、訂單表、跟進(jìn)記錄三張表各放各的。改一個客戶名十幾處要手動同步。Grist 是一種關(guān)系型表格工具每列有固定滲透測試網(wǎng)絡(luò)安全應(yīng)用安全上一篇OOTDiffusion 內(nèi)置 Detectron2 快速上手命令行推理、訓(xùn)練與評估實戰(zhàn)指南下一篇Depth Anything Preprocessor節(jié)點(diǎn)API兼容性錯誤深度解析與完整修復(fù)指南創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考