使用ssh和byobu更新DISPLAY

我有以下场景:

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

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

我回家了,从我的家用电脑(C)我ssh到(A),运行“byobu”并在(A)或(B)中找到我所有的会话.

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

我理解这取决于DISPLAY变量,并且它将被设置为使得X11将连接到我在byobu内创建会话之前最后运行“byobu”的计算机,并且可以是(A)或(C).我的问题是,我经常不知道如何修复一个不再工作的会话.有时我可以打开另一个会话(byobu中的另一个选项卡)并在其他会话中使用$DISPLAY的值,但只有在新会话打开时才会起作用,而不是总是如此.在其他情况下,我已经能够分离byobu(F6),重新附加它(运行“byobu”)并打开一个新的ssh连接到(B),然后那个工作,但不是已经存在的会话.

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

最佳答案 更新/编辑我找到了正确的方法来做到这一点.只需在任何一个byobu shell中键入它

.屏风重新连接的套接字

和新的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并且将开始一个带有许多shell的新的byobu会话,也许会转发许多转发X11窗口,这一切都会正常工作,因为第一个ssh shell将DISPLAY环境变量设置为它正在侦听的内容用于X11连接.这可能是这样的

[〜/] $printenv DISPLAY
本地主机:11.0

由byobu启动的所有shell(以及后端的tmux或屏幕)将继承最初启动byobu时设置的所有环境变量的设置,即为您的用户转发的第一个ssh连接的X11显示.

然后你分离你的byobu会话并回家,并重新进入.但这次你得到一个不同的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并记下显示的值(或复制它)
> reattach byobu
>在你想要使用X11的任何shell中,执行导出DISPLAY = localhost:14.0(在这个例子中它是那个值,你将使用你在#case中获得的任何值)
> X11现在将按照您的预期通过ssh转发到您的屏幕
>捕获 – 如果要在该shell中使用X,则必须在每个单独打开的byobu shell中执行此操作.据我所知,没有办法在所有shell中设置它,除了我认为可能有一种方法可以同时在所有shell中运行任意命令,但我不知道在顶部执行任何操作的关键序列我的头.
>烦人的 – 每次分离和断开ssh连接时都必须这样做,然后重新连接ssh并重新连接你的byobu,因为ssh shell中的DISPLAY环境变量可能已经改变了,但你的shell要么具有什么当最初启动byobu时,或者您最后设置的任何内容都设置为DISPLAY.
>即使您在稍后的ssh连接中在byobu中打开新shell,这些shell仍将继承首次启动byobu时设置的DISPLAY环境变量设置,一直返回到您的第一个ssh连接.你也必须使用新的shell.

这让我不断烦恼,我喜欢花时间去开发某种类型的黑客,至少让它变得不那么乏味,最重要的是将它与ctrl-F5一起完成,这有效地完成了所有这一切,但对于其他一些事情,您经常需要重新连接新的ssh会话,尤其是ssh-agent的SSH_AUTH_SOCK.

点赞