kali设置ssh连接远程服务器使用GUI图像程序
本文最后更新于 2024-07-30,文章内容可能已经过时。
vscode 通过 ssh 连接远程服务器使用 GUI 全流程
参考原文链接:https://zhuanlan.zhihu.com/p/698507761
作用:在无桌面端的服务器上显示图形界面(如 python 使用 matplotlib 绘图,pygame 游戏等)
前提:成功通过 ssh 连接到服务器。
配置步骤
一、主机(Windows)上的操作
- 在 vscode 上安装 Remote X11 和 Remote X11 (SSH) 这两个插件。(我是在本机和服务器上都安装了)
- 在主机的 SSH 设置里添加这几行:
ForwardX11 yes
ForwardX11Trusted yes
ForwardAgent yes
SSH 设置可以通过 Vscode 这里打开,也可以通过 C:/Users/{UserName}/.ssh/config
打开
- 下载 VcXsrv 软件。
下载地址:https://sourceforge.net/projects/vcxsrv/
- 下载安装完成后打开 Xlaunch.exe,如下设置
- 第一步的 Display number 设置为 10
这里需要勾上 Disable access control
然后点击完成即可。托盘右下角显示下图即代表成功 X server 成功启动。
- windows 防火墙设置(我就是在这里卡了,还不报错 :(
win+R 输入 control 打开控制面板,搜索 windows Defender 防火墙 -> 允许应用通过 windows defender 防火墙,把这里全勾上
如果这里没有显示 VsXsrv,手动在下面通过安装路径讲 VcXsrv.exe 加入即可
二、服务器上进行的操作
vim /etc/ssh/sshd_config
,进行以下设置
AllowAgentForwarding yes
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes
然后通过 sudo systemctl restart sshd
命令重启 sshd 服务。
vim ~/.bashrc
,在最后添加代码:export DISPLAY=“localhost:10.0”
注意这里的localhost要设置成window的ip
可以通过 echo $DISPLAY ,输出 localhost:10.0 确保配置成功。
3.在服务器命令行内输入 xclock 测试,如果出现时钟小窗口,说明配置成功!
三、原理
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来实现。
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
成功,ctrl+c在命令行,自动退出图形
打开burpsuit,成功
启动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启动。
点击Start Firefox即可,
再次启动firefox,出现界面,运行firefox后,使用firefox会时不时卡死,不知道是不是我电脑的原因
但是可以看到这里报错了
该错误表明你正在尝试以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。
- 另一个解决方法是配置Polkit以允许非特权用户以root权限运行Firefox或任何其他应用程序。这涉及编辑Polkit的规则文件,但这通常不推荐,因为它可能会带来安全风险。
运行 谷歌浏览器,比firefox丝滑,不知道为什么
sudo chromium --no-sandbox
可以试试firefox运行的时候加上–no-sandox参数。
- 感谢你赐予我前进的力量