J'utilise gpg-agent
pour gérer les deux identités PGP e SSH. L'agent démarre avec un script comme celui-ci
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
qui provient chaque fois que je lance un shell interactif. Tout fonctionne bien avec cette configuration mais il y a un problème. Disons que je:
- ouvrir un terminal (lancement de l'agent en arrière-plan) et commencer à travailler
- après un certain temps, ouvrez un deuxième terminal
- effectuer une action nécessitant la saisie d'une phrase secrète dans le deuxième terminal
À ce stade gpg-agent
, pinentry-curses
un mot de passe sera lancé, mais il le fera dans le premier terminal, ce qui entraînera un mélange de sa sortie avec tout ce qui était en cours d'exécution (généralement un éditeur de texte) sans aucun moyen de reprendre le programme ou d'arrêter le pinentry (il commence à utiliser 100% cpu et je dois le tuer).
Je dois faire quelque chose de mal ici. Quelqu'un a vécu cela?
Mise à jour:
J'ai compris que cela ne se produit que pour une invite à déverrouiller une clé SSH, qui ressemble à ceci , tandis que les invites pour les clés PGP s'ouvrent toujours sur le tty correct (c'est-à-dire actuel).
export GPG_TTY="$(tty)"
ça qui l'a réparé pour moiRéponses:
La page de manuel gpg-agent explique sous l'option
--enable-ssh-support
que le protocole d'agent ssh n'est pas en mesure de fournir le nom du tty à l'agent, il utilise par défaut le terminal d'origine dans lequel il a été démarré. Avant d'exécuter la commande ssh qui nécessite un phrase de passe dans un nouveau terminal que vous devez saisirdans le nouveau terminal pour mettre à jour la vue de l'agent sur le tty ou l'affichage à utiliser.
la source
gpg2
n'ont aucune idée de ce que c'est que d'avoir un flux de travail / style de vie centré sur la ligne de commande. D'une manière ou d'une autre, les personnes dont le concept fondamental d'une expérience utilisateur d'ordinateur typique commence et se termine dans les limites des fenêtres GUI ont pu prendre des décisions qui affectent un outil qui était auparavant confortablement utilisable sur la ligne de commande.gpg
vous ne pouvez jamais demander la phrase secrète sur le mauvais terminal, alors que vousgpg2
le pouvez facilement. Lagpg
commande demanderait toujours la phrase secrète sur le terminal à partir duquel vous avez exécuté la commande, car la création de la phrase secrète a été effectuée à partir de cet arbre de processus. Maisgpg2
est codé de telle sorte qu'il ne peut pas garantir cela, car il doit demander à un processus d'agent de longue durée distinct de demander la phrase secrète, et cet agent peut avoir démarré à l'origine sur un autre terminal.gpg2
et l'agent pouvait, mais n'était pas, codé pour contourner cela.gpg2
conception n'a de sens que si elle est mise en œuvre par des personnes qui ne comprennent pas les aspects pertinents de la CLI sur le fonctionnement de Linux / Unix, et n'ont pas une bonne idée de ce qui rend les interfaces et les outils bons pour composer dans des combinaisons arbitraires.Selon le bogue en amont contre openssh, la bonne façon d'ajouter ceci à votre
~/.ssh/config
:Jusqu'à présent, cela a parfaitement fonctionné pour moi.
la source
GPG_TTY
doit être défini sur$(tty)
pour que cela fonctionne.