Подтвердить что ты не робот

Как автоматически обновлять переменные среды агента SSH при подключении к существующим сеансам tmux

Я пытаюсь найти хороший способ восстановления агента SSH при повторном подключении отключенного сеанса tmux.

Причина заключается в том, что сеанс агента SSH изменяется, но переменная среды из сеанса tmux не обновляется.

Как я могу автоматизировать это, прежде чем присоединить сам сеанс? Поскольку сеанс, к которому я привязываюсь, не всегда имеет приглашение bash, поэтому я не могу позволить себе вводить что-то внутри него. Это должно быть чем-то, что нужно выполнить перед созданием или присоединением сеанса tmux.

Пример кода, который я запускаю, находится в https://gist.github.com/ssbarnea/8646491 - небольшой обертке ssh, которая использует tmux для создания persistem ssh соединения. Это работает довольно хорошо, но иногда агент ssh перестает работать, поэтому я больше не могу использовать его для подключения к другим хостам.

4b9b3361

Ответ 1

Там превосходный gist Martijn Vermaat, который очень подробно решает вашу проблему, хотя предназначен для пользователей экрана, поэтому я настраиваю его для tmux здесь.

Подводя итог:

  • создайте ~/.ssh/rc, если он еще не существует, и добавьте следующий контент:

    #!/bin/bash
    
    # Fix SSH auth socket location so agent forwarding works with tmux
    if test "$SSH_AUTH_SOCK" ; then
      ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
    fi
    
  • Заставьте его работать в tmux, добавьте его в свой ~/.tmux.conf:

    # fix ssh agent when tmux is detached
    setenv -g SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock
    

Требуется дополнительная работа, если вы хотите включить пересылку X11, см. gist.

Ответ 2

Пока tmux обновляет SSH переменные по умолчанию, нет необходимости

  • изменить/добавить путь к сокету
  • измените переменную SSH_AUTH_SOCKET

Мне нравится решение Chris Down, которое я изменил, чтобы добавить функцию

fixssh() {
    eval $(tmux show-env    \
        |sed -n 's/^\(SSH_[^=]*\)=\(.*\)/export \1="\2"/p')
}

в ~/.bashrc. Вызовите fixssh после присоединения сеанса или до SSH/scp/rsync.

Более новые версии tmux поддерживают -s для show-env, поэтому только

eval $(tmux show-env -s |grep '^SSH_')

возможно.

Ответ 3

Здесь я использую для обновления SSH_AUTH_SOCK внутри окна tmux (на основе Ханса Гинцеля script):

alias fixssh='eval $(tmux showenv -s SSH_AUTH_SOCK)'

Или для tmux, у которого нет showenv -s:

alias fixssh='export $(tmux showenv SSH_AUTH_SOCK)'

Ответ 4

Вот мое решение, которое включает в себя оба подхода и не требует дополнительной настройки при повторном подключении к сеансу tmux

alias ssh='[ -n "$TMUX" ] && eval $(tmux showenv -s SSH_AUTH_SOCK); /usr/bin/ssh'