从基于控制台的环境(例如 ssh 会话)使用 gpg 会失败,因为 GTK pinentry 对话框无法显示在 SSH 会话中。
我试过了unset DISPLAY
,但没用。GPG 命令行选项不包含强制 pinentry 进入控制台模式的开关。
旧版 GPG 提供了基于文本的提示,在 SSH 会话中运行良好,但升级后就失败了。
有--textmode
命令行开关,但显然,它做其他事情。
获取远程会话的纯文本 PIN 码输入的正确且干净的方法是什么?
答案1
在 Ubuntu 18.04 上,默认安装的是 gpg 2.2.4,
/usr/bin/pinentry
/usr/bin/pinentry-gnome3
/usr/bin/pinentry-gtk-2
/usr/bin/pinentry-x11
我可以执行以下操作来获取基于文本的 PIN 输入:
export GPG_TTY=$(tty)
gpg-connect-agent updatestartuptty /bye >/dev/null
答案2
要永久更改 pinentry,请将以下内容附加到~/.gnupg/gpg-agent.conf
:
pinentry-program /usr/bin/pinentry-tty
(在缺少 pinentry-tty 的旧版本中,使用 pinentry-curses 来显示“完整终端”对话窗口。)
告诉 GPG 代理重新加载配置:
gpg-connect-agent reloadagent /bye
答案3
在 Debian 盒子上:
sudo apt install pinentry-tty
sudo update-alternatives --config pinentry
(并将其设置为 pinentry-tty)
答案4
我在 Ubuntu 16.04.3 上遇到了这个问题,当时我尝试使用 gpg2 (2.1.11) 在没有密码的系统帐户上以及通过 ssh 的用户帐户上生成/安装私钥。没有任何效果,给出:
gpg:密钥 FE17AE6D/FE17AE6D:发送给代理时出错:权限被拒绝
gpg:构建 skey 数组时出错:权限被拒绝
然后我发现这这对我有用,简而言之:
pico ~/.gnupg/gpg-agent.conf
# add: allow-loopback-pinentry
gpg-connect-agent reloadagent /bye
gpg2 --pinentry-mode loopback --import private.key