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
그 이후로 대체 된 것 부실 (죽은) 에이전트를 참조 할 수 있기 때문에 환경에 ... 그리고 어느 쪽 gpg
도 gpg-agent
에이전트를 핑 (ping)하고 있다면 true를 반환하는 명령 행 옵션을 제공합니다 확인.