更新/编辑我找到了正确的方法来做到这一点。只需在任何 byobu shell 中输入
. byobu-reconnect-sockets
和新 ssh 连接的 DISPLAY 环境变量,以及 SSH_AUTH_SOCK 和其他几个可能有用并依赖于主登录 shell 的变量(您所做byobu attach-session -t session_name
的或用于屏幕后端的,byobu -D -R session_name
或者您更喜欢这样做)。
这一切都应该通过按 CTRL-F5 来实现,但我怀疑像我一样,您的计算机正在拦截 CTRL-F5(对我来说,我在 Mac 上使用 iTerm)并且要么用它做自己的事情,要么发送错误的控制字符序列,因此 byobu 无法正确接收。这需要更多的输入,但是如上所述获取 shell 脚本将执行与 CTRL-F5 应该执行的相同操作,并且将为会话中的所有 byobu 打开 shell 执行此操作。您现在可能可以忽略下面我原始答案的其余部分,但我会将其留在那里,以防它对某人可能出于其他目的有用。
此外,您可以编辑byobu-reconnect-sockets
脚本(它只是一个 shell 脚本),并且有一些地方可以添加您想要更新的其他环境变量,因此以下内容实际上都不是必需的。
(原答案如下)
当您再次 ssh 并重新连接您的 byobu 会话时,新 ssh 连接的 ssh 转发 X11 显示可能与您启动 byobu 时初始 ssh 会话创建的代理显示不同。假设您是第一次 ssh 并要开始一个新的 byobu 会话,其中包含许多 shell,可能还有许多转发的 X11 窗口,这一切都会正常工作,因为第一个 ssh shell 将 DISPLAY 环境变量设置为它正在侦听的内容用于 X11 连接。这可能类似于
[~/]$ printenv DISPLAY
localhost:11.0
所有由 byobu 启动的 shell(以及后端的 tmux 或 screen)都将继承最初启动 byobu 时设置的所有环境变量的设置,即为您的用户转发的第一次 ssh 连接的 X11 显示.
然后你分离你的 byobu 会话并回家,然后 ssh 重新进入。但这一次你得到一个不同的 X11 显示,因为其他一些用户有 localhost:11.0。在您在家中启动的新 ssh 会话中,DISPLAY 的值可能是 localhost:14.0(比如说)。对于通过此 ssh 连接进行 X11 转发,X11 客户端需要连接到显示 localhost:14.0 的 ssh X11 代理,而不是 localhost:11.0。那时您可能没有 localhost:11.0 的授权密钥,其他人会,或者更糟糕的是,如果他们禁用了 X 身份验证,您尝试打开的 X11 窗口将开始显示在他们的屏幕上。你需要做的就是让它发挥作用,是这样 -
- 分离byobu
- 您现在应该在当前的 ssh shell 中。做
printenv DISPLAY
并记下显示的值(或复制它)
- 重新连接byobu
- 在任何你想在其中使用 X11 的 shell 中,做
export DISPLAY=localhost:14.0
(在这个例子中它就是那个值,你将使用你在你的情况下为 #2 获得的任何值)
- X11 现在将按照您的预期通过 ssh 转发到您的屏幕
- 问题 - 如果你想在那个 shell 中使用 X,你必须在每个单独打开的 byobu shell 中执行此操作。据我所知,没有办法在所有 shell 中设置它,除非我认为可能有一种方法可以同时在所有 shell 中运行任意命令,但我不知道在顶部执行此操作的键序列我的头。
- 烦人的 - 每次断开和断开 ssh 连接时都必须这样做,然后用 ssh 重新连接并重新连接 byobu,因为 ssh shell 中的 DISPLAY 环境变量可能已经改变,但是你的 shell 要么有什么在最初启动 byobu 时设置为 DISPLAY,或者您上次设置的任何值。
- 即使您在稍后的 ssh 连接中在 byobu 中打开新的 shell,这些 shell 仍将继承第一次启动 byobu 时设置的 DISPLAY 环境变量设置,一直到您的第一个 ssh 连接。您也必须使用新的外壳来执行此操作。
这经常让我烦恼,我很想花时间开发一些技巧,至少让这不那么乏味,最好的办法是与 ctrl-F5 一起完成,它可以有效地完成所有这些,但对于其他一些您经常希望重新连接新 ssh 会话的事情,尤其是 ssh-agent 的 SSH_AUTH_SOCK。