web-dev-qa-db-ja.com

pinentry-cursesを正しいttyで起動する方法は?

私が使う 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

これは、対話型のシェルを実行するたびに提供されます。このセットアップではすべてが正常に機能しますが、問題があります。私が言ってみましょう:

  1. ターミナルを開き(バックグラウンドでエージェントを起動)、作業を開始します
  2. しばらくして、2つ目の端末を開きます
  3. 2番目の端末でパスフレーズを入力する必要があるアクションを実行する

この時点で gpg-agent 始まります pinentry-cursesパスフレーズを要求しますが、最初のターミナルでこれを実行します。これにより、実行中のもの(通常はテキストエディター)と出力が混合され、プログラムを再開したり、ピンエントリを停止したりできません(100%cpuの使用を開始し、それを殺すために)。

私はここで何か悪いことをしているに違いありません。誰もがこれを経験しましたか?

更新:

これは、SSHキーのロックを解除するプロンプト-- this の場合にのみ発生することがわかりましたが、PGPキーのプロンプトは常に正しい(つまり現在の)ttyで開くようになっています。

13
Rnhmjoj

gpg-agent man page は、オプション--enable-ssh-supportの下で、sshエージェントプロトコルはttyの名前をエージェントに提供できないため、デフォルトで元の端末を使用することを説明していますが開始されました。新しい端末でパスフレーズを必要とするsshコマンドを実行する前に、次のように入力する必要があります

gpg-connect-agent updatestartuptty /bye

新しい端末で、使用するttyまたはディスプレイのエージェントのビューを更新します。

11
meuh

Opensshに対する アップストリームバグ のように、これにproperを使用すると、~/.ssh/config

Match Host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"

これは、これまでのところ完全に機能しています。

5
smaslennikov