O SSH e o GPG usam os chamados "agentes" para armazenar em cache as chaves privadas descriptografadas, para que os usuários não tenham que inserir suas frases secretas o tempo todo. Por padrão, eles usam o programa pinentry
para essa finalidade.
Antes de continuarmos, vamos garantir que um exemplo de programa de entrada de pinos de linha de comando esteja disponível em seu sistema. No repositório do Ubuntu, temos pinentry-curses
(desde sempre) e pinentry-tty
(desde o Xenial), mas eles não são instalados por padrão. Você pode obtê-lo do pacote com o mesmo nome:
sudo apt install pinentry-curses
Definindo um programa de entrada de pinos diferente
Você pode ajustar o programa usado para entrada de pinos:
-
(por usuário) Definindo
pinentry-program
no seu~/.gnupg/gpg-agent.conf
como um programa de entrada de pinos da linha de comandos, e. g .:pinentry-program /usr/bin/pinentry-curses
Você precisa reiniciar o agente ou atualizá-lo:
gpg-connect-agent <<< RELOADAGENT
-
(todo o sistema) Em todas as distribuições comuns do Linux, incluindo o Ubuntu, o programa
pinentry
padrão é, na verdade, um link simbólico para o programa real de entrada de pinos. O destino deste link simbólico é gerenciado pelo sistemaupdate-alternatives
. Você pode usá-lo para alterar o destino do link para um programa de entrada de pinos da linha de comando:sudo update-alternatives --config pinentry
Escolhendo o programa de entrada de pinos com base na disponibilidade de um terminal
A desvantagem de ambos os métodos é que você não poderá usar uma entrada de pino de linha de comando se SSH ou GPG forem invocados a partir de um programa em execução sem um terminal, e. g. um cliente SFTP gráfico ou um agente de usuário de email. Uma maneira melhor seria usar o programa gráfico de entrada de pinos somente quando um servidor X estiver disponível e um terminal estiver un disponível. Para isso, precisaremos de um pequeno script de wrapper que analise o ambiente antes de adiar para o programa de entrada de pinos correto.
Vamos supor que temos o seguinte shell script executável em ~/.local/bin/my-smart-pinentry
:
#!/bin/sh
set -eu
# Configuration -- adjust these to your liking
PINENTRY_TERMINAL='/usr/bin/pinentry-curses'
PINENTRY_X11='/usr/bin/pinentry-x11'
# Action happens below!
if [ -n "${DISPLAY-}" -a -z "${TERM-}" ]; then
exec "$PINENTRY_X11" "$@"
else
exec "$PINENTRY_TERMINAL" "$@"
fi
Para usar este wrapper como o "programa" de entrada de pinos, você pode usar o método por usuário mencionado acima. Você também pode adicioná-lo ao banco de dados update-alternatives
.