From 2b202aa298b19229f71f04ee6d3a8a4d5faa970c Mon Sep 17 00:00:00 2001 From: ZacharyZcR Date: Sat, 13 Jun 2026 23:04:22 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=AE=A9=20-gt=20=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E8=B6=85=E6=97=B6=E5=8F=82=E6=95=B0=E7=9C=9F=E6=AD=A3=E7=94=9F?= =?UTF-8?q?=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -gt 参数之前是死代码:flag 定义了 GlobalTimeout 但从未被使用。 现在在 RunScan 中用它创建带 deadline 的 context, 超时后所有扫描任务(端口扫描、插件执行)被取消。 --- common/config_struct.go | 3 +++ common/flag_config.go | 3 +++ core/scanner.go | 12 +++++++++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/common/config_struct.go b/common/config_struct.go index 9f2183f..48fec0d 100644 --- a/common/config_struct.go +++ b/common/config_struct.go @@ -61,6 +61,9 @@ type Config struct { LocalExploit LocalExploitConfig Target TargetConfig // 扫描目标配置 + // 全局超时 + GlobalTimeout time.Duration + // SOCKS5代理端口配置 Socks5ProxyPort int // SOCKS5代理端口 } diff --git a/common/flag_config.go b/common/flag_config.go index f1759a4..ea28d5a 100644 --- a/common/flag_config.go +++ b/common/flag_config.go @@ -169,6 +169,9 @@ func BuildConfigFromFlags(fv *FlagVars) *Config { PortMap: clonePortMap(config.DefaultPortMap), DefaultMap: cloneStringSlice(config.DefaultProbeMap), + // 全局超时 + GlobalTimeout: time.Duration(fv.GlobalTimeout) * time.Second, + // SOCKS5代理端口 Socks5ProxyPort: fv.Socks5ProxyPort, diff --git a/core/scanner.go b/core/scanner.go index 7dd6632..dd1bc9a 100644 --- a/core/scanner.go +++ b/core/scanner.go @@ -94,10 +94,16 @@ func selectStrategy(config *common.Config, state *common.State, info common.Host // RunScan 执行整体扫描流程 func RunScan(ctx context.Context, info common.HostInfo, session *common.ScanSession) (ScanReport, error) { start := time.Now() - ctx, cancel := context.WithCancel(ctx) - defer cancel() - config := session.Config + + // 全局超时:-gt 参数设置整个扫描的硬性截止时间 + var cancel context.CancelFunc + if config.GlobalTimeout > 0 { + ctx, cancel = context.WithTimeout(ctx, config.GlobalTimeout) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() state := session.State // 设置全局 State(兼容旧代码路径中未传 state 的调用)