Eu uso gpg-agent
para gerenciar ambas as identidades PGP e SSH. O agente é iniciado com um script como este
gpg_agent_env="$XDG_CACHE_HOME/gpg-agent.env"
export GPG_TTY="$(tty)"
if ! ps -U "$USER" -o ucomm | grep -q gpg-agent; then
eval "$({gpg-agent --daemon | tee $gpg_agent_env} 2> /dev/null)"
else
source "$gpg_agent_env" 2> /dev/null
fi
que é originário sempre que executo um shell interativo. Tudo funciona bem com essa configuração, mas há um problema. Digamos que eu:
- abra um terminal (iniciando o agente em segundo plano) e comece a trabalhar
- depois de um tempo abra um segundo terminal
- execute uma ação que exija a inserção de uma senha no segundo terminal
Nesse ponto gpg-agent
, começará a pinentry-curses
solicitar uma senha, mas o fará no primeiro terminal, o que resultará em sua saída misturada com o que estiver em execução (geralmente um editor de texto) sem nenhuma maneira de retomar o programa ou interromper a pinentry (ele começa a usar 100% da CPU e eu tenho que matá-lo).
Eu devo estar fazendo algo errado aqui. Alguém já experimentou isso?
Atualizar:
Eu descobri que isso acontece apenas para um prompt para desbloquear uma chave SSH, que se parece com isso , enquanto os avisos para chaves PGP sempre abrem no tty correto (atual).
export GPG_TTY="$(tty)"
isso queRespostas:
A página do manual gpg-agent explica sob a opção
--enable-ssh-support
que o protocolo do agente ssh não pode fornecer o nome do tty ao agente, portanto, o padrão é usar o terminal original no qual foi iniciado. Antes de executar o comando ssh que requer um senha em um novo terminal, você precisa digitarno novo terminal para atualizar a visualização do agente de qual tty ou exibição usar.
fonte
gpg2
não têm noção de como é ter um fluxo de trabalho / estilo de vida centrado na linha de comando. De alguma forma, pessoas cujo conceito fundamental de uma experiência típica de usuário de computador começa e termina dentro dos limites das janelas da GUI precisa tomar decisões que afetam uma ferramenta que anteriormente era confortavelmente utilizável na linha de comando.gpg
nunca é possível solicitar a senha no terminal errado, ao passo quegpg2
facilmente pode. Ogpg
comando sempre solicita a senha no terminal de onde você executou o comando, porque a criação da senha foi feita a partir dessa árvore de processos. Masgpg2
é codificado de tal forma que não pode garantir isso, porque ele precisa solicitar a um processo de agente de longa execução separado para solicitar a senha, e esse agente pode ter sido iniciado originalmente em um terminal diferente.gpg2
e o agente poderia, mas não foi, codificado para contornar isso.gpg2
design só faz sentido se implementado por pessoas que não entendem os aspectos relevantes para a CLI de como o Linux / Unix funciona e não sabem bem o que faz com que interfaces e ferramentas sejam boas para compor em combinações arbitrárias.De acordo com o bug upstream contra o openssh, a maneira correta disso é adicionar o seguinte ao seu
~/.ssh/config
:Isso funcionou para mim perfeitamente até agora.
fonte
GPG_TTY
deve ser definido como$(tty)
para fazer isso funcionar.