bash
Debian 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-agent
diyor ki, zaten koşuyor ... ama gpg
kendiliğ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-agent
Ajan kendini gpg için farklı bir yol tespit ediyor gibi görünüyor . Daha da kötüsü, gpg
aracı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_INFO
bir terminal hareketi daha sonra, set eval $(gpg-agent --daemon)
ve içinde başka uç ü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-agent
iyi 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_INFO
ortamın varlığını test bile edemiyorum çünkü bu, o zamandan beri değiştirilen eski (ölü) bir aracıya atıfta bulunabilir ... ve ne gpg
de gpg-agent
ajana ping atmak için bir komut satırı seçeneği sunamazsanız tamam.