本文最后更新于 2024-07-30,文章内容可能已经过时。

vscode 通过 ssh 连接远程服务器使用 GUI 全流程

参考原文链接:https://zhuanlan.zhihu.com/p/698507761

作用:在无桌面端的服务器上显示图形界面(如 python 使用 matplotlib 绘图,pygame 游戏等)

前提:成功通过 ssh 连接到服务器。

配置步骤

一、主机(Windows)上的操作

  1. 在 vscode 上安装 Remote X11 和 Remote X11 (SSH) 这两个插件。(我是在本机和服务器上都安装了)
  2. 在主机的 SSH 设置里添加这几行:
  ForwardX11 yes
  ForwardX11Trusted yes
  ForwardAgent yes
  

image-20240727123004537

SSH 设置可以通过 Vscode 这里打开,也可以通过 C:/Users/{UserName}/.ssh/config 打开

  1. 下载 VcXsrv 软件。

下载地址:https://sourceforge.net/projects/vcxsrv/

  • 下载安装完成后打开 Xlaunch.exe,如下设置
  • 第一步的 Display number 设置为 10

image-20240727121805164

image-20240727121821918

image-20240727121848970

这里需要勾上 Disable access control

然后点击完成即可。托盘右下角显示下图即代表成功 X server 成功启动。

  1. windows 防火墙设置(我就是在这里卡了,还不报错 :(

win+R 输入 control 打开控制面板,搜索 windows Defender 防火墙 -> 允许应用通过 windows defender 防火墙,把这里全勾上

image-20240727122136721

如果这里没有显示 VsXsrv,手动在下面通过安装路径讲 VcXsrv.exe 加入即可

二、服务器上进行的操作

  1. vim /etc/ssh/sshd_config,进行以下设置
AllowAgentForwarding yes
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes

然后通过 sudo systemctl restart sshd 命令重启 sshd 服务。

  1. vim ~/.bashrc,在最后添加代码:export DISPLAY=“localhost:10.0”

注意这里的localhost要设置成window的ip

可以通过 echo $DISPLAY ,输出 localhost:10.0 确保配置成功。

image-20240727122901815

3.在服务器命令行内输入 xclock 测试,如果出现时钟小窗口,说明配置成功!

image-20240727123117058

三、原理

X 协议简介

  • Linux Kernel是没有图形化界面的,所谓的图形化界面系统只不过中Linux下的一个应用程序。这一点和Windows系统很不一样。Windows从Windows95版本开始,图形界面就直接在系统内核中实现了,是操作系统不可或缺的一部分,这也就是为什么云服务器上装Windows系统,大多时候也是远程桌面来进行管理维护。Linux的图形化界面,底层基于X协议。
  • X协议也被称为X视窗,是用于UNIX和Linux图形显示的标准,它由X server和X client组成:
    • X server:管理主机上与显示相关的硬件设置(如显卡、键盘,鼠标等),它负责屏幕画面的绘制与显示,以及将输入设置(如键盘、鼠标)的动作告知X client。
    • X client:X应用程序,则主要负责输入事件的处理(即程序的逻辑)。
  • **举个例子:**如果用户在程序界面上点击了鼠标左键,因为鼠标归X server管理,于是X server会捕捉到了鼠标点击这个动作,然后它将这个动作告诉X client;X client负责程序逻辑,于是X client会根据程序预先设定的逻辑(例如画一个圆),告诉X server 说:“请在鼠标点击的位置,画一个圆”。最后,X server就响应X client的请求,在鼠标点击的位置,绘制并显示出一个圆。

X协议Server与Client的概念,刚好与现在很多远程桌面/云桌面是反过来的。X11Forwarding跟现在云应用倒是非常地相似。

什么是 X11 Fowarding

X11是指X协议的11号版本。下面来说说Forwarding:

许多时候X server和X client在同一台主机上,这看起来没什么,就是一个图形化的OS。但是,X server和X client也完全可以运行在不同的主机上,只要彼此通过X协议通信即可。于是,我们就可以用这种机制,做一些“神奇”的事情,在本地运行并显示(X server端)另一台主机上的GUI程序(X client端)。这样的操作可以通过SSH X11Forwarding来实现。

img

X server在本地,负责GUI的显示,X client在远端主机,负责程序逻辑运算。有了X11 Forwarding这个机制,通过支持此功能的SSH客户端连接并运行Linux上有GUI的程序,就像是在Windows下运行GUI程序一样方便。很多时候,这样的机制可以方便GUI程序的调试。

四、可能遇到的问题,以及 DEBUG 思路

  • 确保 SSH 客户端支持 X11 转发并且已打开。
  • 确保安装了 xauth。
  • ~/.ssh/config 文件中是否启用了 X11 转发?添加“ForwardAgent yes”和“ForwardX11 yes”。还可以在连接时使用“ssh -X user@host”强制打开。
  • $DISPLAY 变量是否已设置但出现错误?如果是这样,那通常不是转发,而是你电脑上的东西。在出现提示时使用“echo $DISPLAY”检查您的 $DISPLAY。它应该包含诸如“localhost:10.0”或“localhost:13.0”之类的内容。你的 X Windows 服务器软件 (VcXsrv) 是否有权限?如果是这样,请将它们设置为完全打开(允许所有主机连接)。
  • 在 SSH 服务器上,sshd_config 中是否有“X11Forwarding yes”和“AllowAgentForwarding yes”?如果它被注释掉,请取消注释并重新启动 SSH 守护进程(“service sshd restart”适用于很多发行版)。
  • 你的主目录可写吗?当你登录时,它需要创建一个 ~/.Xauthority 文件,如果它不能做到这一点,你就会遇到问题。
  • 你的 ~/.ssh 目录是否可写且权限正确?它应该由用户和 chmod 700 拥有。其中的内容应该是 chmod 600。
  • 那里有旧的 ~/.Xauthority 文件吗?尝试删除它并重新登录。
  • 是否禁用了 IPv6?如果运行“sysctl net.ipv6.conf.all.disable_ipv6”并且它返回为 1,或者“lsmod | grep ipv6”没有显示您可能已禁用 IPv6 的任何信息。事实证明,OpenSSH 讨厌这一点,并以一种非常被动、攻击性的方式来表现它。将“AddressFamily inet”添加到您的 sshd_config 并重新启动守护进程。这迫使它只能返回到 IPv4。
  • 最后,如果以上方法均无效,尝试使用 SSH 进行调试,“ssh -v -X user@host”,看看它是否告诉您出了什么问题。添加更多“v”以提高调试级别,例如“ssh -vv -X user@host”。

测试:

远程连接ssh后,直接打开kali中的wireshark

image-20240727122558115

成功,ctrl+c在命令行,自动退出图形

打开burpsuit,成功

image-20240727123146602

启动firefox的时候报错

Firefox is already running, but is not responding. To use Firefox, you must first close the existing Firefox process, restart your device, or use a different profile.

原因:

home目录做成共享目录后,无法在不同的机器同时打开firefox,在第二个机器上打开firefox之后报错:“Firefox is already running, but is not responding. To use Firefox, you must first close the existing Firefox process, restart your device, or use a different profile.”

引起该问题的原因,主要是因为firefox启动的时候会统一使用一个默认profile,而这个profile在同一个机器上使用的时候是没有问题的,但是当其它机器再使用这个profile的时候,就无法正常启动firefox。

解决:

在启动firefox的时候加上一个选项,“firefox -P &”,然后选择在不同的机器上选择不同profile启动。

image-20240727124247643

点击Start Firefox即可,

再次启动firefox,出现界面,运行firefox后,使用firefox会时不时卡死,不知道是不是我电脑的原因

image-20240727125008902

但是可以看到这里报错了

image-20240727125421378

该错误表明你正在尝试以root用户身份运行Firefox浏览器,但是系统环境变量XDG_RUNTIME_DIR不存在或者无效。XDG_RUNTIME_DIR是用于存储在用户会话之间需要持久化的运行时文件的目录。

解决方法:

不要以root用户身份运行Firefox。使用普通用户身份启动浏览器,或者使用sudo -i或su命令切换到root用户再启动浏览器。

如果你有特定的需求需要以root身份运行浏览器,你可以设置或修复XDG_RUNTIME_DIR环境变量。通常,这个变量应该被设置到一个安全的目录,并且该目录的权限应该被限定,只允许当前用户访问。

例如,你可以在shell中设置这个变量:

export XDG_RUNTIME_DIR=/path/to/secure/directory

然后再次尝试以root用户身份运行Firefox。

  1. 另一个解决方法是配置Polkit以允许非特权用户以root权限运行Firefox或任何其他应用程序。这涉及编辑Polkit的规则文件,但这通常不推荐,因为它可能会带来安全风险。

运行 谷歌浏览器,比firefox丝滑,不知道为什么

sudo chromium --no-sandbox

可以试试firefox运行的时候加上–no-sandox参数。