¿Cómo obtener pinentry-curses para comenzar en el tty correcto?

13

Lo uso gpg-agentpara administrar ambas identidades PGP e SSH. El agente se inicia con un 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 se obtiene cada vez que ejecuto un shell interactivo. Todo funciona bien con esta configuración, pero hay un problema. Digamos que yo:

  1. abrir una terminal (iniciar el agente en segundo plano) y comenzar a trabajar
  2. después de un tiempo abra una segunda terminal
  3. hacer una acción que requiera ingresar una frase de contraseña en la segunda terminal

En este punto gpg-agentcomenzará a pinentry-cursessolicitar una frase de contraseña, pero lo hará en el primer terminal, lo que da como resultado que su salida se mezcle con lo que se estaba ejecutando (generalmente un editor de texto) sin forma de reanudar el programa o detener la entrada (comienza a usar 100% de CPU y tengo que matarlo).

Debo estar haciendo algo mal aquí. Alguien ha experimentado esto?

Actualizar:

Me di cuenta de esto sólo ocurre a la solicitud para desbloquear una clave SSH, que se parece a este , mientras que las indicaciones de claves PGP siempre abierto en el (es decir, corriente) TTY correcta.

Rnhmjoj
fuente
¿Ha intentado iniciar el agente desde su shell de inicio de sesión, por lo que solo tiene uno en ejecución?
jasonwryan
@jasonwryan que acabo de probar: es lo mismo para los terminales virtuales de Linux (agetty). Por cierto, en la pregunta con terminal me refería a una ventana de emulador de terminal.
Rnhmjoj
1
Fue export GPG_TTY="$(tty)"eso lo que me
arregló

Respuestas:

11

La página de manual de gpg-agent explica bajo la opción --enable-ssh-supportque el protocolo del agente ssh no puede proporcionar el nombre del tty al agente, por lo que el valor predeterminado es usar el terminal original en el que se inició. Antes de ejecutar el comando ssh que requiere un frase de contraseña en una nueva terminal que necesita escribir

gpg-connect-agent updatestartuptty /bye

en la nueva terminal para actualizar la vista del agente sobre qué tty o pantalla usar.

meuh
fuente
1
Esta respuesta me ayudó a congelar completamente esta realización: las personas responsables de gpg2no tienen idea de cómo es tener un flujo de trabajo / estilo de vida centrado en la línea de comandos. De alguna manera, las personas cuyo concepto fundamental de una experiencia de usuario de computadora típica comienza y termina dentro de los límites de las ventanas de la GUI llegaron a tomar decisiones que afectan una herramienta que anteriormente se podía usar cómodamente en la línea de comandos.
mtraceur
2
@mtraceur En realidad no, es culpa del agente ssh aquí: de hecho, gpg2 mostrará el mensaje en el tty correcto al desbloquear una clave PGP. Son los responsables de ssh-agent quienes posiblemente nunca pensaron en cambiar a un tty diferente.
Rnhmjoj
2
@Rnhmjoj ¿Deberían los chicos de SSH haber admitido un caso de uso de conmutación de TTY que no se necesita una herramienta de línea de comandos para la mayor parte de la historia de Unix / Linux? ¿Sabe cómo el proceso de pensamiento de diseño y las decisiones sobre exactamente qué parte del flujo de trabajo fue manejado por el comando y qué fue manejado por el agente? Si es así, tal vez pueda ayudarme a ver algo que me falta, porque simplemente no puedo ver un camino claro sobre cómo surgiría incluso la necesidad del agente de "cambiar" los TTY a menos que la arquitectura se decidiera sin considerar uso típico de línea de comandos y flujos de trabajo.
mtraceur
1
@ArneBabenhauserheide La diferencia es que gpgnunca puede solicitar la frase de contraseña en el terminal equivocado, mientras que gpg2fácilmente puede. El gpgcomando siempre solicitaría la frase de contraseña en el terminal desde el que ejecutó el comando porque en realidad la creación de la frase de contraseña se realizó desde ese árbol de procesos. Pero gpg2está codificado de tal manera que no puede garantizarlo, ya que tiene que solicitar un proceso de agente de larga duración por separado para solicitar la frase de contraseña, y ese agente podría haberse iniciado originalmente en un terminal diferente. gpg2y el agente podía, pero no estaba, codificado para solucionar eso.
mtraceur
1
@ArneBabenhauserheide ¿A menos que pregunte sobre la diferencia entre el agente SSH y gpg2? Porque si es así, entonces la diferencia es que SSH no requiere esta perversión de otras herramientas de tener que contar de forma proactiva su agente específicamente a los terminales del interruptor en el fondo (por lo que sé - y si lo hizo entonces tengo las mismas críticas para que también ) El gpg2diseño solo tiene sentido si lo implementan personas que no asimilan los aspectos relevantes de CLI de cómo funciona Linux / Unix, y no tienen un buen sentido de lo que hace que las interfaces y herramientas sean buenas para componer en combinaciones arbitrarias.
mtraceur
5

Según el error aguas arriba contra openssh, la forma correcta de esto es agregar lo siguiente a su ~/.ssh/config:

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

Esto me ha funcionado perfectamente hasta ahora.

smaslennikov
fuente
1
Tenga en cuenta que GPG_TTYdebe configurarse $(tty)para que esto funcione.
Peter