gpg-preset-passphrase:缓存密码失败:不支持

gpg-preset-passphrase:缓存密码失败:不支持

我正在编写一个脚本,用于msmtp通过电子邮件向自己发送定期系统报告。我曾gpg加密过我的电子邮件密码,并password-eval在 中使用过msmtp.conf

我成功发送了一封测试电子邮件,但在此过程中,gpg要求我输入创建密钥时使用的密码gpg --full-generate-key

鉴于脚本将在无人值守的情况下运行,我需要使用 缓存密码gpg-preset-passphrase。但是,当我运行/usr/lib/gnupg2/gpg-preset-passphrase --preset <keygrip>使用 获取 keygrip 的位置时gpg --list-keys --with-keygrip,我收到错误消息:gpg-preset-passphrase: caching passphrase failed: Not supported

gpg 2.2.12作为参考,我在运行 Raspbian Buster 的 Raspberry Pi 2 Model B 上使用。

请协助。

答案1

必须首先~/.gnupg/gpg-agent.conf使用以下选项启用此功能:

allow-preset-passphrase

编辑配置后可能就足够了gpg-connect-agent reloadagent /bye,或者您可能需要完全重新启动代理。

请注意,预设密码仅存储在内存中 - 重启后不会保留。(无论如何,gpg-agent 如何安全地存储它?)

答案2

这个很好的线程为我提供了将 GPG 密钥和密码自动加载到 gpg-agent 的最后步骤:

在我的上下文中,我已经在 .gnupg 文件夹中安装了一个 GPG 密钥。一切都在以下 bash 函数中完成:gpg_agent_preset()

其他功能都是DRY代码以避免重复。;-)

gpg-connect-agent -q 'keyinfo --list' /bye在我的上下文中提供 keygrip ID。如果您的上下文有多个 GPG 密钥,您可以使用以下命令获取 keygripgpg --fingerprint --with-keygrip <email>

可能看起来像:

gpg --fingerprint --with-keygrip EMAIL_OF_GPG_KEY_YOU_ARE_LOOKING_FOR | awk '/Keygrip/ { print $3}'

注意:/usr/lib/gnupg/gpg-preset-passphrase不在路径中。

error()
{
  >&2 echo "error:$*"
}

check_envvar()                                                                                                                                                                                                                               
{
  local envvar_name=$1
  # ${!varname} indirect value in bash
  if [[ -z ${!envvar_name} ]]
  then
    error "\$$envvar_name is empty"
    return 1
  fi
}

gpg_agent_preset()
{
  local gpg_passphrase="$1"
  # authorize preset mechanism, in our context agent is not loaded yet.
  echo allow-preset-passphrase  >> ~/.gnupg/gpg-agent.conf

  # this will start the agent ang give use keygripID
  local keygrip=$(gpg-connect-agent -q 'keyinfo --list' /bye | awk '/KEYINFO/ { print $3 }')

  # output looks like
  #S KEYINFO B1A955E910AEFAAB2FAD9EADBFAA5C59AFAAF0AA D - - - P - - -
  #S KEYINFO AAA2AAE20FCB9621D22BAFEE1C0AA2B011AA6AA6 D - - - P - - -
  #OK

  local k
  for k in $keygrip
  do
    echo "$gpg_passphrase"  | /usr/lib/gnupg/gpg-preset-passphrase --preset $k
  done
}                                                                                                                                                                                                                                          

玩得开心!

相关内容