无法访问 X11VNC 的 Xauthority(Ubuntu 20.04)

无法访问 X11VNC 的 Xauthority(Ubuntu 20.04)

我正在尝试在 Ubuntu 20.04 上实现 X11VNC,但结果令人沮丧。我需要使用命令方式,目标是将其保留在 systemd 服务上。

据我所知,Ubuntu 目前正在使用 Xorg。运行后ps wwwwaux | grep auth我得到以下信息:

gdm 3530 0.0 2.4 211180 50128 tty1 Sl+ 10:41 0:01 /usr/lib/xorg/Xorg vt1 -displayfd 3 -auth /run/user/125/gdm/Xauthority -background none -n​​oreset -keeptty -verbose 3

admin-r+ 4700 0.2 2.7 216112 55220 tty2 Sl+ 11:58 0:02 /usr/lib/xorg/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -background none -n​​oreset -keeptty -verbose 3

因此,当用户未登录时,像这样运行 X11VNC 服务器应该是正确的(请忘记安全性):

x11vnc -xkb -noxrecord -noxfixes -noxdamage -forever -rfbport 11226 -auth /run/user/125/gdm/Xauthority -display :0

登录后如下:

x11vnc -xkb -noxrecord -noxfixes -noxdamage -forever -rfbport 11226 -auth /run/user/1000/gdm/Xauthority -display :0

嗯,它在 GDM 上运行良好,但在用户登录时则不行。

  • 当然,已经尝试使用 root 和用户配置文件。
  • 当然检查了 UUID。

还尝试了对 GDM conf 文件WaylandEnable=false进行注释和不注释。注释后,当用户登录时,它可以运行此命令:

x11vnc -xkb -noxrecord -noxfixes -noxdamage -forever -rfbport 11226 -display :0

但在 GDM 中不起作用。如果我注释掉它,它可以在 GDM 中从 root 运行:

x11vnc -xkb -noxrecord -noxfixes -noxdamage -forever -rfbport 11226 -auth /run/user/125/gdm/Xauthority -display :0

所以我没有找到解决所有问题的方法。我现在没有主意了。LightDM 不是一个解决方案,因为我们想使用 GDM3。

任何回复都将不胜感激。

问候。

答案1

问题出在显示器上。由于 lightdm 仅使用一个显示器 (:0),GDM 会为每个用户显示一个显示器,因此这应该是正确的,并且对我来说是有效的:

x11vnc -xkb -noxrecord -noxfixes -noxdamage -forever -rfbport 11226 -auth /run/user/1000/gdm/Xauthority -display :1

答案2

我遇到过类似的问题。我无法在启动屏幕上登录 Ubuntu。最后想出了一个解决方法脚本来修复在 Ubuntu 21 上使用默认 GDM3 时 X11VNC 的问题。我希望 X11VNC 可以解决这个问题。

安装 x11vnc 后,使用它作为安装脚本来配置您的 X11VNC。

    #!/bin/bash


if [ -z "$1" ]; then echo "Please pass the password you would like to use as an argument to this script"; exit 1 ; else echo "Good start.going ahead."; fi

apt update && apt install tmux -y
password=$1
passwordfile='/etc/x11vnc.pass'
servicefile='/etc/systemd/system/x11vnc.service'
timerfile='/etc/systemd/system/x11vnc.timer'
script='/usr/bin/startxvnc'
apt-get update
apt-get install x11vnc net-tools -y
x11vnc -storepasswd $password $passwordfile



cat >$servicefile <<'EOT'
[Unit]
Description="x11vnc"
Requires=display-manager.service

[Service]
Type=simple
#Environment=XAUTHORITY=$(ps aux | grep -o -E "(-auth)(.*)(Xauth)[a-zA-Z]+")
#ExecStart=tmux new -s gj -d '/usr/bin/x11vnc $(ps aux | grep -o -E "(-auth)(.*)(Xauth)[a-zA-Z]+") -display :0 -rfbauth /etc/x11vnc.pass -shared -forever'
#ExecStartPre=tmux new -s x11vnc -d
ExecStart=bash -c /usr/bin/startxvnc
#ExecStop=tmux kill-session -t x11vnc
Restart=on-failure
RestartSec=2

[Install]
WantedBy=graphical.target
WantedBy=multi-user.target


EOT


cat >$timerfile <<'EOT'
Unit]
Description=Wait for some time before running X11VNC

[Timer]
OnBootSec=5sec

[Install]
WantedBy=timers.target

EOT




cat >$script <<'EOT'
#!/bin/bash

getxauths()
{
xauths=()

ps aux | grep -o -E "(-auth)(.*)(Xauth)[a-zA-Z]+" | (while IFS= read -r xauth
do
xauths+=("$xauth")
done
printf "%s\n" "${xauths[@]}" | sort -u
) }


getpname()
{
#psp=$(ps -p $(lsof -t -i:5900) -o command)
psp=$(cat /proc/$(lsof -t -i:$1)/cmdline)
echo $psp
}

killproc()
{
pkill -9 $(lsof -t -i:$1)
echo "Killed by port $1"
}


starttmux()
{
xauth=$1
        tmux new -s $xauth -d
        tmux send-keys -t $xauth:0 "for (( ; ; )) ; do sleep 3s; ((disp ^= 1)) ; /usr/bin/x11vnc -display :\$disp -auth $xauth -rfbauth /etc/x11vnc.pass -shared -forever ; done" Enter

}

#echo $(getpname)
start() {
for (( ; ; )) ; do

#echo $psp
xauths=$(getxauths)
for xauth in $xauths ; do
xauth="$xauth" | xargs
if [[ ${xauth} != *"-auth"* ]];then
            unset tsessions
            tsessions=($(tmux list-sessions -F '#{session_name}'))

echo "tessions is " ${tsessions[@]} 

echo "xauth is " ${xauth}
        if [[ ! " ${tsessions[@]} " =~ " ${xauth} " ]]; then
starttmux $xauth


psp=$(getpname 5900)
echo $psp | grep -E -o "(-auth)(.*)(Xauth)[a-zA-Z]+" | (while IFS= read -r xold
do
sessionname=$(echo ${xold#"-auth"} | xargs)
#tmux kill-session -t "$sessionname"
        if [[ ! " ${tsessions[@]} " =~ " ${xauth} " ]]; then
            if [[ $psp == *"user/125"*  ]] ; then killproc 5900 ; tmux kill-session -t "$sessionname"  ; echo "session name is $sessionname" ;
             fi ; else starttmux $xauth ; sleep 30s ; fi
done)

        fi

fi


done

sleep 3s
done
}
start
EOT

chmod u+x $script
sed -i -e 's/WaylandEnable=true/WaylandEnable=false/g' /etc/gdm3/custom.conf 
sed -i -e 's/#WaylandEnable=false/WaylandEnable=false/g' /etc/gdm3/custom.conf 

systemctl daemon-reload
systemctl enable x11vnc.timer
systemctl stop x11vnc.service
systemctl disable x11vnc.service
systemctl restart x11vnc.timer

相关内容