tmuxでgpgを実行するとmuttがフリーズするのはなぜですか?

tmuxでgpgを実行するとmuttがフリーズするのはなぜですか?

ログインして暗号化しようmuttとしたtmuxとき、gpggpgはパスワードを入力する必要がある空白の画面を表示しました。 gpgを追跡しましたが、ソケットを待っていることがわかりましたread()(おそらく、gpg-agentここで何が起こっていますか?)。

答え1

短い答え

Bashを使用している場合は、Chris W.のラッパースクリプトが最善の選択です。 zshを使用している場合は、~/.zshenv起動スクリプトを使用してそこから設定でき、GPG_TTYラッパーは必要ありません。 Bashには同様の起動スクリプトがない(参照)バッシュ開始ファイル)、そこにラッパーを使用する必要があります。

export GPG_TTY=${TTY}

背景知識:対話型および非対話型シェル

gpg-agentは、GPG_TTY安全な方法でパスワードプロンプトを表示できるように、呼び出されたttyを指すことを期待しています。これGnuPG マニュアル~/.bashrc以下(または同様のもの)を入れることをお勧めします。

GPG_TTY=$(tty)
export GPG_TTY

これは、シェルから直接muttを呼び出すと機能します。 GPG_TTY設定され、muttはそれを選択し、必要に応じてgpgに渡します。

しかし、tmuxのコマンドや同様の設定でmuttを起動する際には大きな違いがありますnew-window。以前は、muttはいわゆるインタラクティブシェル- つまり、シェルプロンプトを開き、そこからmuttを起動します。 tmux new-window発射する非対話型シェルはmuttだけを起動すればよく、対話できないからです。この場合、お風呂はインタラクティブな使用のためにシェルを設定するためのものなので、読んでいないか、まったく読んでいません.bash_profile.bashrc

zsh はほぼ同じことを行います。つまり、 .zshrc対話型シェルは読み取られ、非対話型シェルはスキップされます。しかしzshでは3番目の起動ファイルを提供できます。、、.zshenv読んだ内容はすべてインタラクティブかどうかはシェルです。したがって、GPG_TTYそこから設定すると、どのような方法でmuttが起動しても、常に使用できます。$TTY常に現在のttyを指すシェル組み込み変数なので、シェルが起動するたびにプロセスを生成するオーバーヘッドを回避できますtty

答え2

私はmuttランニングから始めましたtmux neww muttmutt継承に設定される環境ですtmux。これには、$GPG_TTY実行中の新しいウィンドウの違いが含まれますmutttmux環境にない場合は設定解除)。新しいウィンドウを正しく設定するgpgttyラッパーを作成しました。$GPG_TTY

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

その後、開始しますmutt。その後はうまくいきます。ちなみにパスワード入力はこちらまでです。tmux neww gpgtty muttgpgpinentry-cursesgpg

関連情報