refactor: 优化插件注册机制,消除启动时不必要实例化

- 添加RegisterPluginWithPorts高效注册方式,直接传递端口信息
- 优化关键服务插件(MySQL/SSH/Redis)使用新注册方式
- 移除无意义的反向适配函数GetPlugin/GetLocalPlugin
- 清理总是返回nil的无用接口,提升代码清晰度

性能优化:
* 消除服务插件注册时的实例创建开销
* MySQL/SSH/Redis等关键插件不再在启动时被实例化
* 简化插件获取流程,直接使用plugins.Get()

代码清理:
* 删除说谎的函数接口,遵循"不要说谎"原则
* 保持向后兼容:旧的RegisterPlugin仍可用但效率较低
* 所有插件控制逻辑和功能保持完整
This commit is contained in:
ZacharyZcR 2025-08-26 19:59:59 +08:00
parent d981f0100f
commit 3e0617f525
5 changed files with 26 additions and 29 deletions

View File

@ -26,19 +26,14 @@ func RegisterLocalPlugin(name string, creator func() Plugin) {
}) })
} }
func GetLocalPlugin(name string) Plugin { // GetAllLocalPlugins 获取所有本地插件名称
p := plugins.Get(name)
if p == nil {
return nil
}
// 这里需要反向适配但为了简化返回nil
return nil
}
func GetAllLocalPlugins() []string { func GetAllLocalPlugins() []string {
return plugins.All() return plugins.All()
} }
// 注意GetLocalPlugin函数已移除因为它总是返回nil没有任何意义
// 如需获取插件实例,请直接使用 plugins.Get(name)
// 适配器将Local插件转换为统一插件接口 // 适配器将Local插件转换为统一插件接口
type localPluginAdapter struct { type localPluginAdapter struct {
localPlugin Plugin localPlugin Plugin

View File

@ -144,7 +144,8 @@ func (p *MySQLPlugin) readMySQLBanner(conn net.Conn) string {
func init() { func init() {
RegisterPlugin("mysql", func() Plugin { // 使用高效注册方式:直接传递端口信息,避免实例创建
RegisterPluginWithPorts("mysql", func() Plugin {
return NewMySQLPlugin() return NewMySQLPlugin()
}) }, []int{3306, 3307, 33060})
} }

View File

@ -416,7 +416,8 @@ func (p *RedisPlugin) identifyService(ctx context.Context, info *common.HostInfo
// init 自动注册插件 // init 自动注册插件
func init() { func init() {
RegisterPlugin("redis", func() Plugin { // 使用高效注册方式:直接传递端口信息,避免实例创建
RegisterPluginWithPorts("redis", func() Plugin {
return NewRedisPlugin() return NewRedisPlugin()
}) }, []int{6379, 6380, 6381, 16379, 26379})
} }

View File

@ -264,7 +264,8 @@ func (p *SSHPlugin) readSSHBanner(conn net.Conn) string {
// init 自动注册插件 // init 自动注册插件
func init() { func init() {
RegisterPlugin("ssh", func() Plugin { // 使用高效注册方式:直接传递端口信息,避免实例创建
RegisterPluginWithPorts("ssh", func() Plugin {
return NewSSHPlugin() return NewSSHPlugin()
}) }, []int{22, 2222, 2200, 22222})
} }

View File

@ -19,31 +19,30 @@ type ExploitResult = plugins.ExploitResult
type Exploiter = plugins.Exploiter type Exploiter = plugins.Exploiter
type Credential = plugins.Credential type Credential = plugins.Credential
// 注册函数:适配旧插件到新系统 // RegisterPluginWithPorts 高效注册:直接传递端口信息,避免实例创建
func RegisterPlugin(name string, factory func() Plugin) { func RegisterPluginWithPorts(name string, factory func() Plugin, ports []int) {
// 获取插件端口信息
plugin := factory()
ports := plugin.GetPorts()
plugins.RegisterWithPorts(name, func() plugins.Plugin { plugins.RegisterWithPorts(name, func() plugins.Plugin {
return &servicePluginAdapter{factory()} return &servicePluginAdapter{factory()}
}, ports) }, ports)
} }
// 获取函数 // RegisterPlugin 向后兼容的注册函数(性能较低,但保持兼容性)
func GetPlugin(name string) Plugin { func RegisterPlugin(name string, factory func() Plugin) {
p := plugins.Get(name) // 获取插件端口信息 - 仍需实例化,但保持向后兼容
if p == nil { plugin := factory()
return nil ports := plugin.GetPorts()
}
// 为简化实现,这里不做反向适配 RegisterPluginWithPorts(name, factory, ports)
return nil
} }
// GetAllPlugins 获取所有插件名称
func GetAllPlugins() []string { func GetAllPlugins() []string {
return plugins.All() return plugins.All()
} }
// 注意GetPlugin函数已移除因为它总是返回nil没有任何意义
// 如需获取插件实例,请直接使用 plugins.Get(name)
var GenerateCredentials = plugins.GenerateCredentials var GenerateCredentials = plugins.GenerateCredentials
// 适配器将services插件转换为统一插件接口 // 适配器将services插件转换为统一插件接口