ssh-agent 和 screen

ssh-agent 和 screen

不久前,我在 StackOverflow 上问过关于 ssh-agent 和 crontab 的这个问题。我现在对 Linux 系统上的 ssh-agent 和 screen 也有类似的问题。

因此,在我的 Mac 上,ssh-agent 会在系统启动时启动,因此它始终可用。如果我使用 X-Windows,我认为在我的 Linux(redhat el5/fedora)下也是如此。但是,这是一台远程服务器计算机,我总是通过 ssh 登录。

我希望 ssh-keys 能够正确设置,这样我就不必在 svn 更新或提交期间多次输入密码。我很乐意在每个会话中输入一次密码,并且我不鼓励我们的团队使用无密码的 ssh-keys。

有那么一瞬间,我似乎觉得在我的 .bash_profile 中执行“eval `ssh-agent -s`”并配合一个在我注销时关闭 ssh-agent 的命令就可以了。然而,我们大量使用屏幕为了管理长时间运行的交互式程序和开发环境。如果您按照我刚才描述的方式启动和停止 ssh-agent,那么当您退出终端时它会被终止,并且曾经引用该 ssh-agent 实例的屏幕子会话将被放弃。

那么...我怎样才能成为一个使用屏幕的控制台用户,使用带有 ssh 密钥的密码,而不必不断输入密码?

答案1

使用以下设置,您不需要任何包装器来调用screen。此外,它避免使用/tmp(从而带来安全风险)。

  1. 确保您有一个 ~/tmp 目录:

    mkdir ~/tmp
    
  2. 添加.screenrc以下行:

    setenv SSH_AUTH_SOCK "$HOME/tmp/ssh-agent-screen"
    
    • 这确保了在内部screen始终ssh在相同的位置寻找套接字,而不是在不断变化的路径上。
    • 您必须使用setenv您所使用的任何 shell,因为它是一个屏幕而不是 shell 命令。
  3. 添加.bash_profile以下行:

    [ -n "$SSH_AUTH_SOCK" ] && [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ] && ln -sf "$SSH_AUTH_SOCK" "$HOME/tmp/ssh-agent-screen"
    
    • 这将从固定位置(外观ssh)链接到真实位置,并且必须出现开始ssh-agent
    • 使用[ -n "$SSH_AUTH_SOCK" ]将正确防止SSH_AUTH_SOCK未设置时出现错误。
    • [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ]如果屏幕来源,将阻止屏幕会话将 $HOME/tmp/ssh-agent-screen 链接到其自身.bash_profile
  4. 您可以考虑使用 来连接,而不是从 启动ssh-agent(以使用代理转发并让远程机器使用您的代理)。.bash_profilessh -A

完成此设置后,您就可以使用标准屏幕命令。您只需重新创建现有会话或手动将其中的 SSH_AUTH_SOCK 设置为步骤 2 的固定位置。

致谢本网站这个想法;我避免使用/tmp这个答案类似,但使用额外的别名。

答案2

你能从 initscript 启动 ssh-agent 吗.bash_profile?例如,我可能会输入

su -c 'ssh-agent -s > ~/.ssh_agent_env' myusername

在 的相应部分/etc/conf.d/local,尽管 RHEL/Fedora 可能使用不同的系统。正如您在评论中指出的那样,终端会话需要能够连接到代理,这就是该命令.ssh_agent_env在用户主目录中创建文件的原因。然后您可以添加

[ -f ~/.ssh_agent_env ] && source ~/.ssh_agent_env >/dev/null

.bash_profile

您可以做的另一件事是将以下内容放入.bash_profile

ps -U myusername | grep -q ssh-agent || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null

ssh-agent仅当它尚未运行时才会启动。这样您就不必将其终止。

与第二个建议稍有不同的是,ssh-agent您可以检查文件是否存在,而不是检查进程是否存在~/.ssh_agent_env

[ -f ~/.ssh_agent_env ] || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null

如果一切正常,这两种方式之间应该不会有任何显著的差异。

答案3

查看钥匙链。它可以完成上述所有操作。请特别注意--clear--timeout选项。

答案4

跟进 ssh 代理转发,您会发现,一旦您注销、重新登录并重新连接到您的会话,转发的 ssh 凭据将默认不可用于您的屏幕会话。

不过,您可以通过让屏幕将 SSH_AUTH_SOCK 环境变量设置为某个众所周知的内容,并将该众所周知的位置更新为您当前的身份验证套接字,来解决此问题。

我使用这个 shell 函数重新进入屏幕并修复 ssh auth sock:

function sr () { 
    if [ ${+STY} = 1 ] ;then 
            echo already in screen\!
    else
            if [ "${SSH_AUTH_SOCK}x" != "x" ]; then
                    if [ ! -d /tmp/screenssh ]; then
                            mkdir /tmp/screenssh 
                    fi
                    rm -f /tmp/screenssh/socket
                    ln -s $SSH_AUTH_SOCK /tmp/screenssh/socket
                    echo $REMIP > /tmp/screenssh/remip
            fi                
            screen -DR
    fi
}

我的 .screenrc 中有这个:

setenv SSH_AUTH_SOCK /tmp/screenssh/socket

希望这可以帮助。

相关内容