Tty
如何讓 pinentry-curses 從正確的 tty 開始?
我
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 時,它就會被獲取。此設置一切正常,但存在問題。假設我:
- 打開終端(在後台啟動代理)並開始工作
- 一段時間後打開第二個終端
- 執行需要在第二個終端中輸入密碼的操作
此時
gpg-agent
將開始pinentry-curses
提示密碼,但它會在第一個終端執行此操作,導致其輸出與正在執行的任何內容(通常是文本編輯器)混合,無法恢復程序或停止 pinentry(它開始使用 100% cpu我必須殺了它)。我一定在這裡做錯了什麼。有人經歷過嗎?
更新:
我發現這只是在提示解鎖 SSH 密鑰時發生,看起來像這樣,而 PGP 密鑰的提示總是在正確的(即目前的)tty 上打開。
gpg-agent 手冊頁在選項下解釋了
--enable-ssh-support
ssh 代理協議無法向代理提供 tty 的名稱,因此它預設使用啟動它的原始終端。在執行需要 ssh 命令之前您需要在新終端中輸入密碼gpg-connect-agent updatestartuptty /bye
在新終端中更新代理對要使用的 tty 或顯示的視圖。
根據針對openssh的上游錯誤,正確的方法是將以下內容添加到您的
~/.ssh/config
:Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"
到目前為止,這對我來說非常有效。