Как я могу переслать уже переадресованный ключ ssh в tmux?


15

Я подключаюсь через SSH с компьютера, на котором хранятся мои ключи, пересылаю на вторую машину, а затем пытаюсь использовать ключи из tmux. Я, кажется, "потерял" переадресацию при входе в tmux. Как можно «снова переслать», чтобы я мог использовать свои ключи из tmux?

$ ssh [server] -o ForwardAgent=yes
$ git pull       # Succeeds.
$ /bin/bash
$ git pull       # Still succeeds, despite new shell.
$ exit
$ tmux attach
$ git pull       # Permission denied (publickey)

Я подтверждаю, что если вы запускаете агент, общий для всех ваших сеансов, он работает. В документации по bose.utmb.edu/Compu_Center/ssh/SSH_HOWTO.html > Настройка ssh-agent Process объясняется метод достижения этого результата.
Дерексон,

Также актуально: unix.stackexchange.com/questions/75681/…
Джо,

Ответы:


12

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

Попробуйте это исправить :

  1. Создайте этот скрипт и поместите его в $ HOME / .ssh / saveagent

    #!/bin/sh
    SSHVARS="SSH_CLIENT SSH_TTY SSH_AUTH_SOCK SSH_CONNECTION DISPLAY"
    
    for var in ${SSHVARS} ; do
      echo "export $var=\"$(eval echo '$'$var)\""
    done 1>$HOME/.ssh/latestagent
  2. Добавьте его в свой скрипт запуска оболочки. Например, если вы используете bash:

    echo '. ~/.ssh/saveagent' >> ~/.bash_login
  3. После подключения tmux запустите . $HOME/.ssh/latestagent

Смотрите также Как я могу запустить скрипт сразу после подключения через SSH? и присоединиться к сеансу tmux и запустить команду


1
Отправьте на .profile, может быть, если вы пытаетесь быть совместимым с другими оболочками.
Дерексон,

2
Отличный ответ! Несколько вопросов , я столкнулся: а - некоторые из переменных окружения содержат пробелы, поэтому строку перед последним в saveagentсценарии должны быть: echo "export $var=\"$(eval echo '$'$var)\"". b - latestagentскрипт должен вызываться sourceвместо sh, поэтому установка переменных повлияет на вызывающую оболочку. c - latestagentавтоматический вызов скрипта при подключении tmux может быть выполнен по методу, описанному здесь: unix.stackexchange.com/questions/86925/…
Джо,

Спасибо @Joe, я изменил свой ответ, чтобы включить ваши улучшения.
GnP

0

Если вы не хотите создавать сценарий, содержащий все переменные, которые вам нужны, в каждой оболочке, которую tmuxвы потом порождаете в любой новой оболочке, порожденной теми же сеансами на сервере, вы, вероятно, захотите указать tmuxпеременные в сеансе или глобальных средах с помощью set-environmentкоманды. Например, вот так (для bash):

for var in DISPLAY SSH_AUTH_SOCK ...; do
    tmux setenv "$var" "${!var}"
done

не забудьте добавить -gфлаг, если вы хотите его использовать и в других сеансах, и использовать, -t <session>если вы запускаете его извне tmux.


0

Прочитав другие ответы здесь, я решил просто скопировать мою пару открытых / закрытых ключей на удаленный сервер, чтобы мне больше не нужно было беспокоиться о переадресации агента.

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