ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

gopass create 命令全解:基于 YAML 模板的新密钥创建向导与实战配置

gopass create 命令全解:基于 YAML 模板的新密钥创建向导与实战配置 应用安全开发工具【免费下载链接】gopassThe slightly more awesome standard unix password manager for teams项目地址https://gitcode.com/gh_mirrors/go/gopass点击查看免费下载导读gopass create是 gopass 密码管理器中面向新手设计的密钥创建向导wizard它通过一套可自定义的 YAML 模板引导用户逐步录入网站登录、PIN 码、SSO 账号、AWS 凭证等各类密钥并自动生成合理的存储路径。本文将以 docs/commands/create.md 为核心骨架结合internal/create包与internal/action/create.go的源码实现完整讲解命令用法、模板目录机制、模板结构与属性字段的精确定义、四种属性类型的输入行为以及--store/--force/--print等标志的底层作用。读完本文你将能够为团队或自己的 store 编写出可复用的密钥创建模板并理解向导背后每一步的实现原理。命令概览设计目标与基本用法create命令的设计目标很明确引导用户完成密钥的创建并在过程中收集足够的信息以生成一个合理的密钥存储位置。它面向的是经验不足的用户把新建密钥这件原本需要理解 store 结构、路径规范、密码生成策略的复杂操作简化成一系列有明确提示的问答。命令注册位置在 internal/action/commands.go别名new使用说明为 Easy creation of new secrets参数为可选的[secret]仅在--force下使用并且注册了Before: s.IsInitialized钩子——这意味着必须先初始化 store 才能使用该命令。基本语法来自 docs/commands/create.mdgopass create gopass create --storefoo在默认无参数情况下命令会启动向导打印欢迎信息 Welcome to the secret creation wizard (gopass create)!以及提示 Hint: Use gopass edit -c for more control!解析选定 store默认根 store的.gopass/create/目录下所有模板如果只有 1 个模板直接执行如果有多个则通过cui.GetSelection弹出选择菜单让用户挑选要创建的密钥类型见 internal/action/create.go。源码细节create的实现位于generateHandler结构体上func (s *generateHandler) Create(...)说明它与gopass generate共享同一套密码处理基础设施。模板机制.gopass/create/目录与内置模板模板查找目录gopass create会在所选 store 内默认是根 store的.gopass/create/文件夹中查找以.yml结尾的文件源码中常量tplPath .gopass/create/见 internal/create/wizard.go。注意这个目录位于 store 内部会被加密存储并随 store 一起同步、提交因此模板天然具备团队共享能力。首次运行的默认模板写入在首次运行且目录中没有模板时gopass 会把两个内置模板网站登录 website login 与 PIN 码写入该目录。从当前仓库源码看内置模板实际有3 个见 internal/create/templates.go优先级名称前缀说明0Website loginwebsites网站登录含 urlhostname 类型、username、password1PIN Code (numerical)pin纯数字 PINpassword 限定字符集01234567892SSO / passwordless login (e.g. Google)websites无密码登录含 login-method 的 choice 选择写入流程writeTemplates会依次执行Set写文件、TryAdd暂存、TryCommit提交提交信息为 Add default wizard templates。写入的文件名遵循priority-prefix.yml约定如0-websites.yml、1-pin.yml、2-websites.yml。加载与回退逻辑New(ctx, s)的加载顺序internal/create/wizard.goparseTemplates列出并逐个解析.gopass/create/下的模板忽略非.yml/.yaml后缀文件单个模板解析失败会打印Bad template错误并跳过不中断整体加载若一个模板都没有则写入默认模板并重新解析若写入后仍然没有说明写入有问题则回退到代码内嵌的默认模板parseTemplatesFallback。所有模板解析完成后按Priority升序排序数值小者排在菜单前面。添加自定义模板参考 docs/commands/create.md 的完整步骤# 打开 store 目录注意实际 store 路径应以 gopass config mounts.path 输出为准 cd $(gopass config mounts.path) mkdir -p .gopass/create $EDITOR .gopass/create/aws.yml git add .gopass/create/aws.yml git commit -m Add AWS credential template提示文档中以$(gopass config mounts.path)获取 store 挂载根目录是一种便捷写法若使用 gitfs 等 RCS 后端新增模板需要像普通密钥一样执行 add/commit 才能生效并同步给团队。模板结构顶层字段详解每个模板文件是一个 YAML 文档支持以下顶层字段对照 internal/create/wizard.go 的Template结构体字段类型必填说明namestring是向导选择菜单中显示的可读名称如Website loginpriorityint否菜单排序数值小者靠前默认0两个内置模板分别使用0与1prefixstring是store 内保存新密钥的目录如websites→ 密钥存于websites/name下name_from[]string否用于拼装密钥文件名的属性名列表为空时提示用户输入路径各值经CleanFilename清洗welcomestring否向导开始时打印的欢迎消息支持 Unicode/emojiattributeslist是有序的属性定义列表见下文属性字段文档给出的完整骨架示例--- priority: 5 name: AWS prefix: aws name_from: - org - user welcome: Creating AWS credentials attributes: - name: org type: string prompt: Organization min: 1 - name: user type: string prompt: User min: 1 - name: password type: password prompt: Password charset: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%* min: 10 strict: true - name: comment type: string prompt: Comments从源码可以确认Template结构体还支持两个文档表格未列出的扩展字段options []stringchoice类型属性可选值列表optional bool允许跳过某个password属性用于 SSO / 社交登录账号用户回答无密码时直接跳过不存储空白密码。属性字段Attribute Fieldsattributes列表中的每个条目支持以下字段对应 internal/create/wizard.go 的Attribute结构体字段类型适用类型说明namestringall值在密钥 YAML body 中的键名prompt省略时也用作人类可读标签typestringall输入行为控制string、hostname、password、multiline另有源码级扩展choice见下文属性类型promptstringall覆盖展示给用户的提示文本默认取name首字母大写minintstring, hostname, password最小可接受长度为0默认时跳过校验password 自动生成时传给生成器maxintstring, hostname, password最大可接受长度为0默认时跳过校验charsetstringpassword生成密码的显式字符集省略时使用标准混合类别生成器用户放弃自动生成时忽略always_promptboolpassword为true时跳过Generate Password?提问总是要求用户手动输入默认falsestrictboolpassword为true且设置了charset时charset中检测到的每个字符类别大写、小写、数字、符号在生成的密码中必须至少出现一次等价于gopass generate --strict默认false从源码实现看还有几个值得注意的行为细节min/max校验的触发时机string、hostname类型在用户输入后立即校验len(sv) v.Min报 too short (needs %d)超过Max报 too long (at most %d)password类型仅在用户拒绝自动生成、手动输入时才做min/max校验——自动生成路径下min会被传入密码生成器作为长度下限要求。prompt默认值源码中通过strings.ToTitle(k)生成将属性名首字母大写。optional扩展对password属性设置optional: true后向导会先询问 Does this account have a password? (No for SSO / social login)回答否时跳过该属性。测试用例 internal/create/wizard_test.go 验证了该字段的解析与往返。choice扩展提供一组options让用户选择cui.GetSelection返回 aborted 时向导以exit.Aborted退出选择结果同样可参与name_from拼名。内置 SSO 模板即使用该类型提供 google/apple/github/microsoft/sso/magic-link 等登录方式。属性类型Attribute Types深入解析string单行文本提示用户输入一行文本按name键原样存入密钥的 YAML body。支持min/max长度校验也支持出现在name_from中参与拼名。- name: username type: string prompt: Username min: 1 max: 64hostnameURL 的主机名提取在string基础上额外做三件事实现见 internal/create/helpers.go 的extractHostname提取主机名对用户输入如https://example.com/login自动补齐 scheme没有://时默认按http解析并取u.Hostname()得到example.com参与拼名若该属性出现在name_from中拼入文件名的是提取后的主机名而非原始输入密码更换链接用提取出的主机名查询内置的pwrules数据库internal/create/wizard.go命中时把变更密码的 URL 存入密钥的password-change-url键若无法解析出主机名直接报错cannot parse URL。- name: url type: hostname prompt: Website URL min: 1password主密码字段存储为密钥第一行这是四种类型中行为最复杂的一个。向导会若属性非optional询问Generate Password?默认truealways_prompt: true时跳过此问选择自动生成时调用generatePassword(ctx, hostname, v.Charset, v.Strict)见 internal/create/wizard.go其内部决策链为指定了charset询问长度默认 4strict为真走pwgen.GeneratePasswordCharsetStrict(length, charset)否则pwgen.GeneratePasswordCharset(length, charset)未指定charset但pwrules.LookupRule命中该主机名的密码规则打印Using password rules for hostname ...按规则长度生成NewCrypticForDomain密码否则依次询问Human-pronounceable passphrase?XKCD 风格口令、How long?默认取自gopass config generate.default-length或环境变量、Include symbols?默认generate.symbols、Strict rules?默认generate.strictstrict 时使用pwgen.GeneratePasswordWithAllClasses。XKCD 口令路径还支持pwgen.xkcd-len、pwgen.xkcd-sep、pwgen.xkcd-capitalize、pwgen.xkcd-numbers、pwgen.xkcd-lang等配置项。选择手动输入时通过termio.AskForPassword(ctx, v.Prompt, true)带确认读取并执行min/max长度校验。关键差异password 属性的值不会作为 YAML 键写入而是通过sec.SetPassword(password)存为密钥的第一行gopass 标准的密码字段。- name: password type: password prompt: Password charset: 0123456789 # 仅数字例如 PIN 码 min: 4 max: 8 always_prompt: true # 跳过是否生成提问multiline编辑器多行内容打开用户的$EDITOR或gopass config core.editor配置的编辑器预填该属性名对应的已有 gopass 模板渲染结果renderTemplate会调用s.LookupTemplate查找同名模板并用 internal/tpl 引擎执行编辑器的完整内容原样写入密钥 body。适合 SSH 密钥、证书、带格式的备注等场景。- name: notes type: multiline prompt: Additional notes文件命名约定与优先级-前缀模式模板文件必须以.yml或.yaml结尾其他扩展名会被忽略internal/create/wizard.go。gopass 不强制命名规范但内置模板遵循priority-prefix.yml模式如0-websites.yml、1-pin.yml沿用该约定可以让目录列表中的顺序可预期——因为解析后本就按priority排序文件名前缀只是让排序结果一目了然。拼名、覆盖检查与--force语义无论使用哪种属性类型向导结束后都会进入命名阶段internal/create/wizard.go若未提供位置参数或未使用--force将name_from中列出的属性值依次经过fsutil.CleanFilename清洗后拼成prefix/值1/值2/...CleanFilename会把所有可疑字符替换为_并修剪首尾的下划线与空格实现见 pkg/fsutil/fsutil.go注意它不适用于含斜杠的路径名若提供了位置参数且--force生效则直接使用该路径并在路径未以所选 store 前缀开头时打印警告User supplied secret name ... does not match requested mount ... Ignoring store flag.若目标已存在且未使用--force提示用户换一个路径Enter 可覆盖最终以提交信息Create new entry调用s.Set(...)写入并打印Credentials saved to ...。命令标志Flags标志别名说明--store-s选择使用的 store同时决定模板的查找位置--force-f允许覆盖已存在的条目并接受位置参数作为密钥路径--print-p将生成的密码打印到 STDOUT标志背后的行为--storeCreate中通过cmd.String(store)获取并将该 store 注入config.WithMount(ctx, store)上下文后续的模板查找与写入都基于它未指定时交互式询问cui.AskForStore。--force影响两处——跳过已有条目的重命名提示以及允许把第一个位置参数当作密钥路径。--print在createPrintOrCopyinternal/action/create.go中生效设置该标志时把The generated password for %s is:\n%s打印到 STDOUT否则将密码复制到剪贴板时长由core.cliptimeout配置决定并调用create.post-hook根钩子。注意只有自动生成密码genPw true时才执行打印/复制手动输入的密码不触发。另外两个未在文档表格中出现、但值得了解的相关命令gopass generate使用--print/-pPrint the generated password to the terminal与--clip/-c组合而create在自动生成后默认行为是复制到剪贴板请勿混淆两者标志语义。扩展阅读与源码索引命令入口与回调 internal/action/create.go命令注册与标志定义 internal/action/commands.go向导核心实现模板解析、属性处理、命名、密码生成 internal/create/wizard.go内置默认模板 internal/create/templates.goURL 主机名提取辅助函数 internal/create/helpers.go模板向导测试默认模板、SSO 模板、optional 解析 internal/create/wizard_test.go文件名清洗规则 pkg/fsutil/fsutil.go常见问题速查Q为什么我创建模板后gopass create里看不到A检查文件名是否以.yml/.yaml结尾、YAML 是否可解析解析失败会打印Bad template、文件是否确实位于所选 store 的.gopass/create/目录并已提交。Q想让菜单排序固定应该怎么做A为每个模板设置不同的priority数值小者靠前内置模板占用0/1/2建议新模板从3起排。Q密码自动生成时长度怎么控制Amin会传递给生成器作为长度下限要求用户确认最终长度时以提问为准全局默认长度由generate.default-length或环境变量控制XKCD 口令的默认词数由pwgen.xkcd-len控制。Q如何创建一个不强制密码的账号SSO/社交登录A参照内置 SSO 模板不声明 password 属性或用optional: true的 password 属性 choice类型的login-method记录登录方式。赞分享应用安全开发工具【免费下载链接】gopassThe slightly more awesome standard unix password manager for teams项目地址https://gitcode.com/gh_mirrors/go/gopass点击查看免费下载相关推荐Borg 仓库创建全指南repo-create 命令、加密模式与密钥管理详解Borg 仓库创建全指南repo create 命令、加密模式与密钥管理详解 导读 本文聚焦 Borg 备份工具中初始化备份仓库的核心命令 borg repo运维存储如何快速创建第一个代码沙箱CubeSandbox Node.js SDK 前端上手完整教程如何快速创建第一个代码沙箱CubeSandbox Node.js SDK 前端上手完整教程 CubeSandbox 是一个为 AI Agent 打造的即时、并应用安全开发工具gws CLI 创建 Google Model Armor 模板create-template 命令实战与源码解析gws CLI 创建 Google Model Armor 模板create template 命令实战与源码解析 本指南围绕 Google Workspa上一篇openapi-fetch 中间件与认证实战指南基于 openapi-typescript 生态的请求/响应钩子深度解析下一篇CATLASS GM到L1数据搬运模板创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表