it-swarm.cn

如何通过SSH转发X以远程运行图形应用程序?

我有一台运行Ubuntu的计算机,该计算机从Fedora 14计算机上通过SSH SSH到。我想将X从Ubuntu机器转发回Fedora,以便可以远程运行图形程序。两台机器都在局域网上。

我知道-X选项启用SSH中的X11转发,但是我感觉缺少一些步骤。

通过SSH将X从Ubuntu计算机转发到Fedora的必要步骤是什么?

390
Mr. Shickadance

需要在客户端和服务器端都启用X11转发。

客户端上,ssh-X(大写X)选项启用X11转发,您可以进行此操作 ForwardX11 yes 中带有~/.ssh/config的默认值(对于所有连接或特定的连接)。

服务器端,必须在 X11Forwarding yes 中指定/etc/ssh/sshd_config。请注意,默认设置为不转发(某些发行版使用其默认设置/etc/ssh/sshd_config将其打开),并且用户无法覆盖此设置。

xauth程序必须安装在服务器端。如果那里有X11程序,很可能xauth会在那里。在极少数情况下,xauth安装在非标准位置,可以通过 ~/.ssh/rc (在服务器上!)调用它。

请注意,您不需要在服务器上设置任何环境变量。 DISPLAYXAUTHORITY将自动设置为适当的值。如果运行ssh且未设置DISPLAY,则表示ssh没有转发X11连接。

要确认ssh正在转发X11,请检查Requesting X11 forwarding输出中是否包含ssh -v -X的行。请注意服务器不会以任何方式答复,这是对潜在攻击者隐藏详细信息的安全预防措施。

452

要使X11转发通过ssh工作,您需要准备三件事。

  1. 您的客户必须设置为转发X11。
  2. 您的服务器必须设置为允许X11转发。
  3. 您的服务器必须能够设置X11身份验证。

如果同时拥有#1和#2但缺少#3,则最终将得到一个空的DISPLAY环境变量。

汤圆螺母,这是使X11转发工作的方法。

  1. 在服务器上,确保/ etc/ssh/sshd_config包含:

    X11Forwarding yes
    X11DisplayOffset 10
    

    您可能需要SIGHUP sshd,以便它接受这些更改。

    cat /var/run/sshd.pid | xargs kill -1
    
  2. 在服务器上,确保已安装xauth。

    [email protected]:~$ which xauth
    /usr/bin/xauth
    

    如果没有安装xauth,则会遇到“空DISPLAY环境变量”问题。

  3. 在您的客户端上,连接到服务器。一定要告诉ssh允许X11转发。我更喜欢

    [email protected]:~$ ssh -X [email protected]
    

但是你可能会喜欢

    [email protected]:~$ ssh -o ForwardX11=yes [email protected]

或者您可以在〜/ .ssh/config中进行设置。


今天早些时候,当我进入一个我不管理的新服务器时,我遇到了这个空的DISPLAY环境变量。跟踪缺少的xauth部分很有意思。这就是我所做的,您也可以做。

在我是管理员的本地工作站上,我验证了/ etc/ssh/sshd_config已设置为转发X11。当我将ssh -X返回到本地主机时,我的显示设置正确。

强迫DISPLAY取消设置并不难。我只需要查看sshd和ssh在做什么才能正确设置它。这是我在此过程中所做的所有工作的全部输出。

    [email protected]:~$ mkdir ~/dummy-sshd
    [email protected]:~$ cp -r /etc/ssh/* ~/dummy-sshd/
    cp: cannot open `/etc/ssh/ssh_Host_dsa_key' for reading: Permission denied
    cp: cannot open `/etc/ssh/ssh_Host_rsa_key' for reading: Permission denied

我没有使用Sudo强制将ssh_Host_ {dsa,rsa} _key文件复制到位,而是使用ssh-keygen为自己创建了虚拟文件。

    [email protected]:~$ ssh-keygen -t rsa -f ~/dummy-sshd/ssh_Host_rsa_key
    Generating public/private rsa key pair.
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /home/blyman/dummy-sshd/ssh_Host_rsa_key.
    Your public key has been saved in /home/blyman/dummy-sshd/ssh_Host_rsa_key.pub.

用-t dsa反复冲洗:

    [email protected]:~$ ssh-keygen -t dsa -f ~/dummy-sshd/ssh_Host_dsa_key
    # I bet you can visually copy-paste the above output down here

编辑〜/ dummy-sshd/sshd_config指向正确的新ssh_Host密钥文件。

    # before
    [email protected]:~$ grep ssh_Host /home/blyman/dummy-sshd/sshd_config 
    HostKey /etc/ssh/ssh_Host_rsa_key
    HostKey /etc/ssh/ssh_Host_dsa_key

    # after
    [email protected]:~$ grep ssh_Host /home/blyman/dummy-sshd/sshd_config 
    HostKey /home/blyman/dummy-sshd/ssh_Host_rsa_key
    HostKey /home/blyman/dummy-sshd/ssh_Host_dsa_key

以非分离模式在新端口上启动sshd:

    [email protected]:~$ sshd -p 50505 -f ~/dummy-sshd/sshd_config -d
    sshd re-exec requires execution with an absolute path

糟糕,请更正该路径:

    [email protected]:~$ /usr/sbin/sshd -p 50505 -f ~/dummy-sshd/sshd_config -d
    debug1: sshd version OpenSSH_5.5p1 Debian-4ubuntu6
    debug1: read PEM private key done: type RSA
    debug1: Checking blacklist file /usr/share/ssh/blacklist.RSA-2048
    debug1: Checking blacklist file /etc/ssh/blacklist.RSA-2048
    debug1: private Host key: #0 type 1 RSA
    debug1: read PEM private key done: type DSA
    debug1: Checking blacklist file /usr/share/ssh/blacklist.DSA-1024
    debug1: Checking blacklist file /etc/ssh/blacklist.DSA-1024
    debug1: private Host key: #1 type 2 DSA
    debug1: setgroups() failed: Operation not permitted
    debug1: rexec_argv[0]='/usr/sbin/sshd'
    debug1: rexec_argv[1]='-p'
    debug1: rexec_argv[2]='50505'
    debug1: rexec_argv[3]='-f'
    debug1: rexec_argv[4]='/home/blyman/dummy-sshd/sshd_config'
    debug1: rexec_argv[5]='-d'
    Set /proc/self/oom_adj from 0 to -17
    debug1: Bind to port 50505 on 0.0.0.0.
    Server listening on 0.0.0.0 port 50505.
    debug1: Bind to port 50505 on ::.
    Server listening on :: port 50505.

弹出一个新终端,并通过端口50505 SSH到localhost:

    [email protected]:~$ ssh -p 50505 localhost
    The authenticity of Host '[localhost]:50505 ([::1]:50505)' can't be established.
    RSA key fingerprint is 81:36:a5:ff:a3:5a:45:a6:90:d3:cc:54:6b:52:d0:61.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '[localhost]:50505' (RSA) to the list of known hosts.
    Linux skretting 2.6.35-32-generic #67-Ubuntu SMP Mon Mar 5 19:39:49 UTC 2012 x86_64 GNU/Linux
    Ubuntu 10.10

    Welcome to Ubuntu!
     * Documentation:  https://help.ubuntu.com/

    1 package can be updated.
    0 updates are security updates.

    Last login: Thu Aug 16 15:41:58 2012 from 10.0.65.153
    Environment:
      LANG=en_US.UTF-8
      USER=blyman
      LOGNAME=blyman
      HOME=/home/blyman
      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
      MAIL=/var/mail/blyman
      Shell=/bin/bash
      SSH_CLIENT=::1 43599 50505
      SSH_CONNECTION=::1 43599 ::1 50505
      SSH_TTY=/dev/pts/16
      TERM=xterm
      DISPLAY=localhost:10.0
    Running /usr/bin/xauth remove unix:10.0
    /usr/bin/xauth add unix:10.0 MIT-MAGIC-COOKIE-1 79aa9275ced418dd445d9798b115d393

看那里的最后三行。我很幸运地设置了DISPLAY,并从/ usr/bin/xauth获得了这两行看起来不错的行。

从那里开始,把我的/ usr/bin/xauth移到/usr/bin/xauth.old,断开与ssh的连接并停止sshd,然后启动sshd并将ssh返回本地主机,这是小孩子的戏。

/ usr/bin/xauth消失后,我的环境没有看到DISPLAY。


这里没有任何精彩的事情。通常,我很幸运地选择了一种理智的方法来尝试在本地计算机上重现此方法。

98
Belden

确保:

  • 您已在服务器上安装xauth(请参阅:xauth info/xauth list)。
  • 在服务器上,您的/etc/ssh/sshd_config文件具有以下几行:

    X11Forwarding yes
    X11DisplayOffset 10
    X11UseLocalhost no
    
  • 在客户端,您的~/.ssh/config文件具有以下几行:

    Host *
      ForwardAgent yes
      ForwardX11 yes
    
  • 在客户端,您已经安装了X服务器(例如macOS:XQuartz; Windows:Xming)。


然后,要使用SSH进行X11转发,您需要添加-X到您的ssh命令,例如.

ssh -v -X [email protected]

然后通过以下方式验证您的DISPLAY是否为not为空:

echo $DISPLAY

如果是,则为ssh(-v),检查是否有任何警告,例如.

debug1: No xauth program.
Warning: untrusted X11 forwarding setup failed: xauth key data not generated

如果您有不受信任的X11,如上所示,则尝试-Y flag代替(如果您信任主机):

ssh -v -Y [email protected]

请参阅: 使用-X SSH时,“警告:不可信的X11转发设置失败:未生成xauth密钥数据”是什么意思?


如果您有警告:没有xauth数据,则可以尝试生成新的.Xauthority文件,例如.

xauth generate :0 . trusted
xauth list

请参阅: 创建/重建新的.Xauthority文件


如果您收到的警告与以上所述不同,请遵循其他提示。


43
kenorb

解决方法是将此行添加到您的/etc/ssh/sshd_config

X11UseLocalhost no

https://joshua.hoblitt.com/rtfm/2013/04/how_to_fix_x11_forwarding_request_failed_on_channel_0/

21
Ace

让Windows 10上的Ubuntu bash运行ssh -X以在远程服务器上获取GUI环境

  • 第一

安装以下所有内容。在Window上,安装Xming。在终端的Ubuntu上,使用Sudo apt install安装ssh xauth xorg

Sudo apt install ssh xauth xorg
  • 第二

转到包含ssh_config文件的文件夹,我的文件夹是/etc/ssh

  • 第三

以管理员身份编辑ssh_config(USE Sudo)。在ssh_config内,删除ForwardAgent#ForwardX11行中的哈希ForwardX11Trusted,并将相应的参数设置为yes

# /etc/ssh/ssh_config

Host *
    ForwardAgent yes
    ForwardX11 yes
    ForwardX11Trusted yes
  • 向前

ssh_config文件中,删除#Port 22之前的前哈希Protocol 2,并在文件末尾附加新行以声明xauth文件位置XauthLocation /usr/bin/xauth,请记住写下您自己的xauth文件路径。

# /etc/ssh/ssh_config

#   IdentifyFile ...
    Port 22
    Protocol 2
#   Cipher 3des
#   ...
#   ...
    ...
    ...
    GSSAPIDelegateCredentials no
    XauthLocation /usr/bin/xauth
  • 第五

现在,由于我们已经完成ssh_config文件的编辑,因此在离开编辑器时将其保存。现在转到文件夹~$HOME,将export DISPLAY=localhost:0附加到.bashrc文件中并保存。

# ~/.bashrc
...
...
export DISPLAY=localhost:0
  • 持续

我们快完成了。重新启动bash Shell,打开Xming程序并使用ssh -X [email protected]。然后享受GUI环境。

ssh -X [email protected]

问题也出现在Windows的Ubuntu子系统中,并且链接位于

https://Gist.github.com/DestinyOne/f236f71b9cdecd349507dfe90ebae776

5
DestinyOne

X11UseLocalhost no/etc/ssh/sshd_config并重新启动SSH服务器。

如果没有显示,请检查xauth是否正确安装,然后重试。

RHE/CEntos没有这个问题,这是Ubuntu的事情!

4
stephen cooke

对我来说,问题出在nodev/tmp文件系统的安装选项。 X11需要在其中创建一个特殊文件。

因此,如果您使用一个单独的分区或磁盘,请检查/ tmp文件系统的安装选项是什么。

1
yakovpol

要补充以前的出色答案(设置~/.ssh/config,并检查客户端上是否设置了DISPLAY环境变量,请设置/etc/ssh/sshd_config并在服务器上安装xauth),还请确保在客户端上安装xterm,例如.

Sudo apt-get install xterm
1
Aliz Rao

xauth可以被锁定。

_   -b      This  option  indicates  that  xauth  should  attempt to break any authority file locks before proceeding.  Use this
           option only to clean up stale locks.
_

使用

_xauth -b
_

在我尝试ssh的计算机上,打破了xauth的锁定。发出_xauth -b_后退出ssh会话,然后重新登录最终使我能够成功_echo $DISPLAY_。在重新创建_.Xauthority_之前一定要尝试一下

1
Barton Chittenden

必须在SSH服务器(在您的情况下为Ubuntu框中)的X11Forwarding中设置sshd_config,并且必须通过传递-X选项或编辑ssh_config文件以添加Xsome,以将X11转发给SSH客户端(您的Fedora框)。 ForwardX11默认。

1
Caleb