我有一台运行 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 转发,您需要做好三件事:
- 您的客户端必须设置为转发 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
安装,就会遇到empty DISPLAY environment variable
问题。在您的客户端上,连接到您的服务器。请务必告诉 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
解除设置并不是太难。我只需要观察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 进入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
,然后启动sshd
并ssh
返回到 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
如果您收到与上述不同的警告,请按照进一步的线索进行操作。
答案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
哈希值,并将相应的参数设置为。#
ForwardAgent
ForwardX11
ForwardX11Trusted
yes
# /etc/ssh/ssh_config
Host *
ForwardAgent yes
ForwardX11 yes
ForwardX11Trusted yes
- 向前
在文件中,删除前面的和ssh_config
前面的哈希值,并在文件末尾添加一个新行以声明 xauth 文件位置,记住写下您自己的 xauth 文件路径。#
Port 22
Protocol 2
XauthLocation /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