IT技术博客大学习 共学习 共进步

SSH Agent与GNU Screen的兼容问题

将之典藏 2011-09-19 23:26:05 浏览 2,726 次

    关于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
    }

    建议继续学习

    1. Linux shell脚本使用while循环执行ssh的注意事项 (阅读 8,062)
    2. 在ssh服务里使用chroot (阅读 5,841)
    3. 为什么要用公钥/私钥而不是密码去做SSH身份验证 (阅读 5,701)
    4. 如何让ssh登录更加安全 (阅读 5,603)
    5. ssh连接超时解决办法 (阅读 5,504)
    6. 懒人连ssh不输密码若干大法 (阅读 5,483)
    7. SSH无密码登录 (阅读 5,483)
    8. ssh命令 (阅读 5,225)
    9. 共享会话的ssh连接配置 (阅读 4,703)
    10. 一句话crontab实现防ssh暴力破解 (阅读 4,564)