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


13

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キー、ロックを解除するためのプロンプトのために起こる考え出しこの PGPキーのプロンプトは常に正しい(すなわち電流)のttyにオープンしている間に、。


ログインシェルからエージェントを起動してみましたか?
jasonwryan 2016年

@jasonwryan私が試したところ:Linux仮想端末(agetty)でも同じです。ところで、ターミナルに関する質問では、ターミナルエミュレータウィンドウを意味しました。
Rnhmjoj 2016年

1
それはexport GPG_TTY="$(tty)"私のためにそれを修正しました
naisanza

回答:


10

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

gpg-connect-agent updatestartuptty /bye

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


1
この答えは、私がこの認識を完全に固めるのに役立ちました。責任者gpg2は、コマンドライン中心のワークフロー/ライフスタイルをどのように持っているのかという概念をまったく持っていません。どういうわけか、典型的なコンピューターユーザーエクスペリエンスの基本概念がGUIウィンドウの境界内で開始および終了する人々は、以前はコマンドラインで快適に使用できたツールに影響を与える決定を下すことになりました。
mtraceur 2017

2
@mtraceur本当にそうではありません。ここでの問題はssh-agentです。実際、PGPキーのロックを解除すると、gpg2は正しいttyにプロンプ​​トを表示します。別のttyへの切り替えを考えたことがない可能性があるのは、ssh-agentの責任者です。
Rnhmjoj 2018年

2
@Rnhmjoj SSHの人たちは、ほとんどのUnix / Linuxの歴史にコマンドラインツールが必要としないTTY切り替えのユースケースをサポートしている必要がありますか?ワークフローのどの部分がコマンドによって処理され、どの部分がエージェントによって処理されたかについての設計思考プロセスと決定がどのように行われたかを知っていますか?もしそうなら、私が欠けているものを見つけるのを手伝ってくれるかもしれません。なぜなら、考慮せずにアーキテクチャが決定されない限り、エージェントがTTYを「切り替える」ための非常に必要性が生じる方法への明確な道が見えないからです。典型的なコマンドラインの使用とワークフロー。
mtraceur 2018年

1
@ArneBabenhauserheide違いはgpg、間違った端末でパスフレーズを要求することはできませんが、gpg2簡単に要求できることです。gpgコマンドは常に、あなたが端末上でパスフレーズを求めるだろうから、コマンドを実行し、実際に行われたパスフレーズを作成するため、そのプロセスツリー。ただしgpg2、パスフレーズの入力を求めるために別の長期実行エージェントプロセスを要求する必要があり、そのエージェントが最初に別の端末で起動した可能性があるため、確実にコード化できません。gpg2エージェントはそれを回避するようにコーディングできましたが、できませんでした。
mtraceur 2018

1
@ArneBabenhauserheide SSHエージェントとgpg2の違いについて質問していない限り、もしそうなら、違いは、SSHが他のツールのこの倒錯をバックグラウンドで端末を切り替えるように積極的にエージェントに指示する必要がないことです(私が知っている限り-そしてもしそうなら、私もそれについて同じ批判があります) )。gpg2Linux / Unixの動作に関するCLI関連の側面を理解しておらず、任意の組み合わせで構成するためのインターフェースとツールの優れた点を理解していない人が実装する場合にのみ、この設計は意味をなします。
mtraceur 2018

5

あたりとして上流のバグのopensshに対して、適切なこれまでの方法は、あなたに次を追加しています~/.ssh/config

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

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


1
これを機能させるには、をGPG_TTY設定する必要があることに注意してください$(tty)
ピーター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.