我经常使用GNU屏幕。但是,我一直在尝试确定是否有某种方法可以让我在ssh-ing时通过屏幕转发X11应用程序(这是一个字吗?)。当前,如果我尝试通过屏幕运行“ gedit”,它将在我的“服务器”计算机而不是客户端上打开。如果我在屏幕外执行相同的操作,那么一切都很好。但是我也希望在使用屏幕时一切都好!
谢谢!
PS:我已经搜索了这个问题,并且看到了xmove的提法,但是我似乎在ubuntu上找不到包含xmove的软件包。(Ubuntu 10.10)
我经常使用GNU屏幕。但是,我一直在尝试确定是否有某种方法可以让我在ssh-ing时通过屏幕转发X11应用程序(这是一个字吗?)。当前,如果我尝试通过屏幕运行“ gedit”,它将在我的“服务器”计算机而不是客户端上打开。如果我在屏幕外执行相同的操作,那么一切都很好。但是我也希望在使用屏幕时一切都好!
谢谢!
PS:我已经搜索了这个问题,并且看到了xmove的提法,但是我似乎在ubuntu上找不到包含xmove的软件包。(Ubuntu 10.10)
Answers:
要手动执行此操作,请在登录SSH之后但在重新连接到屏幕之前,检查DISPLAY环境变量:
echo $DISPLAY
重新连接到屏幕后,显式设置环境变量:
export DISPLAY=:N.0
其中:N.0是什么echo
显示连接之前。这并不是完美的,因为某些应用程序可能希望与会话D-Bus进行通信,而通过SSH连接发送会话D-Bus会更加复杂。
echo $DISPLAY > $HOME/.display.txt; screen -x -d
然后在屏幕上运行了另一个脚本export DISPLAY=$(cat $HOME/.display.txt)
. /path/to/script
,其中script
是export DISPLAY=$(cat $HOME/.display.txt)
存储库中有一个名为xpra的程序,就像x11的gnu屏幕。使用它并不难:
X持久性远程应用
Xpra为您提供了GNU Screen for X应用程序的功能。
它允许用户查看其本地计算机上的远程X应用程序,并断开与远程计算机的连接并重新连接,而不会丢失正在运行的应用程序的状态。
似乎问题在于,环境变量XAUTHORITY没有保留在屏幕会话中。我通过将以下内容添加到我的.bashrc中来解决了这个问题。我认为这不是必须的,但我想您可以做以下事情:
# ensure X forwarding is setup correctly, even for screen
XAUTH=~/.Xauthority
if [[ ! -e "${XAUTH}" ]]; then
# create new ~/.Xauthority file
xauth
fi
if [[ -z "${XAUTHORITY}" ]]; then
# export env var if not already available.
export XAUTHORITY="${XAUTH}"
fi
我不希望这是最好的解决方案,也不是最简洁的解决方案,但是它确实有效。
基于@harre的建议,我发现这是最佳的解决方案,至少对于通过Putty的RHEL而言。我知道有一种比创建一个包含var的文件更好的方法,但是这样做并非偶然,可以通过加载时X11
访问DISPLAY
gnu screen
。
自动化解决方案
添加到.bashrc
(或.bash_profile
,取决于您的用例)
#.bashrc
if [ -f ~/etc/.bash-screen-x11 ]; then
echo $DISPLAY > $HOME/.display.env
source ~/etc/.bash-screen-x11
fi
然后添加以下文件(或您的路径选择)
#~/etc/.bash-screen-x11
# sets back display var.
if [ -z $STY ]; then
export DISPLAY=$(cat $HOME/.display.env)
fi