我有以下情况:
在我的工作计算机(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 Multiplexers或How 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窗口将开始在其屏幕上显示。要使其正常运行,您需要做的就是-
printenv DISPLAY
并记下显示的值(或将其复制)export DISPLAY=localhost:14.0
(在此示例中为该值,在这种情况下,您将使用在#2中获得的任何值)这使我一直烦恼,我很乐意花时间开发某种骇客程序,至少可以减少这种乏味,而最好的办法就是将它与ctrl-F5一起完成,而这实际上可以完成所有这些工作,但是对于其他一些事情,您通常希望与新的ssh session 重新连接,尤其是ssh-agent的SSH_AUTH_SOCK。