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),仅供参考

相关新闻

腾讯云轻量服务器续费与升配实操指南:成本、弹性与架构演进

腾讯云轻量服务器续费与升配实操指南:成本、弹性与架构演进

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 6:02:11 阅读更多 →
DDR4信号完整性仿真实战:从SystemSI流程到眼图分析

DDR4信号完整性仿真实战:从SystemSI流程到眼图分析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 6:02:11 阅读更多 →
LightTools 2024安装指南:解决multikey.sys驱动与测试模式问题

LightTools 2024安装指南:解决multikey.sys驱动与测试模式问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 6:02:11 阅读更多 →

最新新闻

用 AI 处理敏感数据前,先分清这三层的边界

用 AI 处理敏感数据前,先分清这三层的边界

问题的本质 「AI 会不会泄露我的数据」这个问题问得太笼统。把它拆成三层,答案就清楚了:数据在哪一层,决定了它有没有出网。 第一层:模型层(生成建议) 你把数据贴进对话框,让 AI 帮你写方法、…

2026/9/24 6:40:36 阅读更多 →
计算机复试PDF资料处理指南:从解析、转换到高效整理

计算机复试PDF资料处理指南:从解析、转换到高效整理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 6:40:36 阅读更多 →
Rich 98三模PCB简要使用文档

Rich 98三模PCB简要使用文档

键盘使用说明索引(均为出厂默认值)注意保修期首次使用步骤USB,蓝牙,2.4G如何切换以及配对连接驱动驱动会列出系统内可识别的所有LDN三模键盘,连接设备名字为3M Rich98的键盘即可。默认层触发测试电量其他问题&#xff…

2026/9/24 6:40:36 阅读更多 →
Jetson适配GMSL相机板实战:Waveshare MAX9296A深度解析

Jetson适配GMSL相机板实战:Waveshare MAX9296A深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 6:40:36 阅读更多 →
从嘉立创EDA到Altium Designer:完整迁移流程与修复指南

从嘉立创EDA到Altium Designer:完整迁移流程与修复指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 6:40:36 阅读更多 →
DAB双有源桥变换器:移相控制与软开关的工程实践指南

DAB双有源桥变换器:移相控制与软开关的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 6:39:36 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →