ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Sliver 控制台主题与提示符定制指南:theme.yaml 调色板与 Go 模板驱动 Prompt

Sliver 控制台主题与提示符定制指南:theme.yaml 调色板与 Go 模板驱动 Prompt 网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载SliverAdversary Emulation Framework的交互式控制台——无论是sliver-client还是服务端专用控制台——全部基于 lipgloss 样式引擎渲染而驱动这一切样式的核心是两份用户目录下的配置文件主题文件theme.yaml与界面设置文件tui-settings.yaml。本文完整讲解六套调色板Palette的结构与默认值、四种prompt模式的切换逻辑以及基于 Gotext/template的prompt_template自定义语法并深入源码层client/theme/theme.go、client/assets/settings.go、client/console/console.go印证每一处配置的实际生效链路。读完本文你将能够自主修改 Sliver 控制台配色、切换提示符风格甚至编写出带会话名、操作者身份、主机与端口的动态彩色提示符。一、配置文件位置与加载机制Sliver 的交互式控制台sliver-client与 server-only 控制台用一份主题文件驱动全部 lipgloss 样式相关路径如下主题文件~/.sliver-client/theme.yaml设置文件~/.sliver-client/tui-settings.yaml如果theme.yaml不存在Sliver 会自动使用默认调色板创建该文件。从源码看这个“自动创建”的职责由 client/theme/theme.go 中的EnsureThemeFile()承担当目标路径不存在且未发生其他 I/O 错误时它会将内置常量DefaultThemeYAML以0600权限写入磁盘随后LoadThemeFromDisk()读取并解析 YAMLLoadAndSetCurrentTheme()一次性完成“确保存在 → 读取 → 解析 → 设置当前主题”的完整链路。值得注意的几点实现细节进程启动时init()会先解析内置的DefaultThemeYAML作为内存兜底主题因此即使磁盘文件缺失或损坏控制台也始终有可用配色若默认 YAML 本身解析失败还会退化为一个更基础的内置主题primary 为#006FEE、default 为#ffffff。每个 Palette 解析后会经过normalizePalette处理保证modsmap 非空避免后续取色时出现 nil map 问题。设置文件tui-settings.yaml的加载逻辑在 client/assets/settings.go 的LoadSettings()中优先读取 YAML 新格式若不存在会尝试兼容旧的tui-settings.jsonJSON 字段如prompt、tables迁移成功后旧文件会被重命名。加载后PromptStyle会经过NormalizePromptStyle()归一化未知或空值一律回退为host模式。二、Palette 结构六套调色板与十级修饰色theme.yaml定义了六套调色板PalettePalette 名称语义默认 base 色primary主强调色#006FEEsecondary次强调色#9353d3default中性基准色#3f3f46success成功语义色#17c964warning警告语义色#f5a524danger危险/错误语义色#f31260每套 Palette 由一个 basedefault颜色和一组编号修饰色50到900组成。primary的完整结构如下primary: default: #006FEE mods: 50: #001731 100: #002e62 200: #004493 300: #005bc4 400: #006FEE 500: #338ef7 600: #66aaf9 700: #99c7fb 800: #cce3fd 900: #e6f1fe其余五套调色板结构完全相同可参考内置默认文件 client/theme/default_theme.go 中的DefaultThemeYAML常量获取全部默认色值。从代码结构看mods是一个map[int]stringkey 为色阶编号value 为十六进制颜色字符串default则对应 400 色阶本身。取色逻辑在 client/theme/theme.go 中paletteColor(p)若default非空则直接返回该色否则防御性回退到白色#ffffffpaletteMod(p, mod)当传入的色阶编号非 0、且能在mods中查到有效值时返回对应修饰色否则回落到 basedefault色。对应地包级函数Primary()、PrimaryMod(mod)、Secondary()、Success()等分别返回当前主题Current()中六套调色板的 base 色与指定色阶色。这意味着你在自定义提示符模板中通过.Colors.Primary.Mods引用的值与代码中theme.PrimaryMod(500)取到的是同一份数据。三、tui-settings.yaml 与 prompt 模式控制台提示符由tui-settings.yaml中的prompt与prompt_template两个键控制prompt: host prompt_template: | {{- if .IsServer -}} {{ .Styles.Bold.Render [server] }} {{ .Styles.Underline.Render sliver }}{{ .Target.Suffix }} {{- else -}} {{- if .Host -}}{{ .Styles.BoldPrimary.Render (printf [%s] .Host) }} {{- end -}} {{ .Styles.Underline.Render sliver }}{{ .Target.Suffix }} {{- end -}}prompt支持四种模式其常量定义与归一化逻辑位于 client/assets/settings.go1.hostsliver-client[host] sliver server console[server] sliver 这是默认模式defaultSettings()中PromptStyle初始值即PromptStyleHost。当prompt缺失、为空或填写了无法识别的值时NormalizePromptStyle()也会归一化回此模式。2.operator-hostsliver-client[operatorhost] sliver server console[server] sliver 该模式在客户端提示符中同时展示操作者名与服务器主机名从 client/console/console.go 的GetPrompt()可知它会依次取连接配置中的Operator与LHost按“操作者主机 → 仅操作者 → 仅主机”的优先级组合前缀。注意NormalizePromptStyle还保留了若干向后兼容别名例如show user and host、show operator and host、operatorhost、userhost都会被归一化为operator-host。3.basic两种控制台均为sliver 最简模式不显示任何前缀。源码中promptStyle ! PromptStyleBasic是决定是否渲染[server]或[host]前缀的判断条件。4.custom整个提示符文本完全由prompt_template渲染Gotext/template若模板渲染失败语法错误或执行错误Sliver 回退为极简提示符前置Clearln转义序列用于清行。在GetPrompt()的实现中custom分支会优先采用con.Settings.PromptTemplate非空白否则使用内置的DefaultPromptTemplate即上文示例中的默认模板。模板对象带missingkeyzero选项并被缓存见 client/console/prompt_template.go意味着模板中引用不存在的键不会报错而是返回零值。此外如果渲染结果为空字符串同样会退化为。在图形化设置表单中这四个模式会以huh选择器的形式出现在settings命令里client/forms/settings.go当用户选择custom后控制台会提示手动编辑tui-settings.yaml中的prompt_templateclient/command/settings/settings.go。四、自定义 Prompt 模板完整变量参考当prompt: custom时prompt_template会在每次显示提示符时作为 Gotext/template重新求值因此你可以在模板中放入随时间或上下文变化的动态内容如当前时间.Now、当前选中的会话名。顶层变量变量类型说明.IsServerbool当前是否为服务端控制台.Connectedbool是否已建立连接基于当前连接配置是否存在.Operatorstring操作者名称来自连接配置Operator已去除首尾空白.Hoststring服务器主机名来自连接配置LHost.Portint服务器端口来自连接配置LPort.HostPortstringhost:port组合字符串host 与 port 均非空时才生成.Nowtime当前时间time.Time活动目标Active Target变量类型说明.Target.SessionNamestring当前选中会话的名称.Target.BeaconNamestring当前选中 Beacon 的名称.Target.Suffixstring预渲染的、带主题色的后缀与默认提示符风格一致例如选中会话后为(my-session)Suffix的生成逻辑同样在GetPrompt()与renderPromptTemplate()中选中会话时用StyleBoldRed渲染(sessionName)选中 Beacon 时用StyleBoldBlue渲染(beaconName)二者均附加在之前。主题颜色Theme Colors.Colors.Primary.Default— primary 调色板 base 色.Colors.Primary.Mods— primary 修饰色 map通过index取用如index .Colors.Primary.Mods 500Secondary、Default、Success、Warning、Danger五套调色板结构与Primary完全相同。这些颜色在渲染时被转换为 lipgloss 可用的color.Color供.Foreground等样式方法使用。主题样式Theme StylesStyles下的每个成员都是已与theme.yaml打通的 lipgloss 样式对象直接调用.Render(...)即可输出带样式的文本基础样式.Styles.Bold、.Styles.Underline六套调色板对应样式.Styles.Primary、.Styles.Secondary、.Styles.Default、.Styles.Success、.Styles.Warning、.Styles.Danger加粗变体.Styles.BoldPrimary、.Styles.BoldSecondary、.Styles.BoldDefault、.Styles.BoldSuccess、.Styles.BoldWarning、.Styles.BoldDanger旧版颜色名兼容历史代码库.Styles.Red、.Styles.Green、.Styles.Orange、.Styles.Blue、.Styles.Purple、.Styles.Cyan、.Styles.Gray、.Styles.Black这些样式定义在 client/console/style.go 中TextStyle即lipgloss.Style的类型别名因此.Render、.Foreground、.Bold、.Underline等 lipgloss 方法均可链式使用。提示符渲染时client/console/prompt_template.go 会把theme.Current()中的六套调色板映射为promptColors/promptStyles结构注入模板上下文这就是模板中.Colors.*与.Styles.*的数据来源。五、模板实战示例1. 显示操作者与主机客户端/ 显示服务端标签server console{{- if .IsServer -}} {{ .Styles.Bold.Render [server] }} {{ .Styles.Underline.Render sliver }}{{ .Target.Suffix }} {{- else -}} {{- if and .Operator .Host -}} {{ .Styles.BoldPrimary.Render (printf [%s%s] .Operator .Host) }} {{- else if .Host -}} {{ .Styles.BoldPrimary.Render (printf [%s] .Host) }} {{- end -}} {{ .Styles.Underline.Render sliver }}{{ .Target.Suffix }} {{- end -}}效果sliver-client端显示[operatorhost] sliver 服务端控制台显示[server] sliver 。若操作者信息缺失则退化为[host] sliver 。模板中的printf是 Go 模板内建函数{{- ... -}}用于修剪两侧空白保证输出无多余空行。2. 处处显示基础提示符{{ .Styles.Underline.Render sliver }}{{ .Target.Suffix }} 输出sliver 或选中目标后的sliver (my-session) 等价于basic模式的视觉表现但保留会话后缀。3. 用较浅的主色修饰色渲染主机标签{{- $c : index .Colors.Primary.Mods 500 -}} {{- if .Host -}}{{ (.Styles.Bold.Foreground $c).Render (printf [%s] .Host) }} {{- end -}} {{ .Styles.Underline.Render sliver }}{{ .Target.Suffix }} 这里先用index从modsmap 中取出 500 色阶#338ef7比 base 色#006FEE更浅再通过.Foreground $c链式构造出带前景色的加粗样式仅对主机标签着色。由于.Styles.Bold是已初始化的 lipgloss 样式.Foreground返回新样式而不污染原对象可安全复用。六、源码级验证提示符渲染的完整调用链将文档描述与实现对照可以得到如下可验证的渲染链路启动时 client/theme/theme.go 的init()解析内置DefaultThemeYAML作为兜底主题EnsureThemeFile()保证~/.sliver-client/theme.yaml存在。设置加载时 client/assets/settings.go 的LoadSettings()读取tui-settings.yaml兼容旧 JSON并用NormalizePromptStyle()归一化prompt值未知值回退host。每次渲染提示符时client/console/console.go 的GetPrompt()根据归一化后的PromptStyle分支custom→ 用renderPromptTemplate()client/console/prompt_template.go解析并执行模板失败或输出为空时回退其他模式 → 按basic/host/operator-host组合前缀再叠加会话红色或 Beacon蓝色后缀。模板上下文中的.Colors与.Styles分别来自theme.Current()的六套调色板和 client/console/style.go 预定义的 lipgloss 样式保证“改theme.yaml即全局换肤”。配套测试位于 client/assets/settings_test.go覆盖了各 prompt 模式及旧别名归一化行为可作为验证配置是否符合预期的参考。七、实用提示修改后即时生效主题与提示符设置在下次渲染提示符时即被读取无需重启控制台但若已打开sliver-client建议在连接新服务器或重载设置后再观察效果。权限安全theme.yaml与tui-settings.yaml均以0600权限写入os.WriteFile第三参数与密钥类文件的保护级别一致无需手动调整。模板调试custom模式下若提示符异常退化为通常是模板语法错误或引用了不存在的样式/颜色键优先检查prompt_template的缩进与{{-/-}}空白控制符是否配对以及色阶编号是否落在50..900的已定义范围内。与settings命令结合在控制台执行settings可查看/修改Prompt风格等选项选择custom后控制台会提示Edit tui-settings.yaml to set prompt_template指引你直接编辑模板。赞分享网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载相关推荐CANN/asc-devkitint32转int16向量转换函数asc_int322int16 产品支持情况 | 产品 | 是否支持 | | | : : | | Ascend 950PR/Ascend 950DT | √ |AI 应用NLPCLI自定义控制器提示模板自定义控制器提示模板 要求 使用 Spring Boot 注解 包含参数验证 统一的异常处理 日志记录 返回标准响应格式 示例模式 PostMapping 人工智能大模型AI Agent代码智能体开发工具工具调用后端前端mkdocstrings 主题定制与模板开发指南mkdocstrings 主题定制与模板开发指南 项目介绍 mkdocstrings 是一个强大的文档生成工具它能够自动从源代码中提取文档字符串并集成到 Mk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表