pass
来自 官方网站
- 密码管理应该简单并遵循 Unix 哲学。使用 pass,每个密码都存储在一个 gpg 加密的文件中,文件名是需要该密码的网站或资源的标题。这些加密文件可以组织成有意义的文件夹层级,从一台计算机复制到另一台计算机,并且通常可以使用标准的命令行文件管理实用程序进行操作。
pass 是一个简单的命令行密码管理器。pass 是一个 shell 脚本,它利用了 GnuPG、tree 和 Git 等现有工具。
安装
基本用法
初始化密码存储
$ pass init gpg-id_or_email
要创建新密码,首先提供一个具有描述性的分层名称。在本例中,这是 archlinux.org/wiki/username
$ pass insert archlinux.org/wiki/username
要查看密码存储,请执行以下操作。注意示例输出显示了我们刚刚创建的层级
$ pass
Password Store
└── archlinux.org
└── wiki
└── username
要为上述示例生成一个新的随机密码,请执行以下操作,其中 n 是所需的密码长度(数字)
$ pass generate archlinux.org/wiki/username n
要检索密码,请在以下提示处输入 gpg 密码,再次使用上面的示例名称
$ pass archlinux.org/wiki/username
安装了 xclip 的 Xorg 用户可以将密码临时检索到剪贴板(例如,粘贴到网页表单)。在 Wayland 会话中,应改用 wl-clipboard。要做到这一点,请执行以下操作(再次使用上面相同的示例层级名称)
$ pass -c archlinux.org/wiki/username
export PASSWORD_STORE_X_SELECTION=primarypass 自带了一个 dmenu 包装器,可以方便地进行搜索/复制。要使用它,请安装可选依赖项 dmenu 并运行
$ passmenu
然后选择一个条目将复制其密码到剪贴板。有关自定义选项(例如不区分大小写)的更多信息,请参阅 dmenu(1)。您可能希望将其设置为系统范围的键盘绑定,以便从任何应用程序轻松访问密码。
数据组织
默认情况下,使用 pass insert 创建的凭据文件仅包含您的密码。但是,这可能不够,因为许多应用程序会要求详细信息,如用户名、URL 等。您可以使用 pass edit password_name 命令以您想要的方式编辑现有文件。以下是 pass 项目页面提供的首选组织方案。当使用 -c 或 --clip 选项与此方案一起使用时,将只复制密码。
YwrZSNH35z164ym9pI URL: *.amazon.com/* Username: AmazonianChicken@example.com Secret Question 1: What is your childhood best friend's most bizarre superhero fantasy? Oh god, Amazon, it's too awful to say... Phone Support PIN #: 84719
迁移到 pass
在 pass 项目页面 上列出了多个用于从其他程序导入密码的脚本。
扩展
自 1.7 版本起,pass 支持社区开发的扩展。这些扩展通过支持新命令来扩展 pass 的功能。
- pass-tomb — 管理存储在 tomb 中的整个密码存储树。
- pass-otp — 支持一次性密码 (OTP) 令牌。
- pass-import — 一个通用的从其他密码管理器导入工具。
- pass-update — 一个轻松更新密码的流程。
- pass-audit — 一个用于审计密码存储的扩展。
- pass-phrase — 一个生成密码短语的扩展。
- pass-coffin — 一个密码存储扩展,用于将数据隐藏在一个签名和加密的 coffin 中。
- pass-tessen — 一个 Xorg/Wayland 兼容的命令行模糊选择工具,支持复制和粘贴。
- tessen — 一个用于 Wayland 的 bash 脚本,扩展了对 rofi 和 fuzzel 等 dmenu 类型应用程序的兼容性。
高级用法
环境变量 可用于更改 pass 在进行存储和 git 操作时查找的位置,通过
PASSWORD_STORE_DIR=/path/to/store
有关如何使用此功能支持多个 pass 存储库的更多信息,请参阅 此链接。下面的 pw() 示例别名会将命名数据库的第二行发送到剪贴板,然后在五秒后发送第一行,最后再过五秒发送 OTP 代码。假设密码位于第一行,用户名位于第二行,并且 OTP URI 存在于命名数据库中的任何位置,其最终效果是将 用户名 > 密码 > otp 代码 按顺序发送到可用(例如浏览器)输入字段中进行主要粘贴。
pw() {
export PASSWORD_STORE_CLIP_TIME=8
export PASSWORD_STORE_X_SELECTION=primary
pass -c2 $1; sleep 5; pass -c $1; sleep 5; pass otp -c $1; exit
}
多个 pass 上下文 (例如,团队协作)
可以使用别名来设置不同的 pass 上下文,这有助于与不同团队协作。我们在 bash 中进行了如下设置
将别名添加到您的 ~/.bashrc
alias passred="PASSWORD_STORE_DIR=~/.pass/red pass" alias passblue="PASSWORD_STORE_DIR=~/.pass/blue pass"
将这些添加到您的 ~/.bash_completion 中以进行 bash 补全,并确保安装了 bash-completion
source /usr/share/bash-completion/completions/pass
_passred(){
PASSWORD_STORE_DIR=~/.pass/red/ _pass
}
complete -o filenames -o nospace -F _passred passred
_passblue(){
PASSWORD_STORE_DIR=~/.pass/blue/ _pass
}
complete -o filenames -o nospace -F _passblue passblue
或者对于 zsh (来源:/usr/share/zsh/site-functions/_pass)
compdef _pass passred
zstyle ':completion::complete:passred::' prefix "$HOME/.pass/red"
passred() {
PASSWORD_STORE_DIR=$HOME/.pass/red pass $@
}
compdef _pass passblue
zstyle ':completion::complete:passblue::' prefix "$HOME/.pass/blue"
passblue() {
PASSWORD_STORE_DIR=$HOME/.pass/blue pass $@
}
现在您可以初始化到 ~/.pass/red 和 ~/.pass/blue,并拥有两个 pass 上下文,通过 passred 和 passblue 别名。您可以将此进一步泛化到任意数量的上下文。
Git 集成
Git 辅助工具用法
您可以使用 pass 作为 git 的凭据辅助工具。 安装 pass-git-helperAUR。详细信息在 github README 文件中有描述。
git 配置
通过调用以下命令将 pass-git-helper 配置为 git 凭据辅助工具
$ git config --global credential.helper /usr/bin/pass-git-helper
映射文件
创建文件 ~/.config/pass-git-helper/git-pass-mapping.ini。它用于将 git 远程主机映射到您的 pass 数据库。格式如下
[github.com] target=dev/github [*.fooo-bar.*] target=dev/fooo-bar
您可以在主机部分使用通配符,如示例所示。
密码存储布局
与 pass 一样,辅助工具假定密码包含在密码存储条目的第一行。此外,如果存在第二行,则此行被解释为用户名。
为了使此工作正常,您必须使用 pass insert --multiline 来创建一个多行密码存储条目。
与 GnuPG 结合使用的中央 Git 服务器 (SSH 示例)
通过设置一个中央 Git 服务器来管理 pass,您可以建立一个密码管理系统。这使您可以在多个客户端环境中同步您的中央密码存储。
在服务器上安装一个空的 Git 仓库用于 pass
在服务器上运行 git init --bare ~/.password-store 来创建一个可以推送的空仓库。
导入已授权的公钥 SSH 密钥
在客户端上
本节假定您已配置 GnuPG 并拥有一个密钥对来加密密码。在本地客户端上,确保您有一个本地密码存储,然后启用通过 Git 管理本地更改,添加您的远程 Git 存储库,并推送您的本地 pass 历史记录。
创建本地密码存储
$ pass init gpg_key_id
启用通过 Git 管理本地更改
$ pass git init
将远程 git 存储库添加为“origin”
$ pass git remote add origin user@server:~/.password-store
推送您的本地 pass 历史记录
$ pass git push -u --all
现在您可以使用标准的 Git 命令,前面加上 pass。例如:pass git push 或 pass git pull。当您使用 pass 修改密码存储时,它会自动创建提交。
故障排除
加密失败:不可用的公钥
尝试插入新条目时可能会出现以下错误
$ pass insert archlinux.org/wiki/username
Enter password for archlinux.org/wiki/username: Retype password for archlinux.org/wiki/username: gpg: XXXXXXXXX: There is no assurance this key belongs to the named user gpg: [stdin]: encryption failed: Unusable public key Password encryption aborted.
如果用于 pass 的 GnuPG 密钥的信任级别设置为“ultimate”以外的任何级别,就会发生这种情况。编辑用于 pass 的密钥以将其信任级别设置为“ultimate”。
$ gpg --edit-key your_key_id
> trust > 5
密钥已过期
当您的 GPG 密钥过期时(例如,一年后)并且您尝试添加新密码时,可能会出现以下错误。
gpg: Note: secret key 0xAAAABBBBCCCCDDEE expired at Thu 09 Jan 2020 01:15:15 PM UTC gpg: AAAABBBBCCCCDDEE: skipped: Unusable public key
要解决此问题,请 延长当前 GPG 密钥的过期日期 或切换到新密钥(即密钥轮换)。
切换到新密钥并重新加密存储
$ pass init new_gpg-id_or_email