私が使う gpg-agent
両方のPGP e SSH IDを管理します。エージェントは次のようなスクリプトで開始されます
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
これは、対話型のシェルを実行するたびに提供されます。このセットアップではすべてが正常に機能しますが、問題があります。私が言ってみましょう:
この時点で gpg-agent
始まります pinentry-curses
パスフレーズを要求しますが、最初のターミナルでこれを実行します。これにより、実行中のもの(通常はテキストエディター)と出力が混合され、プログラムを再開したり、ピンエントリを停止したりできません(100%cpuの使用を開始し、それを殺すために)。
私はここで何か悪いことをしているに違いありません。誰もがこれを経験しましたか?
これは、SSHキーのロックを解除するプロンプト-- this の場合にのみ発生することがわかりましたが、PGPキーのプロンプトは常に正しい(つまり現在の)ttyで開くようになっています。
gpg-agent man page は、オプション--enable-ssh-support
の下で、sshエージェントプロトコルはttyの名前をエージェントに提供できないため、デフォルトで元の端末を使用することを説明していますが開始されました。新しい端末でパスフレーズを必要とするsshコマンドを実行する前に、次のように入力する必要があります
gpg-connect-agent updatestartuptty /bye
新しい端末で、使用するttyまたはディスプレイのエージェントのビューを更新します。
Opensshに対する アップストリームバグ のように、これにproperを使用すると、~/.ssh/config
:
Match Host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"
これは、これまでのところ完全に機能しています。