最新消息:

SSH Agent与GNU Screen的兼容问题

screen admin 3523浏览 0评论

关于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的兼容问题

您必须 登录 才能发表评论!