gpg-agent ajanın var olduğunu söylüyor, ancak gpg ajanın bulunmadığını söylüyor?


9

bashDebian 6.0.6 kutusu ile gpg komut dosyası yazarken bazı sorunlarla uğraşıyorum . Bir toplu işlem yapan ve devam etmeden önce bir gpg-agent kullanılabilir olduğundan emin olmak isteyen bir komut dosyası var.

Gpg-agent zaten çalışıyorsa herhangi bir işlem yapmayacak ve başarılı olmayacaktır.

eval $(gpg-agent --daemon)

gpg-agent başlatır veya rapor eder:

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

ve zaten çalışıyorsa 0 (başarılı) döndür.

Sorun, bir aracı başka bir oturumda zaten çalışıyorsa ortaya çıkar. gpg-agentdiyor ki, zaten koşuyor ... ama gpgkendiliğinden bunun mümkün olmadığını iddia ediyor.

$ 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

Bu beni hayal kırıklığına uğrattı ve kafamı karıştırdı. gpg-agentAjan kendini gpg için farklı bir yol tespit ediyor gibi görünüyor . Daha da kötüsü, gpgaracıların kullanılamaz anahtarlarla sessizce göz ardı etmeyi ve yine de başarıyı döndürmeyi sevdiği gibi, ajanın yazılabilir bir şekilde kullanılabilir olup olmadığını sormanın hiçbir yolu yoktur, bu nedenle toplu iş başlamadan önce bu sorunu tespit etmek çok zordur. Diğerleri arasında i18n nedenleriyle gpg çıktısını ayrıştırmak istemiyorum.

Sen gpg-agent çalışan veya adres yok sağlayarak bu üretebilir GPG_AGENT_INFObir terminal hareketi daha sonra, set eval $(gpg-agent --daemon)ve içinde başka üstünde çalışan. Gpg-agent'ın zaten çalıştığını söylediğini, ancak gpg'nin ajanla bağlantı kuramadığını unutmayın.

Fikirler?

GÜNCELLEME : gpg-agentiyi bilinen bir konumda bir soket dosyası arayarak ve canlılığı test etmek için bu dosyaya yazarak başka bir aracı algılar 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 sadece çevreye bakarken, tanınmış soket konumunu yok sayar. İçinde 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 */
}

Sadece yeniden başlatabildiğimden emin olmak için aracıyı gerçekten öldürmek istemiyorum ve kullanıcının aracısının bir ortam dosyası yazabileceği standart bir yer yok. Daha da kötüsü, GPG_AGENT_INFOortamın varlığını test bile edemiyorum çünkü bu, o zamandan beri değiştirilen eski (ölü) bir aracıya atıfta bulunabilir ... ve ne gpgde gpg-agentajana ping atmak için bir komut satırı seçeneği sunamazsanız tamam.


Ben de gpg kullanıcıları posta listesinde sordum; Arşivlerde göründüğünde gönderiyle bağlantı kuracağım.
Craig Ringer

Unix.SE gpg'yi oturum başına yalnızca bir kez parola girecek şekilde nasıl yapılandırırım, bazı sorunlarımı çözdü - tek kullanıcılı bir sistemde.
Joel Purra

Yanıtlar:


6
  1. Çıkış kodunu kontrol edebilirsiniz. gpg-connect-agent /bye
  2. $ GPG_AGENT_INFO içinde verilen soketin olup olmadığını kontrol edebilirsiniz. Bu yeterli olmalı ancak $ GPG_AGENT_INFO içinde verilen işlemin soketi açan işlem olup olmadığını kaynaştırıcı veya lsof ile de kontrol edebilirsiniz. Ve gerçekten ayrıntılı olmak istiyorsanız / proc / $ PID / exe dosyasının / usr / bin / gpg-agent (ya da her neyse) bağlantısı olup olmadığını da kontrol edebilirsiniz.

Ne yazık ki, bunların hiçbiri sorunu çözmüyor. (1) gpg-agent'un çalışıp çalışmadığını doğru bir şekilde belirler, ancak gpgkendisiyle aynı şekilde test etmez, bu nedenle gpg daha sonra aracıya bağlanamazsa başarılı olabilir. Aynı durum (2) için de geçerli olabilir, ancak geçerli oturumda GPG_AGENT_INFO ayarlanmamıştır ve zaten çalışan bir aracı için gpg-agentkomut istemenin belirgin bir yolu yoktur GPG_AGENT_INFO.
Craig Ringer


3

Şimdiye kadar sahip olduğum en iyi geçici çözüm aşağıdaki iğrenç karışıklıktır:

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

Bu GPG_AGENT_INFO, ortamda kontrol eder ve ayarlanmışsa, gpg-agent'ın gerçekten çalıştığından emin olun. (Bunun GNOME'un temsilcisi gibi diğer gpg aracısı uygulamalarıyla nasıl etkileşime girdiğinden henüz emin değilim). Ajan bilgisi ayarlanır ancak ajan çalışmazsa, nasıl başa çıkacağını bilmez ve vazgeçer.

Ajan bilgisi ayarlanmamışsa, ajanın çalışıp çalışmadığını kontrol eder. Öyleyse, birkaç iyi bilinen yerde env bilgisini arar ve bulamazsa vazgeçer.

Aracı çalışmıyorsa ve aracı bilgisi ayarlanmamışsa, bir aracı başlatır, env dosyasını özel bir konuma yazar ve devam eder.

Bu korkunç, kullanıcı-düşmanca ve güvenilmez kesmektan memnun olmadığımı söylemek bir eksikliktir.

gpgBir güvenlik / kripto aracının argümanları görmezden gelmesi ve ilerlemesi çok şaşırtıcı . --use-agentbir aracı çalışmıyorsa ölümcül bir hata olmalıdır, en azından isteğe bağlı olarak, -rgeçersiz bir alıcıyla belirtmenin göz ardı etmek yerine bir hata olması gerekir. Aslında gpgonun ajan farklı bir yol bulur gpg-agentkomuta bewildering edilir.


Her zamanki gibi hatta Messier yapılabilir ... :-) Eğer GPG_AGENT_INFO değil (ya da yanlış) seti ve (örneğin PID'yi biliyorum pgrep gpg-agentsonra ypu soket bulmak için yapabilirsiniz):lsof -n -p $PID | grep S.gpg-agent$ | awk '{print $NF}'
Hauke Laging

1
@HaukeLaging ... gerçekten eğer gpg-agentsöyleme gnome-keyring-daemoniş yerinde. çünkü zaten yeterince korkunç değildi: S. Bu kadar tutarsız bir karmaşa olduğu için şaşırdım.
Craig Ringer

! test -v GPG_AGENT_INFO Mac OS X üzerinde çalışmaz. Bunun [ -z ${GPG_AGENT_INFO+x} ]yerine böyle bir şey kullanmanız gerekir .
Dan Loewenherz

2

Ubuntu sistemimde gpg-agent , ortam dosyasını ~/.gnupg/gpg-agent-info-$(hostname)(tarafından yapılır /etc/X11/Xsession.d/90gpg-agent) yazmak üzere yapılandırılmıştır . Sisteminiz bunu yapmazsa, ajanın daha sonra kaynaklanabilecek iyi bilinen bir konuma bir ortam dosyası yazmaya başlama şeklini değiştirebilirsiniz. Örneğin:

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

Evet, sorun şu ki, taşınabilir olması gereken komut dosyaları kullanıyorum; Dağıtıma özgü ayrıntılara gerçekten güvenemiyorum. Bir ajan zaten çalışıyorsa gpg-agent bir env dosyası yazmaz ve herhangi bir env dosyasının zaten nerede olabileceğini belirleyemem. Gpg-agent --write-env-file şu anda çalışan aracıyı sorgulayıp bir env dosyası yazarsa, bu iyi olur, ancak olmaz.
Craig Ringer

1
Not:gpg-agent[2333]: WARNING: "--write-env-file" is an obsolete option - it has no effect
Kent Fredric
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.