Como obter as maldições do pinentry para começar no tty correto?

13

Eu uso gpg-agentpara 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:

  1. abra um terminal (iniciando o agente em segundo plano) e comece a trabalhar
  2. depois de um tempo abra um segundo terminal
  3. execute uma ação que exija a inserção de uma senha no segundo terminal

Nesse ponto gpg-agent, começará a pinentry-cursessolicitar 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).

Rnhmjoj
fonte
Você já tentou iniciar o agente a partir do seu shell de login, para ter apenas o que está sendo executado?
Jasonwryan
@jasonwryan Eu apenas tentei: é a mesma coisa para terminais virtuais linux (agetty). A propósito, na pergunta com terminal, eu quis dizer uma janela de emulador de terminal.
Rnhmjoj
1
Foi export GPG_TTY="$(tty)"isso que
corrigi-

Respostas:

10

A página do manual gpg-agent explica sob a opção --enable-ssh-supportque 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 digitar

gpg-connect-agent updatestartuptty /bye

no novo terminal para atualizar a visualização do agente de qual tty ou exibição usar.

meuh
fonte
1
Essa resposta me ajudou a congelar completamente essa percepção: as pessoas responsáveis ​​por gpg2nã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.
Mtraceur
2
@mtraceur Na verdade, não é o problema do ssh-agent aqui: na verdade, o gpg2 exibirá o prompt no tty certo ao desbloquear uma chave PGP. São os responsáveis ​​do ssh-agent que possivelmente nunca pensaram em mudar para um tty diferente.
Rnhmjoj
2
@Rnhmjoj Os caras do SSH deveriam ter suportado um caso de usuário de comutação TTY que nenhuma ferramenta de linha de comando para a maior parte da história do Unix / Linux queria? Você sabe como o processo de design pensamento e as decisões para exatamente qual parte do fluxo de trabalho foi tratada pelo comando e qual foi tratada pelo agente? Se estiver, talvez você possa me ajudar a ver algo que está faltando, porque simplesmente não consigo ver um caminho claro de como a necessidade do agente "trocar" os TTYs surgiria, a menos que a arquitetura fosse decidida sem considerar uso e fluxos de trabalho típicos da linha de comando.
Mtraceur
1
@ArneBabenhauserheide A diferença é que gpgnunca é possível solicitar a senha no terminal errado, ao passo que gpg2facilmente pode. O gpgcomando 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. Mas gpg2é 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. gpg2e o agente poderia, mas não foi, codificado para contornar isso.
Mtraceur
1
@ArneBabenhauserheide A menos que você esteja perguntando sobre a diferença entre o agente SSH e o gpg2? Porque se assim for, então a diferença é que SSH nunca exigiu esta perversão do outro ferramental ter que dizer de forma proativa seu agente especificamente para terminais da chave no fundo (tanto quanto eu sei - e se isso acontecesse, então eu tenho as mesmas críticas para isso também ) O gpg2design 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.
Mtraceur
5

De acordo com o bug upstream contra o openssh, a maneira correta disso é adicionar o seguinte ao seu ~/.ssh/config:

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

Isso funcionou para mim perfeitamente até agora.

smaslennikov
fonte
1
Observe que GPG_TTYdeve ser definido como $(tty)para fazer isso funcionar.
Peter