Как автоматически обновлять переменные среды агента SSH при подключении к существующим сеансам tmux
Я пытаюсь найти хороший способ восстановления агента SSH при повторном подключении отключенного сеанса tmux.
Причина заключается в том, что сеанс агента SSH изменяется, но переменная среды из сеанса tmux не обновляется.
Как я могу автоматизировать это, прежде чем присоединить сам сеанс? Поскольку сеанс, к которому я привязываюсь, не всегда имеет приглашение bash, поэтому я не могу позволить себе вводить что-то внутри него. Это должно быть чем-то, что нужно выполнить перед созданием или присоединением сеанса tmux.
Пример кода, который я запускаю, находится в https://gist.github.com/ssbarnea/8646491 - небольшой обертке ssh, которая использует tmux для создания persistem ssh соединения. Это работает довольно хорошо, но иногда агент ssh перестает работать, поэтому я больше не могу использовать его для подключения к другим хостам.
Ответы
Ответ 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'