自从我安装了 Ubuntu Desktop 16.10 Gnome(之前我使用的是 15.10)之后,每当我尝试添加 SSH 密钥或使用终端导入 GPG 密钥时,都会弹出一个 GUI 弹出框要求输入密码,这让我很烦恼。
使用 SSH,我通过在终端上启动新代理然后尝试添加密钥来解决此问题。最后,它要求我在 TTY 中输入密码,而不是在 GUI 中。
我才刚刚开始学习 GPG,所以不确定如何解决。
有什么方法可以禁用此功能并让他们从 TTY 访问时在 TTY 中询问密码吗?
我已阅读这问题,但是它是关于 ubuntu 12.04 的,前两个答案对我来说不起作用。
答案1
SSH 和 GPG 使用所谓的“代理”来缓存解密的私钥,这样用户就不必一直输入密码。默认情况下,它们使用该程序pinentry
来实现此目的。
在继续之前,让我们确保您的系统上有命令行 PIN 输入程序的示例。在 Ubuntu 的存储库中,我们有pinentry-curses
(自永远以来)和pinentry-tty
(自 Xenial 以来),但它们默认未安装。您可以从同名的包中获取它:
sudo apt install pinentry-curses
设置不同的 PIN 输入程序
您可以通过以下方式调整用于 PIN 输入的程序:
(每个用户)
pinentry-program
在您的~/.gnupg/gpg-agent.conf
命令行中设置 PIN 输入程序,例如:pinentry-program /usr/bin/pinentry-curses
您需要重新启动代理或让其重新加载其配置:
gpg-connect-agent <<< RELOADAGENT
(系统范围)在所有常见的 Linux 发行版(包括 Ubuntu)中,默认
pinentry
程序实际上是指向实际 PIN 输入程序的符号链接。此符号链接的目标由系统管理update-alternatives
。您可以使用它将链接目标更改为命令行 PIN 输入程序:sudo update-alternatives --config pinentry
根据终端的可用性选择 PIN 输入程序
这两种方法的缺点是,如果从没有终端的程序(例如图形 SFTP 客户端或邮件用户代理)调用 SSH 或 GPG,您将无法使用命令行 PIN 输入。更好的方法是仅在 X 服务器可用且有终端时才使用图形 PIN 输入程序联合国可用。为此,我们需要一个小的包装脚本,该脚本会在遵循正确的引脚输入程序之前分析环境。
假设我们有以下可执行 shell 脚本~/.local/bin/my-smart-pinentry
:
#!/bin/sh
set -eu
# Configuration -- adjust these to your liking
PINENTRY_TERMINAL='/usr/bin/pinentry-curses'
PINENTRY_X11='/usr/bin/pinentry-x11'
# Action happens below!
if [ -n "${DISPLAY-}" -a -z "${TERM-}" ]; then
exec "$PINENTRY_X11" "$@"
else
exec "$PINENTRY_TERMINAL" "$@"
fi
要将此包装器用作 pin 条目“程序”,您可以使用上面提到的按用户方法。您还可以将其添加到update-alternatives
数据库。
答案2
如果有人像我一样在使用较新的版本时发现这个问题,那么有一个更简单的解决方案。至少对我来说,在 (K)ubuntu 20.04 LTS Focal 中使用 GPG v2.2.19 的那个。我所需要添加的只是--pinentry-mode loopback
它开始在 TTY 中要求输入密码。我不需要安装任何东西。例如:
gpg --pinentry-mode loopback --export-secret-keys -a | less