Cal*_*ian 3 ssh gpg ssh-agent gpg-agent
我想使用 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
Run Code Online (Sandbox Code Playgroud)
# ~/.gnupg/gpg-agent.conf
pinentry-program /usr/sbin/pinentry-curses
default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support
Run Code Online (Sandbox Code Playgroud)
# ~/.gnupg/gpg.conf
use-agent
Run Code Online (Sandbox Code Playgroud)
# ~/.gnupg/sshcontrol
MYFINGERPRINTS
Run Code Online (Sandbox Code Playgroud)
# ~/.ssh/config
Host localhost
ForwardAgent yes
AddKeysToAgent ask
Run Code Online (Sandbox Code Playgroud)
# ~/.zshrc
export GPG_TTY=$(tty)
Run Code Online (Sandbox Code Playgroud)
# ~/.gnupg/gpg-agent.conf
pinentry-program /usr/bin/pinentry-curses
default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support
Run Code Online (Sandbox Code Playgroud)
# ~/.gnupg/gpg.conf
use-agent
Run Code Online (Sandbox Code Playgroud)
# ~/.gnupg/sshcontrol
MYFINGERPRINTS
Run Code Online (Sandbox Code Playgroud)
# ~/.ssh/config
Host localhost
ForwardAgent yes
AddKeysToAgent ask
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"
Run Code Online (Sandbox Code Playgroud)
小智 8
问题是gpg-connect-agent updatestartuptty
每次打开终端时都会调用,因此 pinentry 将自身指向最新的 shell。
您真正想要的不是最新的 shell 终端,而是您正在连接的终端(调用 ssh 时)
为此,最简单的方法是告诉 .ssh/config 从您正在连接的 tty 执行更新命令。这是您缺少的魔术线:
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"
Run Code Online (Sandbox Code Playgroud)