मैं कुछ मुद्दों के साथ संघर्ष कर रहा हूं, जबकि gpg को bashडेबियन 6.0.6 बॉक्स पर स्क्रिप्ट करना । मेरे पास एक स्क्रिप्ट है जो ऑपरेशन के एक बैच को करती है और यह सुनिश्चित करना चाहती है कि आगे बढ़ने का प्रयास करने से पहले एक gpg- एजेंट उपलब्ध हो।
चूंकि gpg- एजेंट कोई कार्रवाई नहीं करेगा और यदि पहले से ही चल रहा है तो लॉन्च की गई सफलता लौटाएगा, यह सुनिश्चित करना कि एजेंट मौजूद है:
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यह पूछने का कोई तरीका नहीं है कि क्या एजेंट स्क्रिप्ट योग्य तरीके से उपलब्ध है, क्योंकि यह चुपचाप अनुपयोगी कुंजियों के साथ प्राप्तकर्ताओं को अनदेखा करना पसंद करता है और फिर भी सफलता लौटाता है, इसलिए बैच शुरू करने से पहले इस समस्या का पता लगाना बहुत मुश्किल है। मैं दूसरों के बीच i18n कारणों के लिए पार्सिंग gpg के आउटपुट में नहीं आना चाहता।
आप यह सुनिश्चित करने आपके द्वारा चलाए जा एक GPG-एजेंट या है की जरूरत नहीं है के द्वारा इस पुन: पेश कर सकते हैं GPG_AGENT_INFOएक टर्मिनल की दौड़ में शामिल निर्धारित करते हैं, तो eval $(gpg-agent --daemon)और में एक और टर्मिनल से ऊपर चल रहा है। आप ध्यान दें कि gpg- एजेंट का कहना है कि यह पहले से ही चल रहा है, लेकिन 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एजेंट को पिंग करने के लिए एक कमांड लाइन विकल्प प्रदान करें और यदि यह हो तो वापस लौटें। ठीक।