জিপিজি-এজেন্ট বলে এজেন্ট বিদ্যমান, কিন্তু জিপিজি বলে যে এজেন্টের অস্তিত্ব নেই?


9

আমি 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 এবং সত্য আসতে যদি এটা করার জন্য একটি কমান্ড লাইন বিকল্প প্রদান ঠিক আছে.


আমি জিপিজি-ব্যবহারকারীদের মেলিং তালিকায় জিজ্ঞাসাও করেছি; আর্কাইভগুলি প্রদর্শিত হওয়ার পরে আমি পোস্টটিতে লিঙ্ক করব।
ক্রেগ রিঞ্জার

ইউনিক্স.এসই প্রতি সেশনে একবারে পাসফ্রেজ প্রবেশ করার জন্য জিপিজি কনফিগার করার পদ্ধতিটি আমার একক ব্যবহারকারী সিস্টেমে যদিও কিছু সমস্যা সমাধান করেছে।
জোয়েল পুররা

উত্তর:


6
  1. আপনি এর প্রস্থান কোডটি চেক করতে পারেন gpg-connect-agent /bye
  2. আপনি $ জিপিজি_এজিআইআইএনএফওতে প্রদত্ত সকেটটি বিদ্যমান কিনা তা পরীক্ষা করতে পারেন। এটি পর্যাপ্ত হওয়া উচিত তবে আপনি জিপিজি_এজিআইআইএনএফওতে প্রদত্ত প্রক্রিয়াটি সকেটটি খুলেছে কিনা তা আপনি ফুসার বা এলএসফের সাথেও পরীক্ষা করতে পারেন। এবং আপনি যদি সত্যই অবসন্ন হতে চান আপনি / proc / $ পিআইডি / এক্সি / ইউএসআর / বিন / জিপিজি-এজেন্টের (বা যে কোনও কিছু) লিঙ্ক কিনা তাও পরীক্ষা করতে পারেন।

দুর্ভাগ্যক্রমে, এগুলির কোনওোটাই সমস্যাটি সমাধান করেন না। (1) জিপিজি-এজেন্ট চলমান কিনা তা সঠিকভাবে নির্ধারণ করে তবে এটি gpgনিজের স্বর মতো একইভাবে পরীক্ষা করে না , ফলস্বরূপ যখন জিপিজি এজেন্টের সাথে সংযোগ রাখতে ব্যর্থ হয় তখন এটি সফল হতে পারে। এজেন্টটি চলমান থাকতে পারে (২) এর ক্ষেত্রেও একই কথা, তবে বর্তমান সেশনে GPG_AGENT_INF সেট করা হয়নি এবং ইতিমধ্যে চলমান এজেন্টের gpg-agentকমান্ড জিজ্ঞাসা করার কোনও আপাত উপায় নেই GPG_AGENT_INFO
ক্রেগ রিঞ্জার


3

আমার কাছে এখন পর্যন্ত সবচেয়ে ভাল কাজটি হ'ল নিম্নলিখিত জঘন্য জগাখিচুড়ি:

if ! test -v GPG_AGENT_INFO; then
    if gpg-agent 2>/dev/null; then
        if test -e /tmp/.gpg-agent-$USER/env; then
            . /tmp/.gpg-agent-$USER/env
        elif test -e ~/.gpg-agent-info; then
            . ~/.gpg-agent-info
        else
            echo 'A gpg agent is running, but we cannot find its socket info because'
            echo 'the GPG_AGENT_INFO env var is not set and gpg agent info has not been'
            echo 'written to any expected location. Cannot continue. Please report this'
            echo 'issue for investigation.'
            exit 5
        fi
    else
        mkdir /tmp/.gpg-agent-$USER
        chmod 700 /tmp/.gpg-agent-$USER
        gpg-agent --daemon --write-env-file /tmp/.gpg-agent-$USER/env
        . /tmp/.gpg-agent-$USER/env
    fi
    # The env file doesn't include an export statement
    export GPG_AGENT_INFO
else
    if ! gpg-agent 2>/dev/null; then
        echo 'GPG_AGENT_INFO is set, but cannot connect to the agent.'
        echo 'Unsure how to proceed, so aborting execution. Please report this'
        echo 'issue for investigation.'
        exit 5
    fi
fi

এটি GPG_AGENT_INFOপরিবেশে যাচাই করবে এবং এটি সেট করা থাকলে, নিশ্চিত করুন যে জিপিজি-এজেন্ট আসলে চলছে। (এটি জিনোমের এজেন্টের মতো অন্যান্য জিপিজি-এজেন্ট প্রয়োগের সাথে কীভাবে ইন্টারঅ্যাক্ট করে তা আমি এখনও নিশ্চিত নই)) যদি এজেন্টের তথ্য সেট করা থাকে তবে এজেন্ট চলমান না থাকে তবে কীভাবে মোকাবেলা করতে হবে এবং ছেড়ে দিতে হবে তা জানে না।

যদি এজেন্ট তথ্য সেট না করা থাকে তবে এটি এজেন্ট চলছে কিনা তা পরীক্ষা করে দেখুন। যদি এটি হয় তবে এটি কয়েকটি পরিচিত জায়গাগুলিতে এনভির তথ্য অনুসন্ধান করে এবং এটি এটি খুঁজে পেতে ব্যর্থ হলে, ছেড়ে দেয়।

যদি এজেন্ট চলমান না থাকে এবং এজেন্টের তথ্য সেট না করা থাকে তবে এটি একটি এজেন্ট শুরু করে, এনভিভ ফাইলটি একটি ব্যক্তিগত অবস্থানে লিখে এবং এগিয়ে যায়।

আমি এই ভয়াবহ, ব্যবহারকারী-প্রতিকূল এবং অবিশ্বস্ত হ্যাকের সাথে সন্তুষ্ট তা বলাই বাহুল্য।

এটি অত্যন্ত আশ্চর্যজনক যে gpg, একটি সুরক্ষা / ক্রিপ্টো সরঞ্জাম, যুক্তি উপেক্ষা করে অগ্রসর হবে। --use-agentকোনও এজেন্ট চলমান না থাকলে একটি মারাত্মক ত্রুটি হওয়া উচিত, কমপক্ষে allyচ্ছিকভাবে, -rঅবৈধ প্রাপকের সাথে উল্লেখ করা ততোধিক অগ্রাহ্য হওয়ার পরিবর্তে ত্রুটি হওয়া উচিত। কমান্ডের পক্ষে gpgএটির এজেন্টকে ভিন্ন উপায় খুঁজে পাওয়া যায় তা gpg-agentহ'ল বিস্মিত হওয়া।


যথারীতি এটি আরও বার্তাবহও করা যায় ... :-) যদি জিপিজি_এজিআরআইএনএফও সেট (না ভুলভাবে) সেট করা থাকে এবং আপনি পিআইডি (যেমন দ্বারা pgrep gpg-agent) জানেন তবে ypu সকেটটি সন্ধান করতে এটি করতে পারেন:lsof -n -p $PID | grep S.gpg-agent$ | awk '{print $NF}'
হউক লেজিং

1
@ হককিজিং ... যদি এটি সত্যিই কাজে gpg-agentনা বলে gnome-keyring-daemonথাকে। 'কারণ এটি ইতিমধ্যে যথেষ্ট ভয়ঙ্কর ছিল না: এস। আমি বিস্মিত হয়েছি যে এটি এতগুলি বেমানান গণ্ডগোল।
ক্রেগ রিঞ্জার

! test -v GPG_AGENT_INFO ম্যাক ওএস এক্সে কাজ করে না [ -z ${GPG_AGENT_INFO+x} ]instead পরিবর্তে আপনাকে এর মতো কিছু ব্যবহার করতে হবে।
ড্যান লোয়েহের্জে

2

আমার উবুন্টু সিস্টেমে gpg-agentএর পরিবেশ ফাইলটি ~/.gnupg/gpg-agent-info-$(hostname)(যা দ্বারা সম্পন্ন করা হয় /etc/X11/Xsession.d/90gpg-agent) লিখতে কনফিগার করা হয়েছে । যদি আপনার সিস্টেম এটি না করে আপনি এজেন্ট যেভাবে কোনও পরিবেশিত ফাইলটি কোনও সুপরিচিত জায়গায় লিখতে শুরু করেছেন সেই পদ্ধতিটি সংশোধন করতে পারেন যা পরে উত্সাহিত করা যেতে পারে। উদাহরণ স্বরূপ:

$ gpg-agent --daemon --write-env-file="$HOME/.gnupg/gpg-agent-info"
$ source ~/.gnupg/gpg-agent-info

হ্যাঁ, সমস্যাটি হ'ল আমি এমন সরঞ্জামগুলি স্ক্রিপ্ট করছি যা বহনযোগ্য হতে হবে; আমি সত্যিই ডিস্ট্রো-নির্দিষ্ট বিশদগুলির উপর নির্ভর করতে পারি না। যদি কোনও এজেন্ট ইতিমধ্যে চলমান থাকে এবং কোনও এনভিভি ফাইল ইতিমধ্যে কোথায় থাকতে পারে তা আমি নির্ধারণ করতে পারি না জিপিজি-এজেন্ট একটি এনভিভি ফাইল লিখবে না। যদি জিপিজি-এজেন্ট --writ-env-file বর্তমানে চলমান এজেন্টকে জিজ্ঞাসা করত এবং একটি এনভিভি ফাইল লিখত, তবে এটি ঠিক আছে, তবে তা হয় না।
ক্রেগ রিঞ্জার

1
এনবি:gpg-agent[2333]: WARNING: "--write-env-file" is an obsolete option - it has no effect
কেন্ট ফ্রেড্রিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.