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

我知道-X选项启用了SSH中的X11转发,但是我感觉缺少一些步骤。通过SSH将X从Ubuntu计算机转发到Fedora的必要步骤?

评论

我知道这很普遍,但是我遇到了问题。对于这个问题的明确答案将对许多人有所帮助。周围的许多示例似乎忽略了重要细节。

阅读X11时要注意的一件事是,该术语有点奇怪。通常我们所坐的机器是客户端,而服务器是对我们来说是远程的机器。但是在X世界中,那是翻转的。我们所坐的机器正在根据远程机器的请求创建窗口和绘制形状。因此,发出绘制请求的远程计算机是“客户端”,为这些请求提供服务的本地计算机是“服务器”。

#1 楼

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

在客户端,-Xssh(大写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的行。请注意,服务器不会以任何方式答复,这是对潜在攻击者隐藏详细信息的安全预防措施。

评论


@user:不,您永远不需要xhost +。当将计算机连接到网络意味着您值得信赖时,xhost属于一个比较温和的时代。 xhost +意味着任何可以欺骗您IP的人都可以控制您的X服务器会话。 ssh -X将设置所有必需的授权。如果在服务器配置中禁用了X11转发,请与管理员联系。如果不起作用,请参阅服务器配置不允许的通过SSH转发X11。

–吉尔斯'所以-不再是邪恶的'
2011年5月6日22:52

感谢您提及xauth!在准系统服务器上缺少该功能给我造成了麻烦。

–vasi
13年4月9日在6:53

+1用于在同一位置区分〜/ .ssh / config和/ etc / ssh / sshd_config。我不知道它们是否是不同的文件,或者仅仅是命名上的变化。

– puk
13年13月13日在7:48

@KhurshidAlam服务器是否也正在运行GUI环境并不重要。检查.Xauthority文件的权限。如果将Red Hat或其他系统与SELinux一起使用,请检查SELinux上下文,请参见unix.stackexchange.com/questions/36540/…

–吉尔斯'所以-不再是邪恶的'
2014年1月6日,12:30

在ssh -X之后,运行xterm&以获得图形终端作为最终测试,以查看其是否正常运行。

–亚历山大·泰勒(Alexander Taylor)
2014年5月29日17:18

#2 楼

要使ssh上的X11转发能够正常运行,您需要做三件事。


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

如果同时拥有#1和#2但缺少#3,那么最终带有一个空的DISPLAY环境变量。

从头开始,这是X11转发工作的方法。



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

X11Forwarding yes
X11DisplayOffset 10


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

cat /var/run/sshd.pid | xargs kill -1



在服务器上,确保已安装xauth。

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


如果未安装xauth,则将遇到“空的DISPLAY环境变量”问题。


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

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



,但是您可能会喜欢

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


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



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

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

强迫DISPLAY取消设置并不难。我只需要查看sshd和ssh在做什么才能正确设置它。这是我一路走来的全部输出。

    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进入端口本地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移到/ usr / bin / xauth.old,与ssh断开连接并停止sshd,然后启动sshd并将ssh返回到localhost。

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


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

评论


哇,非常感谢您的回答。除了导出DISPLAY =:10外,我所做的一切都很好。我从没猜过这么多显示器。

– m3nda
15年10月31日在22:34

显示偏移为10! :D

– 41754
19年7月23日在20:07

#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


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


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

xauth generate :0 . trusted
xauth list


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


如果警告与上面所述不同,请遵循其他线索。



评论


权威指南:客户端的配置标记了差异

–user2928048
17-2-16在11:47



和X11UseLocalhost否在服务器端

–user2928048
17年2月16日在12:00

是AllowAgentForwarding而不是ForwardAgent

–警报
6月14日0:10

#4 楼

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

X11UseLocalhost no


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

评论


我有2个Ubuntu服务器。在一方面,我需要将其设置为是,另一方面,必须将其设置为否。我敢肯定有一个解释,但是两者都值得尝试。

– alfonx
15年8月19日在13:08

这个修复对我有用!

– rigon
16 Dec 12'在12:23

请说明您是否要将此设置放在服务器或客户端上

– Klik
18 Mar 9 '18 at 2:35

@Klik / etc / ssh / sshd_config在服务器上。 d代表守护程序-en.wikipedia.org/wiki/Daemon_(computing)-客户端通常不是守护进程。

– dijksterhuis
6月1日2:57

#5 楼

让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(请使用sudo)。在ssh_config内部,删除#ForwardAgentForwardX11行中的哈希ForwardX11Trusted,并将相应的参数设置为yes

# /etc/ssh/ssh_config

Host *
    ForwardAgent yes
    ForwardX11 yes
    ForwardX11Trusted yes



Forth

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 yourusername@yourhost。然后享受GUI环境。

ssh -X yourusername@yourhost


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

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

#6 楼

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

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

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

#7 楼

如果您要从Windows(10)到Linux系统执行SSH,请帮自己一个忙,并使用Putty之类的SSH客户端(常规ssh -X等不起作用)。
步骤1:在Windows中安装XServer:示例XMing服务器(在localhost:0.0上监听)
步骤2:在腻子中启用X11转发
步骤3:连接到远程Linux服务器
确保Linux服务器中的所有条件都得到满足-是X11Forwarding是,并且按照答案https://unix.stackexchange.com/a/12772/121634
中的说明存在xauth
启动XClock并等待一分钟,以便显示在Windows机器中。
注意-如果您要从此Linux服务器连接到另一台服务器,并想将X11转发回Windows,则只需使用ssh -X连接到下一个链。

[Windows]腻子(带有X11forwarding)-> [服务器1](xclock可以工作)-> ssh -X [服务器2](xclock可以工作)


#8 楼

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

因此,检查/ tmp文件系统的挂载选项是什么?为此使用单独的分区或磁盘。

评论


我想您可能想看看原问题的其他答案,花点时间思考一下您自己的答案在这些问题上的改进。

–user48669
14年6月19日在11:28

#9 楼

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

评论


您还需要在远程计算机上安装xauth,否则x权限的东西将无法工作。

– Faheem Mitha
2011年5月6日18:22

设置DISPLAY怎么办?

– Shickadance先生
2011年5月6日18:36

如果启用了X11Forwarding并且客户端系统上存在xauth,则ssh将自动设置$ DISPLAY。

– Shadur
2011年5月6日18:58

@Shadur不适合我。当我导出DISPLAY =:10.0时可以使用,但不能。否则,它抱怨找不到0 :。也许这需要其他一些东西才能自动发生?

–cfr
17 Mar 6 '17 at 17:39

#10 楼

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的锁定。发出ssh之后注销xauth -b会话,然后重新登录最终使我能够成功echo $DISPLAY。在重新创建.Xauthority之前一定要尝试一下

#11 楼

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

sudo apt-get install xterm