8

我有以下情况:

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

在 byobu 里面,我打开了几个终端。其中一些是 (A) 本地的,但在另一些中,我 ssh 到另一台计算机 (B)。

我回到家,从我的家用电脑 (C) SSH 到 (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 Forwarding 和 Terminal MultiplexersHow to get tmux X display to come back?,但我不清楚他们如何(如果他们这样做)适用于我的情况。比如.bashrc前者的代码,应该在(A)、(B)还是(C)中?

4

1 回答 1

9

更新/编辑我找到了正确的方法来做到这一点。只需在任何 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 窗口将开始显示在他们的屏幕上。你需要做的就是让它发挥作用,是这样 -

  1. 分离byobu
  2. 您现在应该在当前的 ssh shell 中。做printenv DISPLAY并记下显示的值(或复制它)
  3. 重新连接byobu
  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 连接。您也必须使用新的外壳来执行此操作。

这经常让我烦恼,我很想花时间开发一些技巧,至少让这不那么乏味,最好的办法是与 ctrl-F5 一起完成,它可以有效地完成所有这些,但对于其他一些您经常希望重新连接新 ssh 会话的事情,尤其是 ssh-agent 的 SSH_AUTH_SOCK。

于 2018-06-26T22:32:49.827 回答