Tty

如何讓 pinentry-curses 從正確的 tty 開始?

  • February 6, 2019

gpg-agent用於管理 PGP e SSH 身份。代理以這樣的腳本啟動

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

每當我執行互動式 shell 時,它就會被獲取。此設置一切正常,但存在問題。假設我:

  1. 打開終端(在後台啟動代理)並開始工作
  2. 一段時間後打開第二個終端
  3. 執行需要在第二個終端中輸入密碼的操作

此時gpg-agent將開始pinentry-curses提示密碼,但它會在第一個終端執行此操作,導致其輸出與正在執行的任何內容(通常是文本編輯器)混合,無法恢復程序或停止 pinentry(它開始使用 100% cpu我必須殺了它)。

我一定在這裡做錯了什麼。有人經歷過嗎?

更新:

我發現這只是在提示解鎖 SSH 密鑰時發生,看起來像這樣,而 PGP 密鑰的提示總是在正確的(即目前的)tty 上打開。

gpg-agent 手冊頁在選項下解釋了--enable-ssh-supportssh 代理協議無法向代理提供 tty 的名稱,因此它預設使用啟動它的原始終端。在執行需要 ssh 命令之前您需要在新終端中輸入密碼

gpg-connect-agent updatestartuptty /bye

在新終端中更新代理對要使用的 tty 或顯示的視圖。

根據針對openssh的上游錯誤,正確的方法是將以下內容添加到您的~/.ssh/config

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

到目前為止,這對我來說非常有效。

引用自:https://unix.stackexchange.com/questions/280879