gpg-agent는 에이전트가 존재하지만 gpg는 에이전트가 존재하지 않는다고 표시합니까?


9

bash데비안 6.0.6 상자에서 gpg를 스크립팅하는 동안 몇 가지 문제로 어려움을 겪고 있습니다. 일괄 작업을 수행하는 스크립트가 있으며 진행하기 전에 gpg 에이전트가 사용 가능한지 확인하려고합니다.

gpg-agent는 이미 실행 중일 때 실행되지 않으면 조치를 취하지 않고 성공을 리턴하므로 에이전트가 존재하는지 확인하는 것은 다음과 같이 간단합니다.

eval $(gpg-agent --daemon)

gpg-agent 시작하거나보고합니다 :

gpg-agent[21927]: a gpg-agent is already running - not starting a new one

이미 실행 중이면 0 (성공)을 반환합니다.

에이전트가 다른 세션에서 이미 실행중인 경우 문제가 발생합니다. gpg-agent이미 실행 중이라고 말하지만 gpg자체는 사용할 수 없다고 주장합니다.

$ gpg-agent --version
gpg-agent (GnuPG) 2.0.19
libgcrypt 1.5.0
$ gpg --version
gpg (GnuPG) 1.4.13

$ eval $(gpg-agent --daemon)
gpg-agent[21927]: a gpg-agent is already running - not starting a new one
$ gpg -d demo-file.asc
gpg: gpg-agent is not available in this session

이것은 나에게 좌절과 혼란을 남긴다. 이 나타납니다 gpg-agent에이전트에게 자체를은 gpg 할 수있는 다른 방법을 검출한다. 더 나쁜 것은 gpg사용할 수없는 키를 가진 수신자를 자동으로 무시하고 여전히 성공을 리턴하는 것처럼 에이전트가 스크립트 방식으로 사용 가능한지 묻을 수있는 방법을 제공하지 않기 때문에 배치를 시작하기 전에이 문제를 감지하기가 매우 어렵습니다. 나는 i18n 이유로 gpg의 출력을 파싱하고 싶지 않습니다.

당신은 당신이 GPG 에이전트가 실행 중이거나없는 보장함으로써이 문제를 재현 할 수있는 GPG_AGENT_INFO하나의 터미널 실행에 다음 설정 eval $(gpg-agent --daemon)에서 다른 터미널 위를 실행. gpg-agent가 이미 실행 중이지만 gpg가 에이전트에 연결하지 못한다는 것을 알 수 있습니다.

아이디어?

업데이트 : gpg-agent잘 알려진 위치에서 소켓 파일을 찾아서 쓰기를 통해 다른 에이전트를 감지합니다 strace.

socket(PF_FILE, SOCK_STREAM, 0)         = 5
connect(5, {sa_family=AF_FILE, sun_path="/home/craig/.gnupg/S.gpg-agent"}, 32) = 0
fcntl(5, F_GETFL)                       = 0x2 (flags O_RDWR)
fcntl(5, F_GETFL)                       = 0x2 (flags O_RDWR)
select(6, [5], NULL, NULL, {0, 0})      = 1 (in [5], left {0, 0})
read(5, "OK Pleased to meet you, process "..., 1002) = 38
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f41a3e61000
write(2, "gpg-agent: gpg-agent running and"..., 43gpg-agent: gpg-agent running and available
) = 43

GnuPG는 잘 알려진 소켓 위치를 무시하고 환경만을 바라 봅니다. 에서 common/simple-pwquery.c:

/* Try to open a connection to the agent, send all options and return
   the file descriptor for the connection.  Return -1 in case of
   error. */
static int
agent_open (int *rfd)
{
  int rc;
  int fd;
  char *infostr, *p;
  struct sockaddr_un client_addr;
  size_t len;
  int prot;
  char line[200];
  int nread;

  *rfd = -1;
  infostr = getenv ( "GPG_AGENT_INFO" );
  if ( !infostr || !*infostr )
    infostr = default_gpg_agent_info;
  if ( !infostr || !*infostr )
    {
#ifdef SPWQ_USE_LOGGING
      log_error (_("gpg-agent is not available in this session\n"));
#endif
      return SPWQ_NO_AGENT;
    }
    /* blah blah blah truncated blah */
}

에이전트를 다시 시작하기 위해 에이전트를 종료하고 싶지 않으며 사용자 에이전트가 환경 파일을 작성할 수있는 표준 위치가 없습니다. 의 존재에 대한 더 나쁜, 내가 할 수없는 경우에도 테스트 GPG_AGENT_INFO그 이후로 대체 된 것 부실 (죽은) 에이전트를 참조 할 수 있기 때문에 환경에 ... 그리고 어느 쪽 gpggpg-agent에이전트를 핑 (ping)하고 있다면 true를 반환하는 명령 행 옵션을 제공합니다 확인.


나는 또한 gpg-users 메일 링리스트에서 물었다; 자료실에 게시물이 표시되면 링크로 연결하겠습니다.
Craig Ringer

Unix.SE 세션 당 한 번만 암호문을 입력하도록 gpg를 구성하는 방법 은 단일 사용자 시스템에서 일부 문제를 해결했습니다.
Joel Purra

답변:


6
  1. 종료 코드를 확인할 수 있습니다 gpg-connect-agent /bye
  2. $ GPG_AGENT_INFO에 제공된 소켓이 존재하는지 확인할 수 있습니다. 이것으로 충분하지만 $ GPG_AGENT_INFO에 주어진 프로세스가 소켓을 연 프로세스인지 퓨저 또는 lsof로 확인할 수도 있습니다. 그리고 당신이 정말로 철저하고 싶다면 / proc / $ PID / exe가 / usr / bin / gpg-agent (또는 무엇이든)에 대한 링크인지 확인할 수 있습니다.

불행히도 이들 중 어느 것도 문제를 해결하지 못합니다. (1) gpg-agent가 실행 중인지 올바르게 결정하지만 gpg자체 테스트와 같은 방식으로 테스트하지 않으므로 gpg가 에이전트에 연결하지 못하면 성공할 수 있습니다. 에이전트가 실행 중일 수 있지만 현재 세션에 GPG_AGENT_INFO가 설정되지 않았으며 이미 실행중인 에이전트 의 gpg-agent명령 을 요구하는 명백한 방법이 없다는 점에서 (2)의 경우에도 마찬가지입니다 GPG_AGENT_INFO.
Craig Ringer


3

지금까지 내가 가진 가장 좋은 해결 방법은 다음과 같은 끔찍한 혼란입니다.

if ! test -v GPG_AGENT_INFO; then
    if gpg-agent 2>/dev/null; then
        if test -e /tmp/.gpg-agent-$USER/env; then
            . /tmp/.gpg-agent-$USER/env
        elif test -e ~/.gpg-agent-info; then
            . ~/.gpg-agent-info
        else
            echo 'A gpg agent is running, but we cannot find its socket info because'
            echo 'the GPG_AGENT_INFO env var is not set and gpg agent info has not been'
            echo 'written to any expected location. Cannot continue. Please report this'
            echo 'issue for investigation.'
            exit 5
        fi
    else
        mkdir /tmp/.gpg-agent-$USER
        chmod 700 /tmp/.gpg-agent-$USER
        gpg-agent --daemon --write-env-file /tmp/.gpg-agent-$USER/env
        . /tmp/.gpg-agent-$USER/env
    fi
    # The env file doesn't include an export statement
    export GPG_AGENT_INFO
else
    if ! gpg-agent 2>/dev/null; then
        echo 'GPG_AGENT_INFO is set, but cannot connect to the agent.'
        echo 'Unsure how to proceed, so aborting execution. Please report this'
        echo 'issue for investigation.'
        exit 5
    fi
fi

이것은 GPG_AGENT_INFO환경에서 확인하고 설정되어 있으면 gpg-agent가 실제로 실행 중인지 확인하십시오. (그놈이 그놈의 에이전트와 같은 다른 gpg 에이전트 구현과 어떻게 상호 작용하는지 아직 확실하지 않습니다). 상담원 정보가 설정되었지만 상담원이 실행 중이 아니면 대처 방법을 모르고 포기합니다.

상담원 정보가 설정되어 있지 않으면 상담원이 실행 중인지 확인합니다. 그렇다면 잘 알려진 두 위치에서 env 정보를 찾고 찾지 못하면 포기합니다.

에이전트가 실행 중이 아니고 에이전트 정보가 설정되어 있지 않으면 에이전트를 시작하고 env 파일을 개인 위치에 쓴 후 진행합니다.

이 끔찍하고 사용자 적대적이고 신뢰할 수없는 핵에 대해 불만을 표명하는 것은 과소 평가입니다.

gpg보안 / 암호화 도구 인가 인수무시 하고 진행 한다는 것은 매우 놀라운 일입니다 . --use-agent에이전트가 실행 중이 아닌 경우 치명적인 오류 여야합니다. 선택적 -r으로 유효하지 않은 수신자 로 지정 하는 것이 무시되는 것이 아니라 오류 여야합니다. gpg에이전트가 gpg-agent명령에 다른 방법을 찾는다는 사실 은 어리둥절합니다.


평소처럼 더 지저분해질 수 있습니다 ... :-) 만약 GPG_AGENT_INFO가 설정되지 않았거나 (또는 ​​잘못) PID를 알고 있다면 (예를 들어 pgrep gpg-agent) ypu가 소켓을 찾기 위해 이것을 할 수 있습니다 :lsof -n -p $PID | grep S.gpg-agent$ | awk '{print $NF}'
Hauke ​​Laging

1
@HaukeLaging ... 직장에서 실제로 gpg-agent말하지 않으면 gnome-keyring-daemon. 'cos 그것은 이미 충분히 끔찍하지 않았습니다 : S. 나는 그것이 모두 일관성이없는 혼란이라는 사실에 놀랐습니다.
Craig Ringer

! test -v GPG_AGENT_INFO Mac OS X에서는 작동하지 않습니다 [ -z ${GPG_AGENT_INFO+x} ]. 대신 비슷한 것을 사용해야 합니다.
Dan Loewenherz

2

내 우분투 시스템에서 gpg-agent환경 파일을 쓰도록 구성되어 있습니다 ~/.gnupg/gpg-agent-info-$(hostname)(에 의해 수행됨 /etc/X11/Xsession.d/90gpg-agent). 시스템이이를 수행하지 않으면 에이전트가 나중에 소스가 될 수있는 잘 알려진 위치에 환경 파일을 작성하기 시작하는 방식을 수정할 수 있습니다. 예를 들면 다음과 같습니다.

$ gpg-agent --daemon --write-env-file="$HOME/.gnupg/gpg-agent-info"
$ source ~/.gnupg/gpg-agent-info

예, 문제는 내가 이식성이 필요한 스크립팅 도구라는 것입니다. 나는 디트로 특정 세부 사항에 의존 할 수 없습니다. gpg-agent는 에이전트가 이미 실행 중이고 env 파일의 위치를 ​​확인할 수없는 경우 env 파일을 쓰지 않습니다. gpg-agent --write-env-file이 현재 실행중인 에이전트를 쿼리하고 env 파일을 작성한다면 괜찮을 것입니다.
Craig Ringer

1
NB :gpg-agent[2333]: WARNING: "--write-env-file" is an obsolete option - it has no effect
Kent Fredric
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.