重新连接到现有屏幕时,如何让屏幕自动连接到当前的 ssh-agent?

54 ssh gnu-screen ssh-agent

如果您在 ssh-agent 运行时启动屏幕会话(从 ssh -A 代理转发),则访问 ssh-agent 工作正常。但是,如果您与该会话分离、注销、再次登录(使用 ssh-agent 转发),然后重新连接到您的屏幕会话,则 ssh-agent 访问将不起作用。

如何解决这个问题?

api*_*ein 42

  1. 在您的 SSH rc 脚本 (~/.ssh/rc) 中,您将设置一个从规范位置到“当前”SSH_AUTH_SOCK 的符号链接。这是我在 bash 中的操作方法(~/.ssh/rc 的内容):

     #!/bin/bash
     if test "$SSH_AUTH_SOCK" ; then
         ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
     fi
    
    Run Code Online (Sandbox Code Playgroud)

(并确保chmod 750 ~/.ssh/rc)。“测试”只是为了防止在您没有运行 ssh-agent(即没有 ssh 的情况下 ssh -A)时显示错误。该命令的后半部分在规范位置设置符号链接,SSH_AUTH_SOCK在登录时将自身更新为“真实” 。这与在 ssh 中使用 shell 或直接调用命令无关,也适用于ssh -t <host> screen -RRD.

注意:~/.ssh/rcsshd的存在改变了 sshd 的行为。值得注意的是,它不会调用 xauth。有关更多信息以及如何解决此问题,请参阅 man sshd。

此外,您不应将“-v”与 ln 一起使用,因为它会通过以下诊断中断 rsync-over-ssh:

$ rsync -n addr.maps.dev.yandex.net: .
protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(173) [Receiver=3.0.7]
Run Code Online (Sandbox Code Playgroud)
  1. 在您的 .screenrc 中,您只需要将 SSH_AUTH_SOCK 覆盖到规范位置:

     setenv SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock
    
    Run Code Online (Sandbox Code Playgroud)

请注意,无论您使用什么 shell,您都使用 setenv;我认为 setenv 是屏幕语法,而不是外壳。

解决方案最初改编自这篇文章,它不起作用,但有正确的想法。


Col*_*son 27

我认为这可以简化@sandip-bhattacharya 的回答。将其放入您的~/.bashrc文件中,并在任何当前正在运行的屏幕会话中运行导出命令。

if [ -S "$SSH_AUTH_SOCK" ] && [ ! -h "$SSH_AUTH_SOCK" ]; then
    ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
Run Code Online (Sandbox Code Playgroud)

其内容为“如果$SSH_AUTH_SOCK是套接字 ( -S) 而不是符号链接 ( ! -h),则在已知路径上创建新的符号链接。在所有情况下,重新定义SSH_AUTH_SOCK以指向已知路径。

! -h避免创建循环引用,如果你运行多次。

此外,如果您使用byobu,它会自动执行此操作,而无需编辑任何配置文件。

我在这个(byobu也有)中发现的唯一错误是,如果您打开第二个ssh -AForwardAgent连接,它将覆盖第一个套接字,如果您在第一个连接之前关闭第二个连接,您将丢失唯一的好套接字。

  • 这也适用于`tmux`。 (2认同)