tmux에서 gpg를 실행할 때 mutt가 정지되는 이유는 무엇입니까?

tmux에서 gpg를 실행할 때 mutt가 정지되는 이유는 무엇입니까?

로그인 하고 암호화하려고 실행 mutt했을 tmuxgpggpg는 비밀번호를 입력해야 하는 빈 화면을 표시했습니다. gpg를 추적했는데 소켓을 기다리고 있는 것으로 나타났습니다 read()(아마도 gpg-agent. 여기서 무슨 일이 일어나고 있나요?).

답변1

짧은 답변

Bash를 사용한다면 Chris W.의 래퍼 스크립트가 최선의 선택입니다. zsh를 사용하고 있다면 ~/.zshenv시작 스크립트를 활용하여 거기에서 설정할 수 GPG_TTY있으며 래퍼는 필요하지 않습니다. Bash에는 유사한 시작 스크립트가 없기 때문에(참조배시 시작 파일), 거기에 래퍼를 사용해야합니다.

export GPG_TTY=${TTY}

배경지식: 대화형 및 비대화형 쉘

gpg-agent는 GPG_TTY안전한 방식으로 비밀번호 프롬프트를 표시할 수 있도록 호출된 tty를 가리킬 것으로 예상합니다. 이것GnuPG 매뉴얼~/.bashrc다음 (또는 이와 유사한 것) 을 넣는 것이 좋습니다 .

GPG_TTY=$(tty)
export GPG_TTY

이는 쉘에서 직접 mutt를 호출하면 작동합니다. GPG_TTY설정되고 mutt는 이를 선택하여 필요한 경우 gpg에 전달합니다.

그러나 tmux의 명령이나 유사한 구성을 통해 mutt를 시작할 때 중요한 차이점이 있습니다 new-window. 이전에는 mutt가 소위대화형 쉘- 즉, 쉘 프롬프트를 열고 거기에서 mutt를 시작합니다. tmux new-window발사하다비대화형쉘은 mutt만 시작하면 되고 상호작용할 수 없기 때문입니다. 이 경우 목욕은 대화형 사용을 위해 쉘을 설정하기 위한 것이므로 읽지 않거나 전혀 읽지 않습니다 .bash_profile..bashrc

zsh는 거의 동일한 작업을 수행합니다. 즉, .zshrc대화형 셸은 읽고, 비대화형 셸은 건너뜁니다. 그러나 zsh에서는세 번째 시작 파일을 제공할 수 있습니다., .zshenv, 읽은 내용은모든대화식이든 아니든 쉘입니다. 따라서 GPG_TTY거기에서 설정하면 mutt가 어떤 방식으로 시작되든 항상 사용할 수 있습니다. $TTY항상 현재 tty를 가리키는 쉘 내장 변수이므로 쉘이 시작될 때마다 프로세스를 생성하는 오버헤드를 피할 수 있습니다 tty.

답변2

나는 mutt달리기부터 시작했다 tmux neww mutt. mutt상속에 설정되는 환경입니다 tmux. 여기에는 $GPG_TTY실행 중인 새 창의 차이점이 포함됩니다 mutt(또는 tmux환경에 없는 경우 설정 해제). 새 창을 올바르게 설정하는 gpgtty래퍼 를 작성했습니다 .$GPG_TTY

#!/bin/sh
GPG_TTY=$(tty) $*

그런 다음 시작합니다 mutt: tmux neww gpgtty mutt. gpg그 후에는 잘 작동합니다. 참고로 pinentry-curses비밀번호 gpg입력은 여기까지입니다.

관련 정보