我可能已经制定了一个完全封装在~/.tmux.conf
配置文件中的解决方案。这是与修改~/.bash_profile
and不同的方法~/.ssh/rc
。
仅使用解决方案~/.tmux.conf
只需将以下代码剪切并粘贴到您的~/.tmux.conf
# ~/.tmux.conf
# SSH agent forwarding
#
# Ensure that SSH-Agent forwarding will work when re-attaching to the tmux
# session from a different SSH connection (after a dropped connection).
# This code will run upon tmux create, tmux attach, or config reload.
#
# If there is an SSH_AUTH_SOCK originally defined:
# 1) Remove all SSH related env var names from update-environment.
# Without this, setenv cannot override variables such as SSH_AUTH_SOCK.
# Verify update-environment with: tmux show-option -g update-environment
# 2) Force-set SSH_AUTH_SOCK to be a known location
# /tmp/ssh_auth_sock_tmux
# 3) Force-create a link of the first found ssh-agent socket at the known location
if-shell '[ -n $SSH_AUTH_SOCK ]' " \
set-option -sg update-environment \"DISPLAY WINDOWID XAUTHORITY\"; \
setenv -g SSH_AUTH_SOCK /tmp/ssh_auth_sock_tmux; \
run-shell \"ln -sf $(find /tmp/ssh-* -type s -readable | head -n 1) /tmp/ssh_auth_sock_tmux\" \
"
警告
当启动到同一台机器的多个连接时,上述解决方案以及其他解决方案容易受到竞争条件的影响。考虑一下:
- 客户端 1 连接:SSH 到 machineX,启动/附加 tmux(写入
ssh_auth_sock
链接)
- 客户端 2 连接:SSH 到 machineX,启动/附加 tmux(覆盖
ssh_auth_sock
链接)
- 客户端 2 断开连接:客户端 1 留下一个陈旧的
ssh_auth_sock
链接,从而中断ssh-agent
但是,此解决方案的弹性稍强一些,因为它仅ssh_auth_sock
在 tmux 启动/附加时覆盖链接,而不是在初始化 bash shell~/.bash_profile
或 ssh 连接时~/.ssh/rc
为了覆盖最后一个竞争条件,可以添加一个键绑定以使用(Ctrl-b r)
键序列重新加载 tmux 配置。
# ~/.tmux.conf
# reload config file
bind r source-file ~/.tmux.conf
在活动的 tmux 会话中,当ssh_auth_sock
链接失效时执行此序列将刷新 ssh-agent 连接。