我有以下情况:

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

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

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

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

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

我已经阅读了SSH, X11 Forwarding, and Terminal MultiplexersHow to get tmux X display to come back?之类的一些文档,但我不清楚它们如何应用于(如果适用)我的情况。例如,前者的.bashrc代码是(A),(B)还是(C)?

最佳答案

更新/编辑我找到了执行此操作的正确方法。只需在任何byobu shell中键入
. byobu-reconnect-sockets
以及用于新ssh连接以及SSH_AUTH_SOCK以及其他可能有用并取决于主登录shell的其他几个DISPLAY环境变量(您可以使用byobu attach-session -t session_name或屏幕后端,byobu -D -R session_name或您更喜欢这样做) 。

所有这些都应该通过按CTRL-F5来完成,但是我怀疑像我一样,您的计算机正在拦截CTRL-F5(对我来说,我在Mac上使用iTerm)并自行执行操作,或者发送错误的控制字符序列,因此byobu无法正确接收它。它的类型更多,但是按上述指示获取shell脚本将执行与CTRL-F5应该执行的操作相同的操作,并且将对 session 中的所有byobu打开shell执行此操作。我下面原始答案的其余部分可能现在可以忽略,但是我将其保留在那里,以防它以某种方式对某人有用,也许出于其他目的。

另外,您可以编辑byobu-reconnect-sockets脚本(它只是一个shell脚本),并且在某些地方可以添加要更新的其他环境变量,因此以下内容实际上都不是必需的。

(原始答案如下)

当您再次ssh并重新连接byobu session 时,用于新ssh连接的ssh转发的X11显示可能与您启动byobu时创建的初始ssh session 的代理显示不同。假设您是第一次ssh进入,并且要开始一个新的byobu session ,其中包含许多shell以及可能包含许多转发的X11窗口,并且一切都会正常进行,因为第一个ssh shell将DISPLAY环境变量设置为其正在监听的内容用于X11连接。这可能像
[~/]$ printenv DISPLAYlocalhost:11.0
由byobu启动的所有shell(以及后端的tmux或屏幕)都将继承最初启动byobu时设置的所有环境变量的设置,即,为您的第一个ssh连接转发给用户的X11显示。

然后,您分离byobu session 并回家,然后ssh返回。但是这次您得到了不同的X11显示,因为其他一些用户具有localhost:11.0。在您在家中启动的新ssh session 中,DISPLAY的值可能是localhost:14.0(例如)。对于通过此ssh连接进行的X11转发,X11客户端需要在显示localhost:14.0而非localhost:11.0处连接到ssh X11代理。那时您可能没有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时设置为DISPLAY。
  • 即使您在以后的ssh连接中在byobu中打开新的shell,这些shell仍将继承byobu首次启动时设置的DISPLAY环境变量设置,一直返回到您的第一个ssh连接。您也必须使用新的 shell 。

  • 这使我一直烦恼,我很乐意花时间开发某种骇客程序,至少可以减少这种乏味,而最好的办法就是将它与ctrl-F5一起完成,而这实际上可以完成所有这些工作,但是对于其他一些事情,您通常希望与新的ssh session 重新连接,尤其是ssh-agent的SSH_AUTH_SOCK。

    08-07 21:18