语境

语境

语境

我想使用 GPG 身份验证子密钥而不是 SSH 密钥。

我还想用来gpg-agent管理这些密钥的密码缓存。

我在无头环境中运行,所以我想用于pinentry-curses我的密码输入程序,但我对在无头环境中工作的任何东西都很好。

我的开发工作流程是这样的,我在多个会话和窗格中工作tmux,并且需要能够git push从其中任何一个会话和窗格中进行工作。

问题

当我尝试这样做时就会出现问题。它不是pinentry在我当前的窗格中弹出,而是在随机的其他窗格中弹出(或者有时可能根本没有窗格,但可能有太多的窗格无法搜索)。为了解决这个问题,我需要杀死该窗格,pinentry-curses即使如此,它有时仍然会失败。

我尝试过的

我尝试过的配置

我当前的配置如下,尽管在过去几周我已经尝试了很多方法来尝试使其正常工作。

# ~/.zshrc

unset SSH_AGENT_PID
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
  export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
fi

if [[ $SSH_AUTH_SOCK == /tmp/* ]]; then
    ln -sf $SSH_AUTH_SOCK $HOME/.ssh-agent-sock
    export SSH_AUTH_SOCK=$HOME/.ssh-agent-sock
fi

export GPG_TTY=$(tty)
gpg-connect-agent updatestartuptty /bye >/dev/null
# ~/.gnupg/gpg-agent.conf

pinentry-program /usr/sbin/pinentry-curses
default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support
# ~/.gnupg/gpg.conf

use-agent
# ~/.gnupg/sshcontrol

MYFINGERPRINTS
# ~/.ssh/config

Host localhost
ForwardAgent yes
AddKeysToAgent ask

我尝试过的链接

更新:工作配置(再次感谢@SystematicFrank)

# ~/.zshrc

export GPG_TTY=$(tty)
# ~/.gnupg/gpg-agent.conf

pinentry-program /usr/bin/pinentry-curses
default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support
# ~/.gnupg/gpg.conf

use-agent
# ~/.gnupg/sshcontrol

MYFINGERPRINTS
# ~/.ssh/config

Host localhost
ForwardAgent yes
AddKeysToAgent ask
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"

答案1

gpg-connect-agent updatestartuptty问题是每次打开终端时都会调用,因此 pinentry 将自身指向最新的 shell。

您真正想要的不是最新的 shell 终端,而是您正在连接的终端(调用 ssh 时)

为此,最简单的方法是告诉 .ssh/config 从您正在连接的 tty 执行更新命令。这是你所缺少的魔法线:

Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"

相关内容