有些时候,使用远程控制能够简化不少运维和操作的事情。
本篇文章分享如何通过开源工具 “Urch(Ubuntu Remote Control Helper)” 让 Ubuntu 原生的远程控制(远程桌面)功能稳定可靠。
方案已经经过 Ubuntu 22.04 LTS 和最新版本的 Ubuntu 22.10 两个版本的验证。
写在前面
虽然 Ubuntu Desktop 版本的操作系统默认提供了 “远程桌面” 的功能。但是官方功能使用起来有一些限制,尤其是对于无人职守的自动化场景来说:
1.原生的登录功能,需要我们的设备连接显示器,并解锁登录才能够使用。2.原生的桌面共享,设置的用于连接的用户密码,会随着系统重启而使用随机字符串填充,影响我们登录。3.因为开关远程共享功能,并不像设置密码这类操作需要二次确认,导致可能出现误关闭功能,无法连接设备。
或许,从官方设计的初衷来看,最推荐使用的场景是类似从前的“QQ远程协助”的场景:默认启动的模式,是使用“用户在界面中准许连接”的连接认证模式。
但如果,我们有靠谱的方式来控制远程桌面服务的开启关闭,确保我们开启的时候,不论是让连接密码稳定,还是系统相关的服务配置始终保持可用的,“原生的远程控制”功能,足够我们的日常使用,不需要安装任何三方的远程桌面控制软件。
为了解决上面的问题,我又写了一个程序。
开源软件 Ubuntu Remote Control Helper
这次的程序依旧是使用 Golang 完成的,大概花了 200 多行来进行实现。
项目完整代码开源在soulteary/ubuntu-remote-control-helper[1],欢迎自取、提交反馈和 PR,以及 “一键三连”。
关于项目的使用和介绍,下文中会聊到。
系统安装和前置准备
关于 Ubuntu 系统的安装,你可以参考这篇文章《在笔记本上搭建高性价比的 Linux 学习环境:基础篇》[2]。本文中测试了 Ubuntu 22.04 和 Ubuntu 22.10 两个 Desktop 版本。
sshopenssh-serversudo apt install -y openssh-server
ssh关于服务器的其他配置,你也可以参考上面文章中“进行系统基础配置[3]”部分来搞定,就不过多赘述了。
首次登录系统后的相关设置
首次登录系统后,我们需要打开“系统设置”,找到“桌面共享”,点击一次打开共享桌面,让系统自动配置和生成一次“登录凭证”。
为了避免一些预期之外的事情,我们在“系统设置”中选择当前用户,打开“自动登录”。
另外,为了避免在使用软件过程中,尤其是软件自动化职守的过程中,系统会弹出“认证登录框”影响程序运行。我们需要阅读本文中的 “聊聊原理:解决系统会弹出认证登录框的问题”,更新系统设置,解决这个问题。
好了,接下来我们来使用开源软件 “Urch(Ubuntu Remote Control Helper)” 完成剩余的操作。
快速配置稳定的 Ubuntu 远程控制
想要快速的让 Ubuntu 的远程控制功能稳定可靠,最快的方式是使用下面的两行命令,完成 Urch 安装脚本的下载和快速配置。
# 下载安装程序,并使用 bash 执行安装程序
wget https://github.com/soulteary/ubuntu-remote-control-helper/raw/main/example/installer.sh
bash installer.shhttps_proxyhttps_proxy=xx.xx.xx.xx:xx wget https://github.com/soulteary/ubuntu-remote-control-helper/raw/main/example/installer.sh
https_proxy=xx.xx.xx.xx:xx bash installer.shurch命令执行完毕,不错意外,你将看到类似下面的日志输出:
# urch
Remote Control Helper
check remote control credentials and correct the problem...
the configuration has been ensured to be correct.当你看到 “the configuration has been ensured to be correct” 的时候,所有的基础配置就都完毕啦。
soulteary为了让我们能够使用自己喜欢的账号和密码来登录系统,我们可以在执行命令的时候,通过下面的两种方法,来配置我们期望的用户名和密码。
设置用户:通过环境变量指定
UBUNTU_REMOTE_USER=admin UBUNTU_REMOTE_PASS=password urch# UBUNTU_REMOTE_USER=admin UBUNTU_REMOTE_PASS=password urch
Remote Control Helper
set remote username by env: admin
set remote password by env: password
check remote control credentials and correct the problem...
[gnome-remote-desktop] Find Process: 2152.
[gnome-remote-desktop] Process has been killed.
the configuration has been ensured to be correct.程序执行完毕,你的用户设置就生效啦。
设置用户:通过命令行参数指定
urch --user=user --pass=pass# urch --user=user --pass=pass
Remote Control Helper
set remote username by cli: user
set remote password by cli: pass
check remote control credentials and correct the problem...
[gnome-remote-desktop] Find Process: 4489.
[gnome-remote-desktop] Process has been killed.
the configuration has been ensured to be correct.好了,了解完程序的两种设置用户、密码的方式,我们来更新系统中唯一一处需要调整的配置内容。
确保 Urch 程序能够持续运行
/etc/supervisor/conf.d/urch.confsupervisor而 Urch 能够持续运行,能够确保我们远程控制账号始终正确的设置为我们想要的内容。
默认的配置如下:
[program:urch]
command=xvfb-run --auto-servernum --server-num=1 urch --daemon=1 --user=soulteary --pass=soulteary
user=soulteary
autostart=true
startsecs=3
startretries=100000
autorestart=true
stderr_logfile=/tmp/urch.err.log
stderr_logfile_maxbytes=10MB
stderr_logfile_backups=10
stdout_logfile=/tmp/urch.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=10--user=soulteary --pass=soultearysudo vi /etc/supervisor/conf.d/urch.confsupervisorsudo service supervisor restart
等待程序重启完毕,Urch 就会每隔一分钟检查一次我们的登录用户名和密码,以及相关的远程控制配置是否正常啦。如果遇到配置不正常的情况,比如配置由于系统重启而被重置的情况,它就会自动的将问题纠正过来。
接下来,我们只需要使用你的支持 RDP 的远程控制软件,配置好你在上面配置的账号密码,并连接你的服务器的默认端口,就能愉快的开始远程控制啦。
程序未来的设计规划
在文章的开头处,我们提到了,Ubuntu 默认的交互场景中,或许是出于安全考虑,默认其实会每次重启都将远程控制密码重置,以及提供了选择性允许连接的功能。
当前的版本中,我们已经能够确保远程控制功能是稳定可靠的。所以接下来的程序功能中,我或许会加上两个有意思的小功能,和官方一样,增强连接使用时的安全性:
1.通过接口或者规则文件,动态的开关服务器的远程控制功能。2.以及提供动态登录密码,让每次都登录都变的更加安全。
好啦,聊完使用部分,本篇文章就讲完一半啦。
如果你对原理和踩坑部分感兴趣,可以继续阅读,如果你只是想解决问题,上面的文章内容,应该能够帮到你了。别忘记给软件“一键三连”~
聊聊原理
虽然,在上面的文章里,我们轻描淡写的就解决了问题。
但其实,软件想要稳当的运行,提供功能,需要解决不少细碎的问题。
实现自动更新系统配置的原理
软件提供的主要功能之一,是自动对系统远程控制相关功能进行配置,并保证配置内容是“稳定的”。
gsettingsgsettings list-schemas|grep remote-desktop# gsettings list-schemas|grep remote-desktop
org.gnome.desktop.remote-desktop
org.gnome.desktop.remote-desktop.rdp
org.gnome.desktop.remote-desktop.vncgsettings list-keys# gsettings list-keys org.gnome.desktop.remote-desktop.rdp
enable
screen-share-mode
tls-cert
tls-key
view-onlygsettings get# gsettings get 'org.gnome.desktop.remote-desktop.rdp' 'enable'
truegsettings setgsettings set 'org.gnome.desktop.remote-desktop.rdp' 'enable' true
将上面的操作使用程序来实现,就完成了配置的基础自动化。
远程登录凭证(用户名和密码)的修改原理
虽然用于“远程控制”的用户名和密码也属于配置,但是配置的麻烦程度远超上面提到的系统配置。
libsecret-toolssudo apt-get install -y libsecret-tools
secret-tool lookup xdg:schema org.gnome.RemoteDesktop.RdpCredentials# secret-tool lookup xdg:schema org.gnome.RemoteDesktop.RdpCredentials
{'username': <'soulteary'>, 'password': <'&@RhOxaBakTe'>}{'username': <'soulteary'>, 'password': <'&@RhOxaBakTe'>}secret-tool storesecret-tool store -l 'GNOME Remote Desktop RDP credentials' xdg:schema org.gnome.RemoteDesktop.RdpCredentials
不过,这种方式将会触发交互式的操作确认,比较不利于实现程序完成操作。
所以,我们可以借助下面的命令,通过管道的方式,自动完成交互式的输入。
printf "{'username': <'soulteary'>, 'password': <'soulteary'>}" | secret-tool store -l 'GNOME Remote Desktop RDP credentials' xdg:schema org.gnome.RemoteDesktop.RdpCredentialssecret-tool lookup# secret-tool lookup xdg:schema org.gnome.RemoteDesktop.RdpCredentials
{'username': <'soulteary'>, 'password': <'soulteary'>}当然,上面这两条命令,如果是在“系统未开启自动登录”、“用户停留在锁屏界面”、“系统默认使用的加密 Keyring”、“使用后台程序启动的 Urch” 几类场景下,是都无法简单执行成功的。
所以,还需要解决上面提到的几个问题。
为什么要开启系统自动登录
尤其是 Desktop 版本的 Ubuntu 操作系统,如果我们不开启“用户自动登录”,则会遇到两个问题。
systemd --user/lib/systemd/systemd --user
...
/usr/libexec/gnome-remote-desktop-daemon第二个问题是,在我们没有调整 Keyring 权限之前,是无法通过程序自动的更新用户登录凭据的。
ssh# printf "{'username': <'soulteary'>, 'password': <'soulteary'>}" | secret-tool store -l 'GNOME Remote Desktop RDP credentials' xdg:schema org.gnome.RemoteDesktop.RdpCredentials
secret-tool: Cannot create an item in a locked collection想要解决上面这两个问题,我们只需要进入系统,在系统设置中选择我们的用户,然后设置用户为“自动登录”即可。
Ubuntu 桌面版和我们的手机系统一样,会自动开启桌面锁定。但是系统锁定后,也是会影响 Urch 保障系统配置为正常值的设置。
除了在系统设置界面中关闭界面锁定之外,我们还可以执行下面的命令,来解决这个问题。
gsettings set 'org.gnome.desktop.session' 'idle-delay' 0
当然,你不执行也无所谓,Urch 会检测这个配置,并自动关闭这个功能,避免运行环境不靠谱。
解决系统会弹出认证登录框的问题
当我们使用编程方式(调用 API)来设置系统登录凭证的时候,可能会遇到动作被“卡住”的情况。此时,系统会弹出一个“认证登录”的确认窗口,需要我们输入密码,点击确认按钮,然后才能完成操作。
但是如果程序是无人值守状态,即没有用户登录在系统上时,遇到了这个问题,那么程序就无法保障我们的配置都是正常的啦。
想要彻底解决这个问题,最简单的方案是登录系统,搜索 “keyring”,打开系统密钥管理应用。
接着,找到包含 Remote Desktop 相关的记录,然后在左侧的菜单上右键,选择“修改密码”,输入当前密码点击确认之后,系统会要求我们输入新密码以及对密码进行二次确认,这里我们不输入任何内容,会看到系统提示我们这样做将会“解密存储的密码”,点击确认即可。
完成操作后,我们重启系统。
再次进入系统之后,我们再次执行刚刚的命令,会发现不会再出现“系统弹窗认证”的问题啦。
printf "{'username': <'soulteary'>, 'password': <'soulteary'>}" | secret-tool store -l 'GNOME Remote Desktop RDP credentials' xdg:schema org.gnome.RemoteDesktop.RdpCredentials无外接显示器登录原理
当我们没有给 Ubuntu Desktop 安装显示器的时候,如果我们想用 RDP 软件来连接系统,进行 GUI 登录,会得到类似 “The disconnection was initiated by an administrative tool on the server in another session”的错误。
当然,默认情况不论是 RDP 还是市面上的三方商业远程控制软件都是如此。
解决这个问题的最佳方案是安装“虚拟桌面”:
sudo apt-get install -y xserver-xorg-core xserver-xorg-video-dummy
xorgSection "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 "1920x1080"
EndSubSection
EndSection/etc/X11/xorg.conf最后
本篇文章目前提到了,如何让 Ubuntu 原生的远程控制稳定可靠,下一篇相关的内容里,我们来聊聊细粒度的控制,以及让这个远程管理会话安全可靠。
自从能够使用 AI 应用绘图之后,写起来源项目的负担更轻了,因为再也不用头疼如何解决 Logo 设计啦! :-D
-- EOF
我们有一个小小的折腾群,里面聚集了一些喜欢折腾的小伙伴。
在不发广告的情况下,我们在里面会一起聊聊软硬件、HomeLab、编程上的一些问题,也会在群里不定期的分享一些技术资料。
喜欢折腾的小伙伴,欢迎阅读下面的内容,扫码添加好友。
添加好友时,请备注实名和公司或学校、注明来源和目的,否则不会通过审核。
本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)[7]
引用链接
[1][2][3][4][5][6][7]如果你觉得内容还算实用,欢迎点赞分享给你的朋友,在此谢过。
如果你想更快的看到后续内容的更新,请戳 “点赞”、“分享”、“喜欢” ,这些免费的鼓励将会影响后续有关内容的更新速度。