SSH - 如何使 X 应用程序在客户端上运行?

Ruc*_*t88 4 ssh xorg xforwarding openssh

我遇到了大多数人似乎都遇到的相反问题。如果我在登录 ssh 时启动 X 应用程序,它会显示在服务器(主机)机器上,而不是客户端(本地)机器上。这是我使用的命令

$ ssh -X -p 6623 pinker@192.168.0.200
Run Code Online (Sandbox Code Playgroud)

我的 $DISPLAY 变量在客户端上显示正确。

$ echo $DISPLAY
:0
Run Code Online (Sandbox Code Playgroud)

我希望来自服务器的 X 应用程序在客户端(我实际所在的机器)上本地显示。我不知道是什么原因造成的。

slm*_*slm 6

为了这个对话,假设有 2 台名为lappy和 的机器remotey。该lappy系统是在那里你会运行您ssh的命令。您要连接的系统是remotey.

1.在lappy上显示来自远程的GUI

        lappy               .-,(  ),-.    
           __  _         .-(          )-.          remotey 
          [__]|=|  ---->(    network     )------> ____   __ 
          /::/|_|        '-(          ).-'       |    | |==|
                             '-.( ).-'           |____| |  |
                                                 /::::/ |__|

      NOTE: on lappy, `ssh` to remotey, run GUI, see GUI on lappy
Run Code Online (Sandbox Code Playgroud)

您的 shell 的配置文件可能正在设置环境变量DISPLAY=:0。你可以像这样 grep :

 $ grep DISPLAY $HOME/{.bash*,.profile*}
Run Code Online (Sandbox Code Playgroud)

如果这没有返回任何内容,那么您登录的系统可能是罪魁祸首。也看看这个目录。

 $ grep DISPLAY /etc/profile.d/* /etc/bash*
Run Code Online (Sandbox Code Playgroud)

如果您只想保留它,您可以通过指示ssh将 X 流量重定向回您的客户端系统来覆盖此行为,如下所示:

$ ssh -X user@remoteserver
Run Code Online (Sandbox Code Playgroud)

例子

在这里,我有一个远程服务器,它已$DISPLAY设置为:0与您的类似。

$ ssh -X skinner "echo $DISPLAY"
:0
Run Code Online (Sandbox Code Playgroud)

但无论如何,我仍然可以调用 X 应用程序并将它们远程显示到我正在执行ssh命令的系统中。我什至不必登录,我可以像这样直接运行 GUI:

$ ssh -X skinner xeyes
Run Code Online (Sandbox Code Playgroud)

作为额外提示,您可能希望更改正在使用的密码,以帮助提高 X11 流量通过 SSH 隧道时的性能。

$ ssh -c arcfour,blowfish-cbc -X skinner xeyes
Run Code Online (Sandbox Code Playgroud)

2. 在远程显示 GUI

        lappy               .-,(  ),-.    
           __  _         .-(          )-.          remotey 
          [__]|=|  ---->(    network     )------> ____   __ 
          /::/|_|        '-(          ).-'       |    | |==|
                             '-.( ).-'           |____| |  |
                                                 /::::/ |__|

      NOTE: on lappy, `ssh` to remotey, run GUI, see GUI on remotey
Run Code Online (Sandbox Code Playgroud)

如果您通过 SSH 进入remoteyfromlappy但不想让 GUI 显示在 上lappy,那么只需-X从您的ssh调用中删除开关即可。

$ ssh -p 6623 pinker@192.168.0.200
Run Code Online (Sandbox Code Playgroud)

3. 删除 $HOME/.ssh/config

很多时候,用户的$HOME/.ssh目录可能会引入关于正在发生的事情的未知数。config在执行测试时,您可以像这样暂时停止使用此目录中的文件。

$ ssh -F /dev/null -p 6623 pinker@192.168.0.200
Run Code Online (Sandbox Code Playgroud)

4. 消除远程 shell 的配置

您可以使用以下测试暂时禁用 shell 的配置文件,remotey如下所示:

$ ssh -t -X -p 6623 pinker@192.168.0.200 "bash --norc --noprofile"
Run Code Online (Sandbox Code Playgroud)

有了上面的内容,任何设置都不应该被引入这个 Bash shell,所以你应该能够设置DISPLAY=:0然后将 GUI 显示到 remotey 的桌面。

您可以使用以下技巧来帮助隔离问题,首先删除--noprofile并尝试此命令:

$ ssh -t -X -p 6623 pinker@192.168.0.200 "bash --norc"
Run Code Online (Sandbox Code Playgroud)

然后跟着这个命令:

$ ssh -t -X -p 6623 pinker@192.168.0.200 "bash --noprofile"
Run Code Online (Sandbox Code Playgroud)

第一个版本会告诉您问题是否出在/etc/bashrc&$HOME/.bashrc配置文件链中,而第二个版本会告诉您问题是否出在$HOME/.bash_profile配置文件中。