我的密码存储在一个文件中,我需要使用 CLI 界面通过 Windows 上的简单命令(最好是 PowerShell)自动解锁 KeepassXC DB。
Get-Content -Encoding UTF8 L:\k.txt | .\keepassxc-cli.exe open --key-file '.\temp.keyx' '.\temp.kdbx'
但是我一直收到以下错误,提示密码不正确:
读取数据库时出错:提供的凭证无效,请重试。
如果再次出现此问题,则您的数据库文件可能已损坏。(HMAC 不匹配)
现在,如果我仅运行Get-Content
命令并复制以下输出:
Get-Content -Encoding UTF8 L:\k.txt | Set-Clipboard
并粘贴到 KeepassXC GUI 中,它可以工作(DB 已解锁,意味着密码正确,并且数据库文件未损坏),但如果我将它粘贴到 CLI 中的密码提示中,它不起作用,并且我收到上述错误消息。
为什么会这样?这是 CLI 中的错误,还是我做错了什么?
答案1
根据以下答案@harrymc,我研究了更改 PowerShell 默认代码页的方法,并基于此回答通过设置
$OutputEncoding = [System.Text.UTF8Encoding]::new()
,
我能够65001-UTF8
将该 shell 会话的代码页更改为。
命令:
Get-Content -Encoding UTF8 L:\k.txt | .\keepassxc-cli.exe open --key-file '.\temp.keyx' '.\temp.kdbx'
不起作用,这意味着出现了一个 shell 提示符,它没有响应(提示符中没有反映来自键盘或鼠标的输入),并且数据库仍然显示为全局锁定。
但另一个命令:
Get-Content -Encoding UTF8 L:\k.txt | .\keepassxc-cli.exe show --key-file '.\temp.keyx' '.\temp.kdbx' 'stackoverflow'
显示存储在数据库中的条目的属性,意味着数据库已成功解锁。
一些其他命令如keepassxc-cli.exe ls <database>
和也成功运行。keepassxc-cli.exe search <database> '[email protected]'
答案2
我认为您遇到了这样的错误报告:
当密码中使用非 ASCII(UTF-8)字符时,无法使用 keepassxc-cli 打开数据库:#2413。
海报最后这样总结:
我发现了问题。从 cmd 或 PowerShell 运行时,输入和输出编码是 cp850(即 DOS 代码页),而不是用于 GUI 应用程序的 cp1252。从 cygwin/Msys2 bash 运行时,编码是 UTF-8,这也不是 Qt 报告的系统编码。
我建议避免在密码中使用非 ASCII 字符,因为它们无法正确地转换为keepassxc-cli
。通过复制和粘贴这些字符,您始终使用了 UTF8 编码,因此可以保留这些字符。