tmux 中 ssh-agent forwarding 失效问题

作为程序员,我是比较懒的,对于重复性的劳动深恶痛绝。

之前 byobu 和 screen 用的不怎么顺手,没有坚持下去;后来转向 tmux,经过一段时间的摸索,发现还是 蛮好用的。

目前的工作模式使用一台 Mac book,ssh 到一台或者两台 Ubuntu 做开发工作,利用 tmux 打开好几个终端。 下班前做 tmux 的 detach 动作, 第二天上班重新 attach 上去。

问题来了。重新 attach 后 ssh agent forwarding 就无法成功了,导致向 gerrit push 或者 fetch 的动作 fail; 无耐之下只能将 tmux session 解散,重新组织队伍。 这样无意义的重复劳动是不能接受的。

阅读 tmux 的帮主手册; google 之,在 stackexchange 找到了解决方案,但觉得不够完美(存在安全风险);

又花了两个小时了解 ssh-agent forwarding 的原理和流程, 发现一篇好文章: An_Illustrated_Guide_to_SSH_Agent_Forwarding .

仔细阅读帮助手册,发现问题出在环境变量 SSH_AUTH_SOCK 上面。

SSH_AUTH_SOCK 代表一个 unix domain socket 文件,由 sshd 创建 shell 时指定, 是 ssh-client 和 sshd 做 ssh-agent forwarding 的桥梁;shell 退出时失效; 但是 tmux 在 session 保存了该变量。 当再次 attach 时 (tmux detach, 退出 shell,登录 shell, tmux attach), tmux session 中保存的 SSH_AUTH_SOCK 还是第一次登录时 sshd 分配的,已经失效,应该使用当前登录 shell 环境变量中保存的值。

但是 tmux 的 update-environment 和 set-environment 在 attach session 好像不会生效,即使重新 load 配置文件也 没有效果。暂时只能采用 stackexchange 的方案。