x11vnc:gdm3 登录后创建一个新的 x11 显示器

x11vnc:gdm3 登录后创建一个新的 x11 显示器

我希望能够通过 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守护进程才能登录然后连接到我的个人会话,这既不方便也不切实际;有没有办法配置x11vncgdm3允许我创建一个 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

相关内容