SSH和GPG使用所谓的“代理”来缓存解密的私钥,这样用户就不必一直输入密码。默认情况下,它们使用程序
pinentry
来实现此功能。
在我们继续之前,请确保您的系统上有一个命令行pin entry程序的示例。在Ubuntu的软件仓库中,我们有
pinentry-curses
(自古以来)和
pinentry-tty
(自Xenial以来),但它们不是默认安装的。你可以从相同名称的软件包获取它:
sudo apt install pinentry-curses
设置不同的PIN码输入程序
您可以通过以下两种方式调整用于PIN码输入的程序:
(每个用户)在您的
~/.gnupg/gpg-agent.conf
文件中设置
pinentry-program
为命令行的PIN输入程序,例如:
pinentry-program /usr/bin/pinentry-curses
您需要重新启动代理或重新加载其配置:
gpg-connect-agent <<< RELOADAGENT
(系统范围内)在包括Ubuntu在内的所有常见Linux发行版中,默认的
pinentry
程序实际上是一个符号链接,指向实际的PIN输入程序。这个符号链接的目标由
update-alternatives
系统管理。您可以使用它将链接目标更改为命令行的PIN输入程序:
sudo update-alternatives --config pinentry
根据终端的可用性选择PIN输入程序
这两种方法的缺点是,如果SSH或GPG从没有终端的程序中调用(例如图形SFTP客户端或邮件用户代理),您将无法使用命令行PIN输入。更好的方法是,只有在X服务器可用且终端不可用时才使用图形PIN输入程序。为此,我们需要一个小的包装脚本,在延迟到正确的PIN输入程序之前分析环境。
假设我们在~/.local/bin/my-smart-pinentry
中有以下可执行shell脚本:
#!/bin/sh
set -eu
PINENTRY_TERMINAL='/usr/bin/pinentry-curses'
PINENTRY_X11='/usr/bin/pinentry-x11'
if [ -n "${DISPLAY-}" -a -z "${TERM-}" ]; then
exec "$PINENTRY_X11" "$@"
else
exec "$PINENTRY_TERMINAL" "$@"
fi
要将此包装器用作密码输入“程序”,您可以使用上面提到的每个用户方法。您还可以将其添加到“update-alternatives”数据库中。
gpg --pinentry-mode loopback -d criptedfile.txt.gpg -o file.txt
,它将在命令行中询问密码。无需重新配置。 - DrBeco