PGPを使用してgpg-agent
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
対話型シェルを実行するたびにそれを取得します。この設定ではすべてがうまく機能しますが、問題があります。私は:
- ターミナルを開き(バックグラウンドでエージェントを起動)、タスクを開始
- しばらくして2番目の端末を開きます。
- 2番目の端末でパスワードが必要な操作を実行する
この時点でパスワードの入力を求められgpg-agent
始めますpinentry-curses
が、最初の端末でパスワードの入力を求められます。これにより、出力が実行されているすべての項目(通常はテキストエディタ)と混在し、プログラムを再起動または停止できなくなります。 pinentry(100%CPUを使用して起動します)を終了する必要があります。
私がここで何か間違っているのは間違いありません。誰でもこれを経験しましたか?
修正する:
SSHキーのロックを解除するように求められたときにのみこれが発生することがわかりました。これ、PGPキーのプロンプトは常に正しい(つまり現在の)ttyで開きます。
答え1
これgpg-agent のマニュアルページ--enable-ssh-support
このオプションでは、SSHエージェントプロトコルがtty名をエージェントに提供できないため、デフォルト値が開始された元の端末として指定されるという説明があります。新しい端末でパスワードが必要なSSHコマンドを発行する前に、次のように入力する必要があります。
gpg-connect-agent updatestartuptty /bye
新しい端末で使用されるttyまたはモニターのエージェントビューを更新します。
答え2
~によるとアップストリームエラーopensshに対抗して、適切これを行うには、次を追加します~/.ssh/config
。
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"
これは今まで私にとって効果的です。