Saya kesulitan dengan beberapa masalah saat menulis gpg dengan bash
menggunakan kotak Debian 6.0.6. Saya memiliki skrip yang melakukan serangkaian operasi dan ingin memastikan bahwa agen gpg tersedia sebelum mencoba untuk melanjutkan.
Karena gpg-agent tidak akan mengambil tindakan dan mengembalikan kesuksesan jika diluncurkan ketika sudah berjalan, memastikan agen hadir sesederhana:
eval $(gpg-agent --daemon)
gpg-agent
mulai, atau akan melaporkan:
gpg-agent[21927]: a gpg-agent is already running - not starting a new one
dan mengembalikan 0 (sukses) jika sudah berjalan.
Masalah muncul ketika agen sudah berjalan di sesi lain. gpg-agent
mengatakan bahwa itu sudah berjalan ... tetapi gpg
dengan sendirinya mengklaim bahwa itu tidak tersedia.
$ 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
Ini membuat saya frustrasi dan frustrasi. Tampaknya gpg-agent
mendeteksi agen cara yang berbeda untuk gpg sendiri. Lebih buruk lagi, gpg
tidak menawarkan cara untuk menanyakan apakah agen tersedia dengan cara yang dapat skrip, sama seperti suka mengabaikan penerima dengan diam-diam dengan kunci yang tidak dapat digunakan dan masih mengembalikan kesuksesan, sehingga sangat sulit untuk mendeteksi masalah ini sebelum memulai batch. Saya tidak ingin masuk ke parsing keluaran gpg untuk alasan i18n antara lain.
Anda dapat mereproduksi ini dengan memastikan Anda tidak memiliki gpg-agent yang berjalan atau telah GPG_AGENT_INFO
diatur, kemudian di satu terminal berjalan eval $(gpg-agent --daemon)
dan di terminal lain menjalankan di atas. Anda akan perhatikan bahwa gpg-agent mengatakan itu sudah berjalan, tetapi gpg gagal terhubung ke agen.
Ide ide?
UPDATE : gpg-agent
mendeteksi agen lain dengan mencari file soket di lokasi yang terkenal dan menulis untuk menguji keaslian, dan per ini 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
sementara GnuPG tampaknya hanya melihat lingkungan, mengabaikan lokasi soket yang terkenal. Dalam 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 */
}
Saya tidak benar-benar ingin membunuh agen hanya untuk memastikan saya bisa memulainya lagi, dan tidak ada tempat standar di mana agen pengguna mungkin menulis file lingkungan. Lebih buruk lagi, saya bahkan tidak bisa menguji keberadaan GPG_AGENT_INFO
di lingkungan karena itu bisa merujuk pada agen basi (mati) yang sejak itu diganti ... dan gpg
juga tidak juga gpg-agent
menyediakan opsi baris perintah untuk melakukan ping agen dan mengembalikan true jika itu baik.