আমি bashডেবিয়ান .0.০..6 বাক্সে জিপিজি স্ক্রিপ্ট করার সময় কিছু সমস্যা নিয়ে লড়াই করছি । আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা ব্যাচের ক্রিয়াকলাপ করে এবং একটি জিপিজি-এজেন্টটি এগিয়ে যাওয়ার চেষ্টা করার আগে তা উপলব্ধ রয়েছে কিনা তা নিশ্চিত করতে চায়।
যেহেতু জিপিজি-এজেন্ট কোনও পদক্ষেপ নেবে না এবং ইতিমধ্যে চলমান অবস্থায় চালু করা হলে সাফল্য ফিরে পাবে না, এজেন্টের উপস্থিতি নিশ্চিত করা এতটাই সহজ:
eval $(gpg-agent --daemon)
gpg-agent শুরু করুন, বা রিপোর্ট করবেন:
gpg-agent[21927]: a gpg-agent is already running - not starting a new one
এবং ইতিমধ্যে চলমান থাকলে 0 (সাফল্য) ফিরে আসুন।
সমস্যা দেখা দেয় যখন কোনও এজেন্ট ইতিমধ্যে অন্য সেশনে চলছে। gpg-agentবলে যে এটি ইতিমধ্যে চলছে ... তবে gpgস্ব স্ব দাবি করেন যে এটি অনুপলব্ধ।
$ 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
এটি আমাকে হতাশ এবং বিভ্রান্ত করে তোলে। এটি প্রদর্শিত হয় যে gpg-agentএজেন্টকে তার স্ব জিপিজি করার জন্য একটি আলাদা উপায়ে সনাক্ত করছে। সবচেয়ে খারাপ, gpgএজেন্ট কোনও স্ক্রিপ্টযোগ্য উপায়ে পাওয়া যায় কিনা তা জিজ্ঞাসা করার কোনও উপায়ই দেয় না, যেমনটি চূড়ান্তভাবে অযোগ্য ব্যবহারযোগ্য কীগুলি সহ প্রাপকদের উপেক্ষা করতে এবং এখনও সাফল্য ফিরিয়ে দিতে পছন্দ করে, তাই ব্যাচ শুরু করার আগে এই সমস্যাটি সনাক্ত করা খুব কঠিন hard আমি অন্যদের মধ্যে আই 18 এন কারণে জিপিজির আউটপুট পার্সিংয়ে যেতে চাই না।
আপনি নিশ্চিত আপনি চলমান একটি GPG-এজেন্ট বা আছে না করে এই প্রজনন করতে পারে GPG_AGENT_INFOএক টার্মিনাল চলমান সেট, তারপর eval $(gpg-agent --daemon)এবং মধ্যে আরেকটি টার্মিনাল উপরে চলছে। আপনি খেয়াল করবেন যে জিপিজি-এজেন্ট বলছে এটি ইতিমধ্যে চলছে, তবে জিপিজি এজেন্টের সাথে সংযোগ করতে ব্যর্থ হয়েছে।
ধারনা?
আপডেট : gpg-agentএকটি সুপরিচিত জায়গায় সকেট ফাইল সন্ধান করে এবং বেঁচে থাকার জন্য পরীক্ষা করার জন্য এটি লিখে অন্য এজেন্টকে সনাক্ত করে 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 সুপরিচিত সকেটের অবস্থান উপেক্ষা করে কেবল পরিবেশের দিকে নজর দেবে। ইন 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 */
}
আমি আবার এটিকে আবার শুরু করতে পারি তা নিশ্চিত করার জন্য আমি সত্যই এজেন্টটিকে হত্যা করতে চাই না এবং ব্যবহারকারীর এজেন্ট কোনও পরিবেশ ফাইল লিখতে পারে এমন কোনও আদর্শ জায়গা নেই। খারাপ, আমি উপস্থিতি পরীক্ষা করতে পারেন না GPG_AGENT_INFOপরিবেশ থেকে যে একটি মামুলি (মৃত) এজেন্টের যে যেহেতু প্রতিস্থাপিত করা হয়েছে পড়ুন পারে ... এবং তন্ন তন্ন gpgনা gpg-agentএজেন্ট ping এবং সত্য আসতে যদি এটা করার জন্য একটি কমান্ড লাইন বিকল্প প্রদান ঠিক আছে.