使用ssh和byobu更新DISPLAY

Jel*_*lby 5 x11 ssh tmux byobu

我有以下情况:

在我的工作计算机(A)中,打开一个byobu(tmux)会话。

在byobu内,我打开了几个终端。其中一些是(A)本地的,而其他一些是我连接到另一台计算机(B)的。

我回到家,从我的家用计算机(C)切换到(A),运行“ byobu”,然后在(A)或(B)中找到我的所有会话。

除运行X11应用程序外,这非常有效。更换计算机时,我不会让任何X11应用程序运行,但是仅运行“ xclock”有时会起作用,有时却无法(“无法连接到X服务器本地主机:n .0”)。

我知道这取决于DISPLAY变量,并且将其设置为X11将连接到我上次运行“ byobu”的计算机,然后再在byobu内创建会话,该计算机可以是(A)或(C)。我的问题是,我通常不知道该如何解决不再起作用的会话。有时,我可以打开另一个会话(byobu中的另一个选项卡)并$DISPLAY在其他会话中使用的值,但这仅在新会话打开的情况下有效,而并非总是如此。在其他情况下,我能够分离byobu(F6),重新连接它(运行“ byobu”),并打开与(B)的新ssh连接,然后该连接可以工作,但不能运行现有的会话。

我已经阅读了一些文档,例如SSH,X11转发和终端多路复用器,或者如何使tmux X显示返回?,但我不清楚它们如何应用于(如果适用)我的情况。例如,.bashrc前者的代码是在(A​​),(B)还是(C)中?

slo*_*oni 8

更新/编辑我找到了正确的方法来做到这一点。只需在任何 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 而不是 localhost:11.0 的 ssh X11 代理。那时您可能没有 localhost:11.0 的授权密钥,其他人会有,或者更糟的是,如果他们禁用了 X 身份验证,您尝试打开的 X11 窗口将开始显示在他们的屏幕上。要让它发挥作用,你需要做的就是——

  1. 分离byobu
  2. 您现在应该在当前的 ssh shell 中。做printenv DISPLAY并注意显示的值(或复制它)
  3. 重新连接屏风
  4. 在您想在其中使用 X11 的任何 shell 中,执行export DISPLAY=localhost:14.0(在本例中就是该值,在您的情况下,您将使用为 #2 获得的任何值)
  5. X11 现在将按照您的预期通过 ssh 转发到您的屏幕
  6. 问题 - 如果您想在该 shell 中使用 X,您必须在每个单独打开的 byobu shell 中执行此操作。据我所知,没有办法在所有 shell 中设置它,除非我认为可能有一种方法可以同时在所有 shell 中运行任意命令,但我不知道在顶部执行此操作的关键序列我的头。
  7. 烦人的 - 每次分离和断开 ssh 连接时都必须执行此操作,然后重新连接 ssh 并重新连接 byobu,因为 ssh shell 中的 DISPLAY 环境变量可能已更改,但您的 shell 要么具有当 byobu 最初启动时设置为 DISPLAY,或者您上次设置的任何内容。
  8. 即使您在稍后的 ssh 连接中在 byobu 中打开新 shell,这些 shell 仍将继承 byobu 首次启动时设置的 DISPLAY 环境变量设置,一直回到您的第一个 ssh 连接。你也必须用新的 shell 来做这件事。

这让我一直很烦恼,我很乐意花时间开发某种 hack 以至少使这不那么乏味,最重要的是将它与 ctrl-F5 一起完成,它可以有效地完成所有这些,但对于其他一些事情,您通常希望重新连接新的 ssh 会话,尤其是 ssh-agent 的 SSH_AUTH_SOCK。