X11通过Gnu屏幕转发,可以吗?


32

我经常使用GNU屏幕。但是,我一直在尝试确定是否有某种方法可以让我在ssh-ing时通过屏幕转发X11应用程序(这是一个字吗?)。当前,如果我尝试通过屏幕运行“ gedit”,它将在我的“服务器”计算机而不是客户端上打开。如果我在屏幕外执行相同的操作,那么一切都很好。但是我也希望在使用屏幕时一切都好!

谢谢!

PS:我已经搜索了这个问题,并且看到了xmove的提法,但是我似乎在ubuntu上找不到包含xmove的软件包。(Ubuntu 10.10)


我现在没有时间找到完整的答案,但是您需要正确设置一些环境变量。您可能可以通过查看屏幕外的环境来找出哪些。
2010年

Answers:


32

要手动执行此操作,请在登录SSH之后但在重新连接到屏幕之前,检查DISPLAY环境变量:

echo $DISPLAY

重新连接到屏幕后,显式设置环境变量:

export DISPLAY=:N.0

其中:N.0是什么echo显示连接之前。这并不是完美的,因为某些应用程序可能希望与会话D-Bus进行通信,而通过SSH连接发送会话D-Bus会更加复杂。


1
太棒了!这似乎适用于大多数应用程序。我正在尝试将屏幕显示为“ fu”。您有什么想法吗?或者您至少可以向我指出如何实现这一目标的总体方向?谢谢!
桑德罗

我已经完成了一些奇怪的工作,例如编写了如下脚本:echo $DISPLAY > $HOME/.display.txt; screen -x -d然后在屏幕上运行了另一个脚本export DISPLAY=$(cat $HOME/.display.txt)
Kees Cook

这正是我一直在努力实现的目标。但是到目前为止没有运气。尝试实现导出是一个很大的障碍,因为在脚本中运行它不是一件好事,我需要以某种方式获取它……而setenv似乎也没有魔力。
桑德罗

到Source的脚本类型. /path/to/script,其中scriptexport DISPLAY=$(cat $HOME/.display.txt)
基斯库克

这假设您没有登录时自动启动屏幕的功能(la byobu)
大学的学生

11

存储库中有一个名为xpra的程序,就像x11的gnu屏幕。使用它并不难:

X持久性远程应用

Xpra为您提供了GNU Screen for X应用程序的功能。

它允许用户查看其本地计算机上的远程X应用程序,并断开与远程计算机的连接并重新连接,而不会丢失正在运行的应用程序的状态。


2
我已经写了有关如何将xpra与Screen实际集成以实现控制台和X11应用程序持久性的文章:krlmlr.github.io/integrating-xpra-with-screen。为我工作。
krlmlr 2014年

7

Byobu自动重新连接ssh和gpg代理。如果对您有帮助,我可以将其重新附加到显示变量上。


它似乎甚至没有在通过X11转发的ssh会话中创建的NEW会话中传递display变量。如果这样做的话,那将是很棒的事情。由于不得不禁用自动启动byobu以便可以使用X11转发,所以我已经停止使用它了。
一所大学的学生

2

这就是我在运行byobu时如何使其工作的方式

加入这一行.bash_login文件 之前的“_byobu_source ..”行:

echo $DISPLAY > $HOME/.display.env

然后将此行添加到.bashrc中

if [ ! -z ${SSH_CONNECTION+x} ]; then
  export DISPLAY=$(cat $HOME/.display.env) 
fi

1

似乎问题在于,环境变量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

我不希望这是最好的解决方案,也不是最简洁的解决方案,但是它确实有效。



0

基于@harre的建议,我发现这是最佳的解决方案,至少对于通过Putty的RHEL而言。我知道有一种比创建一个包含var的文件更好的方法,但是这样做并非偶然,可以通过加载时X11访问DISPLAYgnu 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.