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

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

我有一台运行 Ubuntu 的机器,我通过 SSH 从 Fedora 14 机器连接到它。我想将 X 从 Ubuntu 机器转发回 Fedora,以便我可以远程运行图形程序。两台机器都在 LAN 上。

我知道该-X选项可以在 SSH 中启用 X11 转发,但我觉得我缺少一些步骤。

通过 SSH 将 X 从 Ubuntu 计算机转发到 Fedora 需要执行哪些步骤?

答案1

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

客户端-X(大写 X)选项启用 X11 转发,您可以使用inssh将其设置为默认值(对于所有连接或特定连接)ForwardX11 yes~/.ssh/config

服务器端X11Forwarding yes必须指定在/etc/ssh/sshd_config。请注意,默认设置是不转发(某些发行版在默认情况下将其打开/etc/ssh/sshd_config),并且用户无法覆盖此设置。如果您更改配置,请记住告诉服务器重新加载其配置,例如,service ssh reload如果您的系统使用 systemd。

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

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

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

答案2

要通过 SSH 进行 X11 转发,您需要做好三件事:

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

如果 #1 和 #2 都已到位,但缺少 #3,那么您最终会得到一个空的DISPLAY环境变量。

具体来说,以下是如何让 X11 转发正常工作:

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

    X11Forwarding yes
    X11DisplayOffset 10
    

    您可能需要 SIGHUPsshd以便它接收这些更改。

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

    belden@skretting:~$ which xauth
    /usr/bin/xauth
    

    如果您没有xauth安装,就会遇到empty DISPLAY environment variable问题。

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

    belden@skretting:~$ ssh -X blyman@the-server
    

但你可能喜欢

    belden@skretting:~$ ssh -o ForwardX11=yes blyman@the-server

或者您可以在您的~/.ssh/config.


DISPLAY今天早些时候,当我 ssh 进入我不管理的新服务器时,我遇到了这个空的环境变量。寻找缺失的xauth部分有点有趣。这就是我所做的,你也可以做。

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

强迫DISPLAY解除设置并不是太难。我只需要观察sshdssh采取措施即可正确设置。这是我一路上所做的一切的完整输出。

    blyman@skretting:~$ mkdir ~/dummy-sshd
    blyman@skretting:~$ 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 为自己创建虚拟文件。

    blyman@skretting:~$ 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

    blyman@skretting:~$ 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
    blyman@skretting:~$ grep ssh_host /home/blyman/dummy-sshd/sshd_config 
    HostKey /etc/ssh/ssh_host_rsa_key
    HostKey /etc/ssh/ssh_host_dsa_key

    # after
    blyman@skretting:~$ 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新端口:

    blyman@skretting:~$ sshd -p 50505 -f ~/dummy-sshd/sshd_config -d
    sshd re-exec requires execution with an absolute path

哎呀,最好纠正这条路:

    blyman@skretting:~$ /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.

弹出一个新终端并 ssh 进入localhost端口50505

    blyman@skretting:~$ 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从那里开始,将我的to移到一边/usr/bin/xauth.old,断开连接ssh并停止sshd,然后启动sshdssh返回到 localhost 就很简单了。

/usr/bin/xauth它消失时,我没有看到DISPLAY我的环境中的反映。


这里没有什么精彩的事情发生。大多数情况下,我很幸运地选择了一种明智的方法来尝试在本地计算机上重现这一点。

答案3

确保:

  • 您已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 user@host

然后验证你的DISPLAY不是清空者:

echo $DISPLAY

如果是,则使用 ssh ( -v) 的详细参数,检查是否有任何警告,例如

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

如果你有不受信任的 X11如上图所示,那么尝试-Y标记相反(如果您信任主机):

ssh -v -Y user@host

看:使用 -X 进行 ssh 时,“警告:不受信任的 X11 转发设置失败:未生成 xauth 密钥数据”是什么意思?


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

xauth generate :0 . trusted
xauth list

看:创建/重建新的 .Xauthority 文件


如果您收到与上述不同的警告,请按照进一步的线索进行操作。


答案4

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

  • 第一的

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

sudo apt install ssh xauth xorg
  • 第二

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

  • 第三

ssh_config以管理员身份编辑(使用sudo)。在内部,删除行、、中的ssh_config哈希值,并将相应的参数设置为。#ForwardAgentForwardX11ForwardX11Trustedyes

# /etc/ssh/ssh_config

Host *
    ForwardAgent yes
    ForwardX11 yes
    ForwardX11Trusted yes
  • 向前

在文件中,删除前面的和ssh_config前面的哈希值,并在文件末尾添加一个新行以声明 xauth 文件位置,记住写下您自己的 xauth 文件路径。#Port 22Protocol 2XauthLocation /usr/bin/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 yourusername@yourhost.然后享受GUI环境。

ssh -X yourusername@yourhost

Windows 上的 Ubuntu 子系统也有问题,链接位于

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

相关内容