Por que o mutt trava ao executar o gpg no tmux?

2

Eu corro mutt em tmux e quando executo gpg para assinar ou criptografar, o gpg mostra uma tela em branco onde eu esperaria digitar minha senha. Eu coloquei o gpg e ele mostra que está pendurado esperando em um soquete read() (presumivelmente do gpg-agent . O que está acontecendo aqui?

    
por Chris W. 06.02.2016 / 16:23

2 respostas

4

Resposta curta

Se você estiver usando bash, o script wrapper de Chris W. é o caminho a seguir. Se por acaso você estiver usando zsh, então você pode explorar o script de inicialização ~/.zshenv para definir GPG_TTY , não há necessidade de um wrapper. Desde bash não tem um script de inicialização similar (cf. Bash Startup Files ), você terá que usar o wrapper lá.

export GPG_TTY=${TTY}

Alguns antecedentes: camadas interativas e não interativas

O gpg-agent espera que GPG_TTY aponte para o tty de onde é invocado, de modo que possa exibir seus prompts de frase secreta de maneira segura. O manual do GnuPG sugere colocar o seguinte em ~/.bashrc (ou similar):

GPG_TTY=$(tty)
export GPG_TTY

Se você invocar o mutt diretamente do seu shell, isso funcionará: GPG_TTY será definido, o mutt irá buscá-lo e passá-lo para o gpg quando for necessário.

No entanto, quando você inicia o comando mutt via new-window do tmux ou construções similares, há uma diferença importante: antes, seu mutt estava em um chamado shell interativo —isto é, você tinha um prompt do shell aberto e lançava o mutt a partir dele mesmo. tmux new-window lança um shell não interativo , já que seu shell é necessário apenas para iniciar o mutt e você não poderá interagir com ele. Nesse caso, o banho não lerá .bash_profile ou .bashrc , já que eles são projetados para configurar seu shell para uso interativo.

O zsh faz praticamente a mesma coisa: .zshrc é lido para shells interativos e ignorado para não-interativos. No entanto, em zsh, você pode fornecer um terceiro arquivo de inicialização , .zshenv , que é lido para < em> every shell, não importa se é interativo ou não. Portanto, se você definir GPG_TTY de lá, estará sempre disponível, independentemente de como o mutt é iniciado. E como $TTY é uma variável interna do shell que sempre aponta para o tty atual, é possível evitar a sobrecarga de gerar um processo tty sempre que o shell aparecer.

    
por 02.01.2017 / 16:06
3

Eu estava lançando mutt executando tmux neww mutt . mutt estava herdando o ambiente definido em tmux . Isso inclui $GPG_TTY , que é diferente para o novo painel no qual estou executando mutt (ou não definido, se não estiver no ambiente tmux ). Escrevi um wrapper chamado gpgtty que define $GPG_TTY corretamente para novos painéis.

#!/bin/sh
GPG_TTY=$(tty) $*

Em seguida, inicio mutt : tmux neww gpgtty mutt . gpg funciona corretamente depois disso. FYI, isso é tudo usando pinentry-curses para gpg passphrase input.

    
por 06.02.2016 / 16:23