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.
Jawaban:
gpg-connect-agent /bye
sumber
gpg
dengan self-nya, sehingga ia dapat berhasil ketika gpg kemudian gagal terhubung ke agen. Hal yang sama berlaku untuk (2) bahwa agen mungkin berjalan, tetapi GPG_AGENT_INFO tidak diatur dalam sesi saat ini, dan tidak ada cara yang jelas untuk memintagpg-agent
perintah untukGPG_AGENT_INFO
agen yang sudah berjalan.Versi utama agen gpg yang menjalankan adalah 2. Anda harus menggunakan gpg2 daripada gpg seperti yang dijawab di sini: /unix/231386/how-to-make-gpg-find-gpg-agent
sumber
Sejauh ini solusi terbaik yang saya miliki adalah kekacauan mengerikan berikut:
Ini akan memeriksa
GPG_AGENT_INFO
di lingkungan dan jika sudah diatur, pastikan gpg-agent benar-benar berjalan. (Saya belum yakin bagaimana ini berinteraksi dengan implementasi gpg-agent lain seperti agen GNOME). Jika info agen diatur tetapi agen tidak berjalan itu tidak tahu bagaimana cara mengatasi dan menyerah.Jika info agen tidak disetel itu memeriksa untuk melihat apakah agen berjalan. Jika ya, ia mencari info env di beberapa lokasi terkenal dan jika gagal menemukannya, menyerah.
Jika agen tidak berjalan dan info agen tidak disetel, agen mulai, menulis file env ke lokasi pribadi, dan melanjutkan.
Untuk mengatakan bahwa saya tidak senang dengan peretasan yang mengerikan, tidak bersahabat, dan tidak dapat diandalkan ini merupakan pernyataan yang meremehkan.
Sangat mengejutkan bahwa
gpg
, alat keamanan / crypto, akan mengabaikan argumen dan melanjutkan.--use-agent
harus menjadi kesalahan fatal jika agen tidak berjalan, setidaknya secara opsional, sebanyak menetapkan-r
dengan penerima yang tidak valid harus menjadi kesalahan daripada diabaikan. Fakta bahwagpg
menemukan agennya cara yang berbeda dengangpg-agent
perintah itu membingungkan.sumber
pgrep gpg-agent
) maka ypu dapat melakukan ini untuk menemukan soket:lsof -n -p $PID | grep S.gpg-agent$ | awk '{print $NF}'
gpg-agent
tidak mengatakangnome-keyring-daemon
di tempat kerja. karena itu belum cukup mengerikan: S. Saya kagum bahwa itu semua berantakan tidak konsisten.! test -v GPG_AGENT_INFO
tidak berfungsi di Mac OS X. Anda harus menggunakan sesuatu seperti itu[ -z ${GPG_AGENT_INFO+x} ]
.Pada sistem Ubuntu saya
gpg-agent
dikonfigurasikan untuk menulis file lingkungannya~/.gnupg/gpg-agent-info-$(hostname)
(yang dilakukan oleh/etc/X11/Xsession.d/90gpg-agent
). Jika sistem Anda tidak melakukan ini, Anda bisa memodifikasi cara agen mulai menulis file lingkungan di lokasi yang terkenal yang nantinya dapat bersumber. Sebagai contoh:sumber
gpg-agent[2333]: WARNING: "--write-env-file" is an obsolete option - it has no effect