Ich habe mit einigen Problemen zu kämpfen, während ich gpg bash
auf 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-agent
sagt, dass es bereits läuft ... aber gpg
sein 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-agent
der Agent auf eine andere Weise erkannt wird, um sich selbst zu gpgieren. Schlimmer noch, es gpg
gibt 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_INFO
festgelegt 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-agent
erkennt 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_INFO
in der Umwelt , da dies zu einem abgestandenen (tot) Mitteln beziehen könnte, die seit worden ist ersetzt ... und weder gpg
noch gpg-agent
eine Befehlszeilenoption für das Mittel ping und true zurück , wenn es okay.