Ubuntu 18.04 LTS x11vnc 不再有效

zeb*_*ity 8 vnc xorg wayland 18.04

我最近从 Ubuntu 16.04 LTS 更改为 18.04 LTS,因为我需要更新版本的 kvm/qemu。

使用 16.04,我可以按照“社区帮助 Wiki”中的说明轻松运行 x11vnc 服务(守护进程):https : //help.ubuntu.com/community/VNC/Servers

这有一个设置 x11vnc 守护程序服务所需的脚本,它允许您远程登录机器,而无需先在本地登录。我需要这个,因为我的机器作为服务器运行并位于地下室,我总是通过 VNC 访问它,而不是本地。

最初,除了systemctl完全按照“社区帮助 Wiki”说明添加脚本之外,我对干净的 18.04 安装没有做任何事情:“在任何环境 (Vivid+) 中通过 systemd 自动启动 x11vnc”。

在发现这不再有效时,我根据一些搜索做了以下操作:

  1. 通过在此脚本中编辑/etc/gdm3/custom.conf和设置禁用“Wayland”显示管理器WaylandEnable=false

    [daemon]
    # Uncoment the line below to force the login screen to use Xorg
    #WaylandEnable=false
    WaylandEnable=false  <--- HERE
    
    Run Code Online (Sandbox Code Playgroud)
  2. /lib/systemd/system/x11vnc.service ExecStart命令更改为使用不同的xauth指令,如 18.04 中所示,似乎没有$HOME/.Xauthority可以通过-xauth guest指令找到的自动生成的文件:

    从:

    ExecStart=/usr/bin/x11vnc -auth guess -forever -loop -noxdamage -repeat -rfbauth /home/USERNAME/.vnc/passwd -rfbport 5900 -shared
    
    Run Code Online (Sandbox Code Playgroud)

    到:

     ExecStart=/usr/bin/x11vnc -auth /run/user/120/gdm/Xauthority -forever -loop -noxdamage -repeat -rfbauth /home/USERNAME/.vnc/passwd -rfbport 5920 -shared
    
    Run Code Online (Sandbox Code Playgroud)

我根据对 Xauthority 的一些阅读和测试来做到这一点,这表明.Xauthority令牌的位置现在是通过$XAUTHORITY环境变量给出的。

为了找到它的值,我运行以下“ find”命令来查找哪些进程XAUTHORITY定义了环境变量。

注意:这使用 linux/proc/<procid>/environ文件结构来搜索进程环境变量,

cd /proc
sudo find . -maxdepth 1 -type d -exec sh -c "(test -f '{}'/environ && cat '{}'/environ | tr '\0' '\n' | grep XAUTHORITY= )" \;
Run Code Online (Sandbox Code Playgroud)

这返回了两个不同的结果:

  • XAUTHORITY=/run/user/120/gdm/Xauthority
  • XAUTHORITY=/run/user/1000/gdm/Xauthority

然后我使用以下内容来查找相应的进程 ID:

sudo find . -maxdepth 1 -type d -exec sh -c "(test -f '{}'/environ && grep -aH XAUTHORITY= '{}'/environ )" \;
Run Code Online (Sandbox Code Playgroud)

这些对应的流程是:

240 tty1     Sl+    0:00 /usr/lib/gnome-session/gnome-session-binary --autostart /usr/share/gdm/greeter/autostart
14923 tty2     Sl+    0:00 /usr/lib/gnome-session/gnome-session-binary --session=ubuntu
Run Code Online (Sandbox Code Playgroud)

第一个似乎与登录欢迎屏幕相关联,而第二个是用户桌面。

对环境变量的进一步检查显示一个有USER=gdm,另一个有USER=<ME>

问题是,如果我使用“greeter”身份验证位置,则会提示我提供密码,然后是黑屏/黑屏。如果我使用用户身份验证位置,则我根本无法获得任何客户端连接,因为状态返回无法打开显示的错误:

13/05/2018 16:19:14 *** XOpenDisplay failed.
Run Code Online (Sandbox Code Playgroud)

因此,您似乎被 xauth 机制的变化所吸引。

有人可以就此提供一些指导吗?

zeb*_*ity 10

Ubuntu 18.04 x11vnc 用户。

这是一个“hack answer”,它允许您在未登录的情况下获得 VNC 访问权限。

我说 hack 是因为它涉及运行 2 个 x11vnc 服务。

第一个是允许通过登录DISPLAY=:0,第二个是使用 VNC 访问桌面DISPLAY=:1

为此,我使用了以下 2 个守护程序脚本:

第一个是:x11vnc-login.service仅用于登录问候语

[Unit]
Description=Start x11vnc-login at startup.
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth /run/user/120/gdm/Xauthority -forever -loop -noxdamage -repeat -rfbauth /home/<ID>/.vnc/password -rfbport 5922 -shared -display :0
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

第二个是x11vnc.service for desktop::

[Unit]
Description=Start x11vnc at startup.
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth /run/user/1000/gdm/Xauthority -forever -loop -noxdamage -repeat -rfbauth /home/<ID>/.vnc/password -rfbport 5920 -shared -display :0
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

脚本的安装和启用按照社区帮助站点上的文档进行

这是一个可怕的黑客,但让我暂时运行,直到找到合适的解决方案。

在使用中,我首先打开 VNC 会话到端口 5922 并进行登录。登录后,您最终会出现黑屏。所以你然后在端口 5920 上打开 VNC 会话,瞧,你的桌面就出现了。对我来说,比必须去服务器机器运行的地方更容易......

显然需要一些脚本来初步搜索正在运行的进程以查看用户是否已登录,如果是,则只需使用现有用户部分中的 XAUTHORITY/DISPLAY 信息(从 /proc/PROCID/environ , 否则将套接字连接到使用greeter XAUTHORITY/DISPLAY 的greeter 屏幕,然后使用用户桌面XAUTHOURITY/DISPLAY 值以某种方式将套接字连接移动到另一个x11vnc 会话。

我怀疑有点复杂的叉/套接字/文件描述符编程。

另一种可能性是弄清楚是否有某种方法可以让 18.04 显示管理器按照之前的 16.04 运行。


小智 8

我遇到了同样的问题,在对 x11vnc 和 gdm 进行了一些处理之后,我决定简单地切换回 lightdm:

apt install lightdm
Run Code Online (Sandbox Code Playgroud)

这应该会显示显示管理器配置。如果没有运行:

dpkg-reconfigure lightdm
Run Code Online (Sandbox Code Playgroud)

我现在使用以下配置通过主管运行我的 x11vnc 服务器:

$ cat /etc/supervisor/conf.d/x11vnc.conf
[program:x11vnc]
command=/usr/bin/x11vnc -xkb -safer -nopw -once -geometry 1024x768 -auth /var/run/lightdm/root/\:0 -display :0
user=root
autorestart=true
Run Code Online (Sandbox Code Playgroud)

此外,我在顶部运行 noVNC(也通过主管),因此我可以仅通过浏览器远程访问我的桌面。以防万一您感兴趣,配置文件如下所示:

$ cat /etc/supervisor/conf.d/novnc.conf
[program:noVNC]
command=/opt/noVNC/utils/launch.sh --vnc localhost:5900
user=root

$ cat /etc/nginx/sites-enabled/novnc
upstream vnc_proxy {
    server 127.0.0.1:6080;
}

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    include snippets/snakeoil.conf;

    root /var/www/html;

    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
            auth_pam               "Secure Zone";
            auth_pam_service_name  "nginx";
            proxy_pass http://vnc_proxy/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            keepalive_requests 10000;

            proxy_read_timeout 61s;

            proxy_buffering off;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能希望为它包装一些额外的安全性。