我读过很多类似的问题,但很多都过时了,而且似乎没什么用。我有一台家用电脑<remotehome>
和一台笔记本电脑<locallaptop>
,都在运行Ubuntu 22.04
。
我不在家,我可以<remotehome>
使用 psw 或私钥通过 ssh 进入两者。
sudo ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa -X -p 2022 remoteuser@<remotehome>
(由于我家路由器上的端口转发,端口为 2022,不知道是否相关)
一旦进入远程主机,xdg-open
或者firefox
命令给我:
X11 connection rejected because of wrong authentication.
Error: cannot open display: localhost:10.0
xlogo
在远程终端上运行实际上会在我的本地桌面上打开一个窗口。
有用信息:
df -H
在远程终端上,有足够的空间。
ls -l ~/.Xauthority
输出:
-rw------- 1 remoteuser remoteuser 69 mar 22 15:23 /home/remoteuser/.Xauthority
X11 转发已启用<remotehome>
X11Forwarding yes
在/etc/ssh/sshd_config
。
在客户端上 X11 转发已启用。
Host *
ForwardX11 yes
在/etc/ssh/ssh_config
xhost
命令从远程终端和本地终端提供相同的输出:
access control enabled, only authorized clients can connect
SI:localuser:<my-username-in-local-laptop>
我的本地桌面上的 $XAUTHORITY 变量是:
/run/user/1000/.mutter-Xwaylandauth.PLS211
答案1
您不需要使用sudo
:ssh
它完全能够以普通用户的身份转发 X11 连接,不需要 root 权限。
您的本地笔记本电脑上是否也运行着 Firefox?
默认情况下,Firefox 使用 X11 窗口属性来检测同一 GUI 会话是否已包含正在运行的 Firefox 实例,如果已包含,则尝试向其发送命令以打开作为参数给出的 URL(如果没有 URL,则发送命令以打开新窗口),而不是启动整个新会话。SSH 转发使远程桌面上的 Firefox“认为”笔记本电脑上的 Firefox 位于同一主机上,但由于事实并非如此,Firefox 向现有实例发送命令的尝试将失败。
如果您的目标就是在主桌面上远程启动 Firefox 的第二个实例,则需要告诉它不要尝试使用此远程控制功能。例如:
firefox --no-remote https://www.google.com
请注意,像 Firefox 这样的现代 Web 浏览器在设计时就假设其进程在包含显示的同一主机上运行 - 如果不是这样,您将看到远程 Firefox 的窗口更新非常比以前慢得多。部分原因是 X11 服务器和 Firefox 进程之间增加了网络通信,从而导致延迟,另一部分原因是 Firefox 通常使用本地 GPU 的加速功能,而当渲染到位于不同计算机的显示器时,这些功能不可用。
与远程运行 Web 浏览器相比,使用 SSH 的动态端口转发功能可能会更好:
ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa -D 8080 -p 2022 remoteuser@<remotehome>
然后在笔记本电脑上配置 Web 浏览器以使用 SOCKS 代理localhost
,端口为 8080:
(记住原始代理设置,您稍后会需要它们。)
现在,笔记本电脑上的 Firefox 将连接 SSH 客户端创建的侦听套接字,并且通过它建立的所有连接都将转发到sshd
SSH 连接的远程端。由于sshd
了解 SOCKS 协议,Firefox 现在可以要求远程端sshd
连接到任何服务。
瞧,您可以像在远程桌面上一样进行浏览,但您的 Web 浏览器完全在本地运行,因此窗口更新快速而高效!
当您结束 SSH 连接时,SSH 客户端可能会出现挂起状态,直到您关闭浏览器,因为它可能仍在为浏览器和远程之间提供一些 SOCKS 转发的 TCP 连接sshd
。
关闭 SSH 连接后,请记住将浏览器的代理设置恢复为原始值,否则您可能根本无法浏览。