关于SSH Agent的使用可以见《SSH免密码认证进阶使用》一文,与GNU Screen之间会有这样一个问题:
- 在客户端运行ssh-agent并启用agent转发;
- 通过SSH登入服务器,服务器端会在临时文件夹生成auth socks文件A,并将A的路径写入环境变量SSH_AUTH_SOCK;
- 运行”screen”进入到GNU screen, screen会继承环境变量,读入环境变量SSH_AUTH_SOCK;
- 将screen会话挂起,退出服务器,这时socks文件A将会被销毁;
- 再一次通过SSH登入服务器,服务器会生成新的auth sock文件B;
- 恢复screen会话,但是由于恢复screen时不会再刷新环境变量,SSH_AUTH_SOCK的值仍然是A,但是socks文件A却早就被移除掉了,ssh-agent也就失去作用;
我目前的做法是,在.bashrc增加一段代码,每次在进入bash shell时会建立一个软连接指向当时的auth socks文件,然后将SSH_AUTH_SOCK环境变量的值设置为软连接的地址,问题得以解决:
agent_file=/tmp/ssh-agent-$USER.sock if [ "$SSH_TTY" -a "$SSH_AUTH_SOCK" -a "$SSH_AUTH_SOCK" != $agent_file ]; then ln -sfn $SSH_AUTH_SOCK $agent_file export SSH_AUTH_SOCK=$agent_file fi # 同时增加了一个函数,方便重建软连接,有些情况下用得着。 update_ssh_agent() { for sock in /tmp/ssh-*/agent* do if [ -S $sock ]; then ln -sfn $sock $agent_file fi done }
转载请注明:爱开源 » SSH Agent与GNU Screen的兼容问题