Как я могу заставить ssh-agent работать над ssh и в tmux (на OS X)?


17

У меня есть личный ключ, настроенный для моей учетной записи на github, парольная фраза к которой, я полагаю, хранится в цепочке для ключей OS X. Мне, конечно, не нужно вводить его, когда я открываю окно терминала и вхожу ssh git@github.com.

Однако, когда я запускаю bash в сеансе ssh или локально в сеансе tmux, мне приходится вводить парольную фразу каждый раз, когда я пытаюсь выполнить ssh в github.

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

РЕДАКТИРОВАТЬ :

В ответ на ответ @ Mikel из локального терминала я получаю следующий вывод:

[~]
$ echo $SSH_AUTH_SOCK
/tmp/launch-S4HBD6/Listeners
[~] 
$ ssh-add -l
2048 [my key fingerprint] /Users/richie/.ssh/id_rsa (RSA)
[~]
$ typeset -p SSH_AUTH_SOCK
declare -x SSH_AUTH_SOCK="/tmp/launch-S4HBD6/Listeners"

Тогда как по ssh или по tmux я получаю:

[~]
$ echo $SSH_AUTH_SOCK

[~]
$ ssh-add -l
Could not open a connection to your authentication agent.
[~]
$ typeset -p SSH_AUTH_SOCK
bash: typeset: SSH_AUTH_SOCK: not found

echo $SSH_AGENT_PID ничего не возвращает независимо от того, из какой оболочки я запускаю.


Как насчет typeset -p SSH_AUTH_SOCK?
Микель

@Mikel bash: typeset: SSH_AUTH_SOCK: not foundизнутри ssh / tmux. Я попробую это локально сегодня вечером, если необходимо.
Богатое

@Mikel Я добавил вывод этой команды в вопрос.
Рич

AFAIK, вопрос и ответы не являются специфичными для OS X. Это важно, чтобы избежать некоторых ошибок, не относящихся к OS X, а именно superuser.com/q/334975/46794 и superuser.com/q/479796/46794 .
Blaisorblade

@Blaisorblade У меня сложилось впечатление, что моя парольная фраза была сохранена в цепочке ключей OS X (хотя сейчас я не могу вспомнить, почему я так считал). Это неверно?
Рич

Ответы:


4

Мой коллега создал несколько функций bash, чтобы помочь найти живого агента: https://github.com/wwalker/ssh-find-agent

Он использует его в основном для соединения между системами (от ноутбука к настольному компьютеру и т. Д.), Но я чаще всего использую его для локальных сеансов tmux, когда вы выходите из / в своем оконном менеджере (OS X для меня).

использование

  1. Скачайте ssh-find-agent.bash ( git clone git://github.com/wwalker/ssh-find-agent.gitработает).

  2. Добавьте следующее в ~ / .bashrc:

    . /path/to/ssh-find-agent.bash
    
  3. Затем вы можете ввести следующее, чтобы установить SSH_AUTH_SOCK в вашей текущей оболочке:

    set_ssh_agent_socket
    

Я принял этот ответ, а не любой другой, который мог бы работать, потому что он не требует переадресации агента SSH, что лучше для моих целей. Благодарность!
Богатый

8

Элегантное решение, взятое с сайта dagit.o :

Создайте ~/.ssh/rc

#!/bin/bash
if [ -S "$SSH_AUTH_SOCK" ]; then
    ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi

добавить в ~/.tmux.conf

set -g update-environment "DISPLAY SSH_ASKPASS SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY"
set-environment -g 'SSH_AUTH_SOCK' ~/.ssh/ssh_auth_sock

7

В вашем .tmux.confконфигурационном файле добавьте эту строку:

установить -g update-environment "SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION"

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


2
Это подходящий метод для получения этих значений в сеансе tmux , но все эти переменные среды уже должны быть включены в значение по умолчанию update-environment. ОП должен проверить их update-environmentзначение и, возможно, обновить, где бы он ни изменялся.
Крис Джонсен

1
Хм ... после того, как копать дальше, я согласен - перечисленные мной настройки уже по умолчанию, и если я запускаю tmux без файла .tmux.conf, все работает правильно. И если я удалю строку, которую я цитирую, из моего файла .tmux.conf, это тоже работает для меня, хотя раньше этого не происходило. Там явно что-то еще происходит иногда. Может быть, сделать с приостановить / восстановить или подключить / отключить или sshing в сеансе tmux удаленно. Я буду держать глаза открытыми и обновлять, если найду фактор, который делает его воспроизводимым.
Тревор Пауэлл

update-environmentустановлен правильно. Тем не менее, проблема все еще возникает.
Рич

2
Проблема в том, что config будет перезапускаться только тогда, когда нет ни одного tmuxсервера, игнорируя цель повторного присоединения ... Может быть, есть переключатель командной строки для повторного обновления этих переменных?
Тобиас Кинцлер

3

Со мной случилось, что панели, созданные при подключении через ssh из OS X, через некоторое время начали спрашивать мой пароль. Я нашел способ исправить эту кражу из http://santini.di.unimi.it/extras/ph/my-tmux-setup.html

eval $(tmux show-environment -t [YOUR-SESSION] | grep '^SSH_AUTH_SOCK')

Просто запустите его из жалующейся панели.


2

Не уверен, что вы используете bash или другую оболочку, но настройка tmux этого парня выглядит так, как будто она работает для bash. Лично я использую zsh с oh-my-zsh и обнаружил, что ssh-agent начал работать в tmux после добавления

zstyle :omz:plugins:ssh-agent agent-forwarding on

в мой файл .zshrc и перезагрузил конфигурацию в моих текущих сеансах zsh. Я также нашел Zsh-ориентированное решение этого парня , но оно оказалось ненужным для меня.


1

Что значит:

echo $SSH_AUTH_SOCK
echo $SSH_AGENT_PID
ssh-add -l

Распечатать?

Запустите его в своем обычном терминале, затем запустите в своей tmuxсессии. Они должны напечатать то же самое.


Я добавил ответ на эти команды на вопрос. Я также понял, что проблема также возникает, когда я захожу через ssh (без использования tmux), и соответственно отредактировал вопрос.
Рич

4
sshлегко. Включите переадресацию агента. Самый простой способ сделать это - запустить ssh -Aвместо ssh. Используйте псевдоним, чтобы вам не приходилось каждый раз вводить его или вставлять в свой .SSH/config.
Микель

Хорошо, спасибо. Это сработало для SSH. Есть идеи как это исправить в tmux?
Богатое

0

Существует много решений, но самое простое можно найти в ответе Ханса Гинзеля от 8 января 2016 года на связанный вопрос StackOverflow от 27 января 2014 года . Просто добавьте следующее в вашу оболочку ~/.profileили подобное:

alias ssh='eval $(tmux show-env -s | grep "^SSH_") && ssh'

Нет необходимости определять многострочные функции или создавать новые временные файлы. Если вы не хотите использовать псевдоним ssh, просто измените его на fixsshи удалите && sshв конце и запускайте fixsshвсякий раз, когда вы пытаетесь запустить его sshиз подключенного сеанса tmux.

Ответ Ханса Гинзела предполагает, что для запуска требуется «более новая версия» tmux show-env -s. Это работает для меня в tmux 2.7, и когда я прочитал список изменений , он -sбыл добавлен 3 июня 2008 года, прямо перед выпуском tmux 0.3. tmux 2.3 (29 сентября 2016 г.) находится в стабильной версии Debian.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.