与 x11vnc 连接时出现黑屏

与 x11vnc 连接时出现黑屏

我正在尝试运行 x11vnc 服务器,以便有人可以远程连接到我的计算机,但我无法让它工作。我正在使用 Ubuntu 14.04,并使用 Vinagre 连接到本地主机来测试 VNC 服务器。我收到登录提示,它接受密码,但随后我只看到黑屏。这似乎不是一个罕见的问题,但我尝试了通过 Google 找到的大量解决方案,但没有一个对我有用。x11vnc 日志没有给出任何错误指示,所以我不知道从哪里开始找出问题所在。

我的 x11vnc 命令:

x11vnc -xkb -noxrecord -noxfixes -noxdamage -display :1 -auth /var/run/lightdm/root/:1 -usepw -forever -o /var/log/x11vnc.log

x11vnc 日志:

11/08/2015 15:14:43 Got connection from client 127.0.0.1
11/08/2015 15:14:43   other clients:
11/08/2015 15:14:43 Normal socket connection
11/08/2015 15:14:43 Disabled X server key autorepeat.
11/08/2015 15:14:43   to force back on run: 'xset r on' (3 times)
11/08/2015 15:14:43 incr accepted_client=5 for 127.0.0.1:48227  sock=7
11/08/2015 15:14:43 Client Protocol Version 3.8
11/08/2015 15:14:43 Protocol version sent 3.8, using 3.8
11/08/2015 15:14:43 rfbProcessClientSecurityType: executing handler for type 2
11/08/2015 15:14:46 rfbProcessClientNormalMessage: ignoring unsupported encoding type Enc(0xFFFFFEFE)
11/08/2015 15:14:46 Enabling NewFBSize protocol extension for client 127.0.0.1
11/08/2015 15:14:46 rfbProcessClientNormalMessage: ignoring unsupported encoding type Enc(0x574D5669)
11/08/2015 15:14:46 rfbProcessClientNormalMessage: ignoring unsupported encoding type Enc(0xFFFFFEFD)
11/08/2015 15:14:46 Enabling full-color cursor updates for client 127.0.0.1
11/08/2015 15:14:46 Enabling X-style cursor updates for client 127.0.0.1
11/08/2015 15:14:46 rfbProcessClientNormalMessage: ignoring unsupported encoding type Enc(0xFFFFFEFF)
11/08/2015 15:14:46 Using tight encoding for client 127.0.0.1
11/08/2015 15:14:48 client useCopyRect: 127.0.0.1 -1
11/08/2015 15:14:48 client_set_net: 127.0.0.1  0.0001

我当前的 ~/.vnc/xstartup (我尝试了多种变体):

#!/bin/sh

export XKL_XMODMAP_DISABLE=1
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &

gnome-panel &
gnome-settings-daemon &
metacity &
nautilus &
gnome-terminal &

答案1

如果活动虚拟终端与 X 服务器运行的终端不同(例如您的情况:您正在从同一台计算机进行测试,但您的 vnc 查看器在另一个 VT 上的会话中运行,而不是您想要连接到的 X 服务器),它不起作用。(我刚刚遇到过类似的问题,无法再进行 VT 切换,但想要与正在运行的 X 会话进行交互。)

那里解释道:http://www.karlrunge.com/x11vnc/faq.html#faq-linuxvc。 引用:

问:108:我使用 Linux 虚拟终端 (VT) 来实现用户会话之间的“快速用户切换”(例如,Betty 使用 Ctrl-Alt-F7,Bobby 使用 Ctrl-Alt-F8,而 Sid 使用 Ctrl-Alt-F1:他们使用这些按键在会话之间切换。)为什么连接到 x11vnc 的 VNC 查看器中的视图要么完全是黑色的,要么没有更新,要么像素混乱,除非 x11vnc 所连接的 X 会话处于活动 VT 中?

这似乎与应用程序(在本例中为 X 服务器进程)不在活动 VT(有时称为虚拟控制台的 VC)上时必须如何“正常播放”有关。也就是说,除非它们具有活动 VT,否则它们不应从键盘或鼠标读取数据或管理视频显示。鉴于 XGetImage() 调用似乎最终必须从视频硬件本身检索帧缓冲区数据,因此除非 X 会话对 VT 具有活动控制权,否则 x11vnc 的轮询将无法工作是有道理的。

似乎没有简单的方法可以解决这个问题。即使 xwd(1) 在这种情况下也不起作用(试试看)。需要在较低级别上做一些事情,比如在 XFree86/Xorg X 服务器中。此外,使用影子帧缓冲区(视频帧缓冲区的副本保存在主内存中)似乎无法解决问题(上次检查时间为 2007 年)。

如果没有人坐在工作站,而您只是想远程将 VT 切换到与您的 X 会话关联的 VT(以便 x11vnc 可以正确轮询它),则可以使用 chvt(1) 命令,例如“chvt 7”表示 VT #7。

答案2

您的帖子中有一些矛盾。x11vnc没有阅读~/.vnc/xstartup并且通常没有连接到-display :1

通常,您的屏幕上已经有一个标准 X11 服务器正在运行,并且它显示在显示器上:0。它在显示器上显示您的 gnome 桌面。然后,您运行 x11vnc 将此实际显示器上的内容复制到远程连接。

也许您指的是使用 来tightvncserver创建一个新的不可见的帧缓冲区,并在其中进行绘制,同时将其复制到远程。它读取~/.vnc/xstartup

答案3

我通过在点击连接之前在配置文件中添加密码而不是在点击连接后响应弹出窗口来解决这个问题。

那里还有一个用户名字段,这让我很困惑,因为我没有看到主机设置中任何关于用户名的引用,但我把它留空,只添加了密码,就这样。

现实一点,清醒一点。

答案4

上面的答案是正确的:

如果活动虚拟终端与 X 服务器运行的终端不同(例如您的情况:您正在从同一台计算机进行测试,但您的 vnc 查看器在另一个 VT 上的会话中运行,而不是您想要连接到的 X 服务器),它不起作用。(我刚刚遇到过类似的问题,无法再进行 VT 切换,但想要与正在运行的 X 会话进行交互。)

事实上,如果你在另一个帖子中关注同一主题,他们会以不同的方式讨论同一问题,这会给你提示如何创建解决方法:ubuntu 18.04 通过 VNC 连接到登录屏幕

我创建了以下解决方法:

  1. 创建文件 /etc/systemd/system/x11vnc.service,内容如下:

    #Description:自定义服务单元文件
    #文件:/etc/systemd/system/x11vnc.service
    
    [单元]
    描述=“x11vnc”
    需要=display-manager.service
    之后=display-manager.service
    
    [服务]
    #ExecStart=/usr/bin/x11vnc -loop -nopw -xkb -repeat -noxrecord -noxfixes -noxdamage -forever -rfbport 5900 -display :0 -auth guess -o /var/log/x11vnc.log
    ExecStart=/opt/x11vnc/x11vnc_switch_user
    ExecStop=/usr/bin/killall x11vnc_switch_user && /usr/bin/killall x11vnc
    失败时重新启动
    重启安全=2
    
    [安装]
    WantedBy=多用户.目标
  2. 创建文件 /opt/x11vnc/x11vnc_switch_user,内容如下:

/bin/bash #!/bin/bash

#/usr/bin/x11vnc -loop -nopw -xkb -repeat -noxrecord -noxfixes -noxdamage -forever -rfbport 5900 -display :0 -auth guess -o /var/log/x11vnc.log
#ExecStop=/usr/bin/killall x11vnc

虽然正确
        echo“检查 Xorg 使用的控制台……”

        CURRENT_CONSOLE=`fgconsole`
        CURRENT_XORG_PORT =`ps aux | grep Xorg | grep“vt $ CURRENT_CONSOLE”| cut -d':'-f 4 | cut -c1-1`
        回显“Xorg 端口=$CURRENT_XORG_PORT”

        EXIST_VNC_SERVER_ON_SAME_PORT =`ps aux | grep x11vnc | grep“显示:$CURRENT_XORG_PORT”| head -n 1 | cut -d':'-f 4 | cut -c1-1`

        如果[-n“$EXIST_VNC_SERVER_ON_SAME_PORT”]
        然后
                echo "VNC 已在端口 $CURRENT_XORG_PORT 上运行"
        别的
                echo "VNC 不在端口 $CURRENT_XORG_PORT 上运行,在端口 590$CURRENT_XORG_PORT 上启动 x11vnc..."
                /usr/bin/x11vnc -loop -nopw -xkb -repeat -noxrecord -noxfixes -noxdamage -forever -rfbport“590$CURRENT_XORG_PORT”-display:$CURRENT_XORG_PORT-auth guess-o /var/log/x11vnc.$CURRENT_XORG_PORT.log&

        echo "等待1秒..."
        睡眠 1
完毕
  1. 启用 x11vnc 服务:
systemctl 启用 x11vnc.service
  1. 启动 x11vnc 服务
systemctl 启动 x11vnc.service

剧本x11vnc_switch_用户只需从 Xorg 查找当前活动的 VT 屏幕,并为新端口创建一个新的 x11vnc(如果尚未创建)。

因此,如果您使用 VNC 客户端连接到主机的端口 0,然后切换到另一个用途,您将能够在同一主机上的另一个端口(例如 1)中找到新用户。

当然,这不是最好的解决方案,但是确实有效。

请注意,我正在使用Linux Mint(别名 Ubuntu),其中桌面管理器当然是 Cinnamon,但更重要的是它使用光调制作为登录管理器。

如果其他人有更好的无缝解决方案,请告诉我。

干杯,

卢卡

相关内容