kali linux树莓派配置的各种坑① 有线配置+串口控制台
kali linux树莓派配置踩坑之旅② wifi配置+tightvnc可视化
kali linux树莓派配置踩坑之旅③ x11vnc 真·窗口可视化
kali linux树莓派配置踩坑之旅④ x11vnc配合网线直连——直接起飞
上一章我们讲到,使用tightvncserver的弊端。咱们使用可视化就是为了运行一些需要窗口的程序,然而tightvnc并不能满足我们的需求,因此建立一个真实的窗口连接显得尤为重要。目前为止除了X11我还没有找到其他服务能够实现这个功能。
1.安装x11vnc
sudo apt-get install -y x11vnc
2.设置密码文件
sudo x11vnc -storepasswd
与tightvnc一样,输入密码后x11vnc会找个地方把密码存起来,默认位置在/root/.vnc/passwd中(控制台会有文件路径提示)
3.配置开机自启动
新建 /lib/systemd/system/x11vnc.service
在文件中写入如下代码
[Unit]
Description=Start x11vnc at startup.
After=multi-user.target
[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -ncache 10 -auth guess -nap -forever -loop -repeat -rfbauth /root/.vnc/passwd -rfbport 5900
[Install]
WantedBy=multi-user.target
老规矩,咱们解读一下这个配置文件:
其他参数都是服务声明的固定格式,我们重点看看ExecStart这个参数。我们来解读一下这个命令行/usr/bin/x11vnc -ncache 10 -auth guess -nap -forever -loop -repeat -rfbauth /root/.vnc/passwd -rfbport 5900
的意义。
参数 | 说明 |
---|---|
/usr/bin/x11vnc | x11vnc程序路径 |
-ncache 10 | 屏幕内容缓存声明,加大功耗减小操作延迟 |
-auth guess | 猜测需要投屏的窗口号,如果一个不行换另一个,这个参数不用改 |
-nap | 窗口活跃度检测,如果窗口不活跃就增加x11服务的睡眠时长,多休息有益于身体健康 |
-forever | 窗口主动断开连接后,仍然不关闭x11服务等待下一次连接 |
-loop | 持续运行,遇到报错不中断,立刻重启服务 |
-repeat | 解决vnc键盘输入延迟bug,呃一个老外说的,我也看不懂,下面摘录一下原文 |
-rfbauth | 密码文件存储路径 |
-rfbport | 监听的端口号 |
硬核老外原文(评论区有大神,麻烦解读一下):
经过亲测发现:-ncache 10
这个参数并不像我想象的那样将内容记录在缓存区,而是之间创建十几个屏幕怼到你面前,真的是被它折磨了好久才发现,所以还是不要加这个参数为妙。
背景知识:
注意,注意重点来了,如果你直接运行上面的这个命令,本来是可以直接启动x11vnc服务的。那为什么要注册服务呢?
x11vnc -ncache 10 -auth guess -nap -forever -loop -repeat -rfbauth /root/.vnc/passwd -rfbport 5900
如果你在串口控制台,或是在ssh中运行这个语句,你会惊喜的发现
如下报错:
这是为什么呢?这就不得不吐槽一下,X11设计师的脑洞,要我说被驴踢了也不过分,这个所谓的参数-auth guess其实并没有guess,而是以当前的shell窗口所绑定的窗口为准,那么事情就变成了这样。(tightvnc虽然绑定了窗口,但绑定的窗口是假的,我们就是想获取真窗口才用x11vnc所以通过tightvnc是不行的)
可以看到,我们把绑定了显示器的shell称为“主shell”,我们不论以现有的哪种方式连接shell,都只能连接到一个没有绑定显示器的shell上面去,x11获取不到绑定显示器的窗口信息,没有不报错的道理。那么事情就又变成了这样:
我滴妈。设计师你脑回路能再奇葩点么。但活人不能让尿憋死,程序员们想到了,配置启动服务,启动时运行的所有命令都默认在主shell上运行,而作为远程连接我们使用主shell的唯一机会,就是在开机启动的时候。(想想有点可怜)
综上所述,远程连接下运行x11vnc必须通过注册服务的方式,不要试图使用命令行。(我就是因为这个一晚上没睡,调bug,难受)
导语:
通过上述论证不难发现,我们依然没有解决外接显示器的问题,因为再没有外接显示器的情况下,即使是主shell也没有绑定窗口,所以依然会报错。因此接下来我们要安装一个“假显示器”,来替代外接显示器。
1.安装虚拟显示器服务
sudo apt-get install xserver-xorg-core
sudo apt-get install xserver-xorg-video-dummy
2.修改/创建配置文件(默认就会使用虚拟显示器了)
sudo nano /etc/X11/xorg.conf.d/xorg.conf
Section "Device"
Identifier "Configured Video Device"
Driver "dummy"
EndSection
Section "Monitor"
Identifier "Configured Monitor"
HorizSync 31.5-48.5
VertRefresh 50-70
EndSection
Section "Screen"
Identifier "Default Screen"
Monitor "Configured Monitor"
Device "Configured Video Device"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1280x720"
EndSubSection
EndSection
这里说明一下,每个人安装X11服务所在的位置可能不一样,我们只需要找到X11/xorg.conf.d/xorg.conf这样的文件夹就可以了,不一定非要在/etc目录下,可以使用find命令来寻找该文件夹的位置。
3.保存好配置文件之后,reboot重启就可以了。
可以使用命令xrandr -q
来查看当前虚拟显示器的参数情况。
root@kali:/# xrandr -q
Screen 0: minimum 0 x 0, current 1536 x 864, maximum 32768 x 32768
default connected primary 1536x864+0+0 406mm x 228mm
1536x864 0.00*
4.vncviewer建立可视化连接
在vnc server参数下,使用你的ip地址:端口号
的方式访问,参数设置如下。
输入之前创建密码文件时设置的密码。点击ok进行连接。
5.大功告成,恭喜你拿到了一个“真正的窗口”。这个窗口将跟之前的tightvnc有天壤之别,速度和分辨率都相当客观,有一种德芙巧克力般的“丝滑”的感觉,谁用谁知道。
运行一个wireshark试一试,哈哈成了,感动的要哭出来。