ssh-agent не добавляет ключ при запуске графически

Недавно я добавил следующий сценарий к автозапуску (в KDE):

eval `ssh-agent` ssh-add 

Сценарий должен быть запущен при входе в систему и запросить мою кодовую фразу и загрузить мой секретный ключ. Это почти нормально. Сценарии выполняются правильно, и агент запускается, и все переменные окружения заданы, и меня просят использовать мою кодовую фразу. Единственная проблема заключается в том, что после этого ключ не загружается. Но если я затем вхожу в ssh-add в терминал, меня попросят ввести кодовую фразу, и ключ хранится для остальной части моего X-сеанса.

Что я делаю не так? Почему ключ не загружен, хотя меня спрашивают за мою кодовую фразу?

PS: Я работаю на Debian jessie.

2 Solutions collect form web for “ssh-agent не добавляет ключ при запуске графически”

Есть два возможных сценария, о которых я могу думать, что может вызвать это.

Оба они связаны с тем, что многие настольные менеджеры запускают собственный агент ssh. Это делается потому, что агент должен быть запущен до того, как диспетчер рабочего стола для экспортируемых переменных будет загружен приложениями, запущенными диспетчером рабочего стола (ваш эмулятор терминала).

  1. Ваш менеджер рабочего стола запускает свой собственный агент ssh после запуска вашего компьютера и заменяет его.

    Я не уверен, в какой момент, или как, вы запускаете свой агент ssh, но если диспетчер рабочего стола запускает один за вашим, его экспортированные переменные переопределяют созданные вами.

  2. Ваш менеджер рабочего стола запускает свой собственный агент ssh перед вашим, и ваш не сохраняется.

    Если вы просто запускаете окно терминала и выполняете eval $(ssh-agent); ssh-add eval $(ssh-agent); ssh-add , то переменные, экспортируемые этим ssh-agent , не будут сохраняться после закрытия окна терминала. После запуска нового окна терминала вы получите переменные, заданные агентом ssh, запущенным диспетчером рабочего стола.


Способ работы ssh-agent заключается в том, что он запускает демона в фоновом режиме и затем выводит несколько переменных, которые необходимо настроить.

 $ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-JLbBwVBP4754/agent.4754; export SSH_AUTH_SOCK; SSH_AGENT_PID=4755; export SSH_AGENT_PID; echo Agent pid 4755; 

Поэтому, когда вы eval $(ssh-agent) , вы просто устанавливаете все эти переменные.

Теперь переменные только наследуются дочерними элементами, поэтому для их сохранения в вашем рабочем столе диспетчер должен быть установлен до запуска диспетчера вашего рабочего стола. Это может быть трудно получить правильно и варьируется между дистрибутивами. Вот почему многие настольные менеджеры делают это сами.
Обратите внимание, что это также иногда выполняется и при инициализации стека паники.

Как указывает Патрик, вполне вероятно, что ваш ssh-agent конкурирует с экземпляром, созданным вашей рабочей средой. Ну, конкуренция, вероятно, не правильное слово – переменные, позволяющие другим приложениям разговаривать с агентом, должны быть в их среде. Поскольку все приложения на вашем рабочем столе sessoin каким-то образом порождаются некоторой частью среды рабочего стола (позволяет предположить, что это менеджер сеансов), вам сначала нужно получить переменные в списке среды диспетчера сеансов. Это может произойти двумя способами:

  1. диспетчер сеанса делает это внутри (в зависимости от выбранного вами параметра). Это включало бы агент, создаваемый модулем PAM (вызываемый из диспетчера входа / сеанса).

  2. через пользовательский скрипт, такой как ваш. Однако это не так просто, как может показаться. Когда диспетчер сеансов запускает ваш скрипт, он создает новый процесс – интерпретатор сценариев. В своей среде переменные устанавливаются, но не могут быть легко экспортированы обратно в диспетчер сеансов – его родительский процесс. Это эквивалентно тому, что вы делаете то же самое в своей оболочке – запуск скрипта не будет иметь никакого эффекта в среде текущей оболочки. Вам нужно будет его source – тогда команды будут выполняться текущей оболочкой, что даст вам доступ к обновленным / созданным переменным. Это было бы довольно сложно сделать в диспетчере сеансов (поскольку это не интерпретатор оболочки). Таким образом, ваш ssh-agent самом деле не конкурирует. Он просто сидит там с идентификаторами, загруженными ssh-add из вашего скрипта, и никто не знает об этом.

Чтобы получить представление о том, что происходит, проверьте вывод 1

 ps fax | grep -E "(ssh|gpg)-[a]gent" 

и измените свой сценарий на

 echo "SSH_AUTH_SOCK=$SSH_AUTH_SOCK" > ~/ssh-agent.stdout echo "SSH_AGENT_PID=$SSH_AGENT_PID" >> ~/ssh-agent.stdout eval `ssh-agent | tee -a ~/ssh-agent.stdout` 

Это напечатает содержимое переменных в файле ~/ssh-agent.stdout а затем добавит результат от ssh-agent в этом самом месте до его обработки (и, таким образом, экспортирует переменные). Сравните содержимое файла с переменными среды SSH_AUTH_SOCK и SSH_AGENT_PID например, в недавно созданном терминале оболочки. В большинстве случаев вы сможете узнать, какой из них был запущен первым, поскольку PID (циклически) монотонно растут. Часть gpg-agent существует, потому что некоторые DE используют возможность gpg-agent для предоставления услуг агента SSH.

Вы также можете полностью удалить эту строку, вызывая ssh-agent – если ваш скрипт запускается после того, как агент SSH породил среду вашего рабочего стола, вы получите диалоговое окно с паролем (для подходящего агента, кстати), так как будут присутствовать переменные среды , Если нет, это означает, что ваш скрипт запускается до экземпляра агента DE и, таким образом, не имеет доступа к любому агенту вообще.


1 скобки – это аккуратный трюк, чтобы удалить сам grep из списка процессов.

  • Перенаправление агента SSH на сервере
  • sign_and_send_pubkey: сбой подписи: агент отказался от операции
  • git не использует глобальный файл конфигурации или открытый ключ
  • Как я могу решить эту проблему с ssh-agent?
  • ssh-add добавить все закрытые ключи в .ssh каталог
  • Поддерживает ли Gnome Keyring ключи OpenSSH нового формата?
  • Использование lftp с ssh-agent
  • Как использовать ssh-agent с несколькими (действительными) ключами и все же выбрать, какой из них использовать?
  • Как очистить ключи SSH от скрипта от root?
  • Вход в открытый ключ SSH: два разных ключа и поведение SSH_AUTH_SOCK
  • Как назначить ssh переадресованному агенту над файлом удостоверения?
  • Linux и Unix - лучшая ОС в мире.