gpg- एजेंट का कहना है कि एजेंट मौजूद है, लेकिन gpg कहता है कि एजेंट मौजूद नहीं है?


9

मैं कुछ मुद्दों के साथ संघर्ष कर रहा हूं, जबकि 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एजेंट को पिंग करने के लिए एक कमांड लाइन विकल्प प्रदान करें और यदि यह हो तो वापस लौटें। ठीक।


मैंने gpg-users मेलिंग सूची पर भी पूछा है; अभिलेखागार में दिखाई देने के बाद मैं पोस्ट से लिंक करूंगा।
क्रेग रिंगर

Unix.SE सत्र के प्रति केवल एक बार मेरी एकल समस्या पर - मेरी सत्र की कुछ समस्याओं को हल करने के लिए gpg को कैसे कॉन्फ़िगर करें
जोएल पुर्रा

जवाबों:


6
  1. आप से बाहर निकलने के कोड की जाँच कर सकते हैं gpg-connect-agent /bye
  2. आप जाँच सकते हैं कि $ GPG_AGENT_INFO में दिया गया सॉकेट मौजूद है या नहीं। यह पर्याप्त होना चाहिए लेकिन आप फ्यूज़र या lsof से भी देख सकते हैं कि क्या $ GPG_AGENT_INFO में दी गई प्रक्रिया वह है जिसने सॉकेट खोला है। और यदि आप वास्तव में संपूर्ण होना चाहते हैं, तो आप यह भी देख सकते हैं कि क्या / proc / $ PID / exe / usr / bin / gpg-agent (या जो भी) के लिए एक लिंक है।

दुर्भाग्य से, इनमें से कोई भी समस्या को हल नहीं करता है। (1) अगर gpg- एजेंट चल रहा है, तो सही ढंग से निर्धारित करता है, लेकिन यह उसी तरह से परीक्षण नहीं gpgकरता है, जैसा कि स्वयं करता है, इसलिए यह सफल हो सकता है जब gpg बाद में एजेंट से कनेक्ट करने में विफल रहता है। यह उसी (2) के बारे में सही है जिसमें एजेंट चल रहा हो, लेकिन GPG_AGENT_INFO चालू सत्र में सेट नहीं है, और पहले से चल रहे एजेंट के gpg-agentलिए कमांड पूछने का कोई स्पष्ट तरीका नहीं है GPG_AGENT_INFO
क्रेग रिंगर


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- एजेंट वास्तव में चल रहा है। (मुझे अभी तक यकीन नहीं है कि यह अन्य gpg- एजेंट कार्यान्वयन जैसे GNOME के ​​एजेंट के साथ कैसे इंटरैक्ट करता है)। यदि एजेंट की जानकारी सेट है, लेकिन एजेंट नहीं चल रहा है तो यह नहीं जानता कि कैसे सामना करना है और छोड़ देना है।

यदि एजेंट जानकारी सेट नहीं है, तो यह देखने के लिए जाँच करता है कि एजेंट चल रहा है या नहीं। यदि यह है, यह अच्छी तरह से ज्ञात स्थानों के एक जोड़े में env जानकारी के लिए लग रहा है और अगर यह इसे खोजने में विफल रहता है, देता है।

यदि एजेंट नहीं चल रहा है और एजेंट जानकारी परेशान नहीं है, तो यह एक एजेंट शुरू करता है, एनवी फाइल को एक निजी स्थान पर लिखता है, और आगे बढ़ता है।

यह कहना कि मैं इस भयानक, उपयोगकर्ता-शत्रुतापूर्ण और अविश्वसनीय हैक से नाखुश हूं, एक ख़ामोशी है।

यह बहुत आश्चर्यजनक है कि gpg, एक सुरक्षा / क्रिप्टो उपकरण, तर्कों को अनदेखा करेगा और आगे बढ़ेगा। --use-agentयदि एक एजेंट नहीं चल रहा है, तो कम से कम वैकल्पिक रूप से, -rएक अवैध प्राप्तकर्ता के साथ निर्दिष्ट करने के लिए एक घातक त्रुटि को अनदेखा किया जाना चाहिए। तथ्य यह है कि gpgइसके एजेंट को gpg-agentकमांड का एक अलग तरीका पता चलता है, वह बहुत ही भयावह है।


हमेशा की तरह इसे और भी गन्दा बनाया जा सकता है ... :-) अगर GPG_AGENT_INFO सेट नहीं है (या गलत तरीके से) और आप पीआईडी ​​को जानते हैं (जैसे pgrep gpg-agent) तो सॉकेट खोजने के लिए lsof -n -p $PID | grep S.gpg-agent$ | awk '{print $NF}'
ypu

1
@ हॉकिंग ... अगर यह वास्तव में काम पर gpg-agentनहीं कह gnome-keyring-daemonरहा है। क्योंकि यह पहले से ही बहुत भयानक नहीं था: एस। मुझे आश्चर्य है कि यह सब इस तरह के एक असंगत गड़बड़ है।
क्रेग रिंगर

! test -v GPG_AGENT_INFO मैक ओएस एक्स पर काम नहीं करता है [ -z ${GPG_AGENT_INFO+x} ]। आपको इसके बजाय कुछ का उपयोग करने की आवश्यकता होगी ।
डैन लोवेनहेर्ज़

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- एजेंट एनवी फाइल नहीं लिखेगा और मैं यह निर्धारित नहीं कर सकता कि कोई एनवी फाइल पहले से ही कहां हो सकती है। अगर gpg-agent --write-env-file वर्तमान में चल रहे एजेंट को क्वेरी करेगा और एक env फ़ाइल लिखेगा, तो यह ठीक रहेगा, लेकिन यह नहीं है।
क्रेग रिंगर

1
एनबी:gpg-agent[2333]: WARNING: "--write-env-file" is an obsolete option - it has no effect
केंट फ्रेड्रिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.