gpg/pinentry - 无法在终端外部输入密码

gpg/pinentry - 无法在终端外部输入密码

我正在尝试解密脚本内的 gpg 文件。当我在终端中运行时gpg -d file.gpg,系统会提示我在curses 对话框中输入密码。但是,当我运行包含该行的脚本时,我会收到“gpg:解密失败:无密钥”,或者如果不从交互式终端运行,则会出现静默失败。

理想情况下,如果 gpg 尝试从非交互式 shell 运行(我认为这就是我的意思,但我不确定 - 基本上如果它是从脚本运行),当我运行 X 时,那么我会喜欢它打开一个终端窗口运行pinentry-curses

如果我将 pinentry 程序设置为使用 qt 或 gtk 运行,那么每次都会弹出一个图形窗口,无论它来自哪里。这就是我想要复制的行为 - 我只是不希望它依赖于 qt 或 gtk。

答案1

假设 gpg2,我可以为您提供一些解决方案,但需要注意的是,我不对安全性等提出任何要求。

预先创建一个用于输入密码的终端。在其中输入两个命令:

tty
gpg-agent --pinentry-program /usr/bin/pinentry-curses --daemon sleep 999999

这将打印正在使用的 pty,例如 ,/dev/pts/10然后运行 ​​gpg 代理,它将“挂起”在 中,sleep以便在此终端中不再进行进一步的读取。

当您需要在其他 shell 中解密某些内容时,首先使用以下命令设置其环境:

export GPG_TTY=/dev/pts/10 
export GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1

其中 1000 是您的用户 ID。 (您可以通过gpg-agent从 option开始获取此套接字的名称-v。我确信有一些更简洁的方法来获取它。)

请注意:0:1信息末尾添加的内容;它确实应该是代理的 pid 和协议版本,但 0 似乎可以接受。 (如果套接字不在上述路径名中,您可能没有使用gpg2,或者您可能在配置文件中设置了一些选项)。

现在也必须--use-agent向解密命令添加选项 gpg。它应该会导致 curses 版本的 pinentry 程序出现在预先创建的终端中,您现在可以在其中输入密码。

相关内容