我希望能够通过 VNC 客户端远程连接到运行 Ubuntu 18.04 的计算机。我使用的是x11vnc
服务器端。
以下是我开始初始x11vnc
会话的方式:
sudo x11vnc -rfbauth ~/.x11vnc/passwd -forever -bg -sshxdmsvc -rfbport 5900 -create -auth /run/user/123/gdm/Xauthority -display :0
我-auth
通过运行命令找到了参数
ps wwwaux | grep auth
这可以正常工作:使用该配置,我确实设法通过 SSH 连接到 vnc 服务器,并且它显示了由 管理的登录屏幕gdm3
。但是,每当我输入密码时,屏幕都会变黑。当我运行命令时w
,我得到:
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
skasch :1 :1 10:13 ?xdm? 12.27s 0.00s /usr/lib/gdm3/gdm-
如果我停止 x11vnc 并使用以下配置重新启动它:
x11vnc -rfbauth ~/.x11vnc/passwd -forever -sshxdmsvc -rfbport 5900 -create -display :1
然后我就可以通过 SSH 正确连接到我的实际个人会话。
但是,必须运行两个不同的x11vnc
守护进程才能登录然后连接到我的个人会话,这既不方便也不切实际;有没有办法配置x11vnc
或gdm3
允许我创建一个 VNC 守护进程来登录和显示我的会话?这在 Ubuntu 16.04 上工作正常(我相信这是因为它依赖于lightdm
)。
答案1
我安装的是 CentOS 8.3,当 gdm3 启动新的 x11 显示时我也遇到了同样的问题。
我的解决方法与其他使用启动 x11vnc 的服务的解决方案类似。例如,请参阅这里。
在我的解决方案中,仅使用一个 x11vnc 实例。结果是客户端始终连接到同一端口。对于我的用户来说,这是一个优势。
每当 x11vnc 重新启动时,它都会连接到“当前”显示。即欢迎程序或活动用户会话的显示。
它使用 loginctl 来查找活动的 x11 登录。
需要注意的是,结果并不完美:
登录或退出后返回到欢迎界面时,x11vnc 会被终止并重新启动,并显示新的显示。这意味着 vnc 客户端断开连接,必须重新连接。
这与其他解决方案类似。
详情如下:
在/etc/systemd/system/x11vnc.service
:
[Unit]
Description=Start x11vnc at startup.
After=multi-user.target display-manager.service
[Service]
Type=simple
ExecStart=/etc/x11vnc/start_x11vnc.sh
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
中的脚本/etc/x11vnc/start_x11vnc.sh
如下:
#!/bin/sh
# list login sessions
sessions=$(loginctl --no-legend | awk '{print $1}')
for session_id in $sessions
do
session_attributes=$(loginctl show-session $session_id)
IFS=$'\n'
for a in $session_attributes
do
declare $a
done
# look for the login session which is x11 and active
if [ $Type = 'x11' ] && [ $Active = 'yes' ]
then
break
fi
done
# Now we should have the variables for the active login session
pid=$( ps -C gnome-shell -o lsession,pid,user,args | awk -v session_id=$session_id -F' ' '$1 == session_id' | awk '{print $2}' )
display_id=$(cat /proc/${pid}/environ | tr '\0' '\n' | grep DISPLAY | cut -d= -f2)
ps -C x11vnc u > /dev/null
status=$?
if [ $status = 0 ]
then
x11vnc_port=$(ss -tulpn4 | grep x11vnc | tr -s ' ' | cut -d' ' -f5 | cut -d\: -f2)
else
X11VNC_AVOID_WINDOWS=never
x11vnc_port=$(/usr/bin/x11vnc -o /var/log/x11vnc.log -noxdamage -display $display_id -auth /run/user/$User/gdm/Xauthority -rfbauth /etc/vncpassw\
d -repeat -shared)
fi
然后,在/etc/gdm/PostLogin/Default
:
#!/bin/sh
/etc/x11vnc/kill_x11vnc_gdm.sh
并且/etc/x11vnc/kill_x11vnc_gdm.sh
:
x11vnc_pid=$(ps -C x11vnc -F | grep 'display \:0.*gdm' | tr -s ' ' | cut -d' ' -f2)
echo killing ${x11vnc_pid}
kill ${x11vnc_pid}
答案2
当您将 GDM 与 Xorg 一起使用时,它会为每个用户创建一个新会话。(:0,:1..)。我必须在 Ubuntu 22.04 LTS 上执行此操作。我为 GDM 登录屏幕创建了一个脚本,并为每个用户登录创建了一个运行的脚本。对于 GDM 登录脚本:
在/usr/share/gdm/greeter/autostart/start-vnc.desktop
[桌面条目] 版本=1.0 名称=启动 VNC 执行=x11vnc_server 终端=false 类型=应用程序
上面调用的脚本(127 是 GDM 用户 ID):
在/usr/local/bin/x11vnc_server
/usr/bin/x11vnc -display:0 -auth /var/run/user/127/gdm/Xauthority -forever
对于每个用户登录:
在/etc/xdg/autostart/vnc-start-user.desktop
[桌面条目] 名称=启动 VNC 用户 执行=vnc_start_user 终端=false 类型=应用程序
和...
在/usr/local/bin/vnc_start_user
/bin/bash #!/bin/bash SCREEN=$(who |grep "(:.)" |grep $(whoami) |awk {'print $2'}) /usr/bin/x11vnc-display $SCREEN-forever