重新连接到通过 SHH 隧道传输 X 的 GNU 屏幕会话时遇到错误

重新连接到通过 SHH 隧道传输 X 的 GNU 屏幕会话时遇到错误

在使用远程屏幕通过 SSH 连接建立 X 隧道之后,如何从另一台机器重新连接屏幕会话并将 X 隧道连接到该另一台机器?

我要么收到“无法打开显示”类型的错误,要么应用程序会连接到第一台计算机。我猜想这与屏幕会话中的 ENV 变量有关,但我不知道如何修复该错误。

答案1

使用时屏幕,您将必须手动复制所需的环境变量。

脱离屏幕会话,运行echo $DISPLAY并复制该值。

现在重新连接并运行。export DISPLAY="copied value"


当你创建一个 Screen 会话时,屏幕服务器自动继承当前环境的副本,该副本进一步由您在会话内的新屏幕窗口中启动的 shell 或其他进程继承。

xterm                        (DISPLAY=":0")
└── bash                     (DISPLAY=":0")
    └── screen (client)      (DISPLAY=":0")
        └── SCREEN (server)  (DISPLAY=":0")
            ├── irssi        (DISPLAY=":0")
            ├── mutt         (DISPLAY=":0")
            └── bash         (DISPLAY=":0")

当您通过启用 X11 转发的 SSH 连接时,SSH 服务器会设置$DISPLAY指向您的 X11 服务器的环境变量。

但是,当你重新连接到 Screen 会话时,该会话内运行的进程将看不到它;它们仍然持有老的环境。

sshd                         (DISPLAY="localhost:12")
└── bash                     (DISPLAY="localhost:12")
    └── screen (client)      (DISPLAY="localhost:12")

SCREEN (server)              (DISPLAY=":0")
├── irssi                    (DISPLAY=":0")
├── mutt                     (DISPLAY=":0")
└── bash                     (DISPLAY=":0")

这是因为一个进程不允许更新其他进程的环境,只能更新它自己的环境。即使屏幕客户端进程有新的环境,它不能把它提供给屏幕服务器;Screen使用的协议根本没有这样的功能。

一些其他的多路复用器,例如tmux,允许客户端在重新连接时将其环境的副本发送到服务器。这不是完全有效的;它只允许新打开的tmuxwindows 继承了新的环境,但是仍然无法对已经运行的窗口做任何事情。

相关内容