gpt4 book ai didi

ssh - 使用 ssh 和 byobu 更新 DISPLAY

转载 作者:行者123 更新时间:2023-12-01 23:35:30 33 4
gpt4 key购买 nike

我有以下场景:

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

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

我回到家,从我的家用电脑 (C) SSH 到 (A),运行“byobu”并在 (A) 或 (B) 中找到我的所有 session 。

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

我知道这取决于 DISPLAY变量,并且它将被设置为 X11 将连接到我在 byobu 内部创建 session 之前最后运行“byobu”的计算机,这可能是 (A) 或 (C)。我的问题是我经常不知道如何修复不再起作用的 session 。有时我可以打开另一个 session (byobu 中的另一个选项卡)并使用 $DISPLAY 的值。在其他 session 中,但只有在新 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 连接的 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 应该做的相同的事情,并将为 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 DISPLAY
localhost:11.0

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

然后你分离你的 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 的授权 key ,其他人会有,或者更糟的是,如果他们禁用了 X 身份验证,您尝试打开的 X11 窗口将开始显示在他们的屏幕上。要让它发挥作用,你需要做的就是——

  • 分离 byobu
  • 您现在应该在当前的 ssh shell 中。做 printenv DISPLAY并注意显示的值(或复制它)
  • 重新连接屏风
  • 在任何你想使用 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,或者您上次设置的任何内容。
  • 即使您在稍后的 ssh 连接中在 byobu 中打开新 shell,这些 shell 仍将继承第一次启动 byobu 时设置的 DISPLAY 环境变量设置,一直回到您的第一个 ssh 连接。你也必须用新的 shell 来做这件事。

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

    关于ssh - 使用 ssh 和 byobu 更新 DISPLAY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43002749/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com