Ich habe mit einigen Problemen zu kämpfen, während ich gpg bashauf einer Debian 6.0.6-Box skripte. Ich habe ein Skript, das eine Reihe von Operationen ausführt und sicherstellen möchte, dass ein GPG-Agent verfügbar ist, bevor er versucht, fortzufahren.
Da gpg-agent keine Maßnahmen ergreift und Erfolg zurückgibt, wenn es gestartet wird, während es bereits ausgeführt wird, ist es so einfach sicherzustellen, dass der Agent vorhanden ist wie:
eval $(gpg-agent --daemon)
gpg-agent starten oder berichten:
gpg-agent[21927]: a gpg-agent is already running - not starting a new one
und 0 zurückgeben (Erfolg), wenn bereits ausgeführt.
Das Problem tritt auf, wenn ein Agent bereits in einer anderen Sitzung ausgeführt wird. gpg-agentsagt, dass es bereits läuft ... aber gpgsein Selbst behauptet dann, dass es nicht verfügbar ist.
$ 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
Das macht mich frustriert und verwirrt. Es scheint, dass gpg-agentder Agent auf eine andere Weise erkannt wird, um sich selbst zu gpgieren. Schlimmer noch, es gpggibt keine Möglichkeit zu fragen, ob der Agent skriptfähig verfügbar ist, da er Empfänger mit unbrauchbaren Schlüsseln gerne stillschweigend ignoriert und dennoch Erfolg zurückgibt. Daher ist es sehr schwierig, dieses Problem zu erkennen, bevor der Stapel gestartet wird. Ich möchte unter anderem aus i18n-Gründen nicht auf die Analyse der Ausgabe von gpg eingehen.
Sie können dies reproduzieren, indem Sie sicherstellen, dass kein GPG-Agent ausgeführt oder GPG_AGENT_INFOfestgelegt wurde, und zwar in einem Terminal, das ausgeführt wird, eval $(gpg-agent --daemon)und in einem anderen Terminal , in dem das oben genannte ausgeführt wird. Sie werden feststellen, dass gpg-agent angibt, dass es bereits ausgeführt wird, gpg jedoch keine Verbindung zum Agenten herstellen kann.
Ideen?
UPDATE : gpg-agenterkennt einen anderen Agenten durch die Suche nach einer Socket - Datei in einem gut bekannten Standort und Schreiben , um es zu Test für Lebendigkeit, eine pro dies 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
während GnuPG nur die Umgebung zu betrachten scheint und den bekannten Socket-Speicherort ignoriert. In 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 */
}
Ich möchte den Agenten nicht wirklich töten, nur um sicherzustellen, dass ich ihn erneut starten kann, und es gibt keinen Standardort, an dem der Agent des Benutzers möglicherweise eine Umgebungsdatei schreibt. Schlimmer noch, ich kann nicht einmal Test auf das Vorhandensein von GPG_AGENT_INFOin der Umwelt , da dies zu einem abgestandenen (tot) Mitteln beziehen könnte, die seit worden ist ersetzt ... und weder gpgnoch gpg-agenteine Befehlszeilenoption für das Mittel ping und true zurück , wenn es okay.