Использование агента ssh из emacs в режиме сервера

Я запускаю emacs в режиме сервера в качестве пользовательской службы systemd и хочу получить данные из удаленного репозитория с аутентификацией по ключу с помощью magit. К сожалению, magit (или его дочерний процесс git) не может использовать мой уже загруженный открытый ключ. По-видимому, я не могу подключиться к своему ssh-агенту из контекста emacs.

Запустите из emacs:

~ ssh-add  
Could not open a connection to your authentication agent.

Есть ли известный способ решить эту проблему или мне нужно разобраться, как на самом деле взаимодействуют ssh-agent и клиенты?


person choeger    schedule 09.02.2017    source источник
comment
ssh-agent выводит некоторые переменные среды (в виде исходного сценария оболочки) при запуске. Если этот агент все еще работает, и вы записали эти настройки в читаемый файл, я полагаю, что вы сможете подключиться к этому агенту, прочитав эти значения в своей среде. Вы можете управлять этим самостоятельно или использовать что-то вроде связки ключей.   -  person phils    schedule 10.02.2017


Ответы (2)


Я использую keychain для управления ssh-агентами. Он запускает агент и выгружает соответствующие параметры (PID агента и сокет) в сценарий, который может быть получен из оболочки. Есть пакет Emacs keychain-environment, который может вставить это в Emacs.

~/.bash_profile:

# keychain manages ssh-agents
type keychain >&/dev/null \
    && keychain --agents ssh

Это запускает запуск keychain при входе в систему, который запускает ssh-agent и выгружает его информацию в файл. keychain является идемпотентным, поэтому последующие входы в систему (например, вход с помощью ssh) не запустят новый ssh-agent, если он уже запущен.

~/.bashrc:

# keychain keeps track of ssh-agents
[ -f $HOME/.keychain/$HOSTNAME-sh ] \
    && . $HOME/.keychain/$HOSTNAME-sh

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

~/.emacs.d/init.el:

(require 'keychain-environment)
(keychain-refresh-environment)

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

person jpkotta    schedule 10.02.2017
comment
Можете ли вы уточнить свою конфигурацию? Мне не удалось воспроизвести эту установку. У вас работает с emacs в режиме сервера? Нужно ли сначала запускать терминал, чтобы связка ключей выполнялась? - person skizo; 14.06.2018
comment
Связка ключей должна запускаться при входе в систему, потому что ~/.bash_profile должна выполняться при входе в систему. Чтобы проверить, посмотрите, например. ~/.keychain/$HOSTNAME-sh и убедитесь, что запущен процесс ssh-agent с соответствующим PID. Я запускаю emacs в режиме сервера, но запускаю его как emacsclient -c -a ''. - person jpkotta; 14.06.2018

Агент ssh должен быть запущен в родительском процессе процесса, который вы хотите использовать. Вот почему он часто запускается как часть настройки оконного менеджера — все подпроцессы оконного менеджера, то есть терминалы и программы, запускаемые пользователем, смогут использовать ssh-агент.

В вашем случае вы, возможно, могли бы запустить ssh-agent в качестве родительского процесса в вашей пользовательской службе systemd, которая запускает emacs, но тогда, конечно, ваш агент не будет работать с другими видами использования, например, с терминалов, открытых под вашим wm.

person Tim X    schedule 10.02.2017