在使用远程屏幕通过 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 继承了新的环境,但是仍然无法对已经运行的窗口做任何事情。