Vnc

帶有 GDM 登錄的 VNC 伺服器

  • June 2, 2022

我想在 Debian 機器上設置 VNC 伺服器以作為服務執行,這樣我就可以打開遠端機器並訪問它,而無需親自到場。

一種選擇是在使用者匯流排中設置它:

$ systemctl --user cat vnc.service
# /home/stew/.config/systemd/user/vnc.service
[Unit]
Description=VNC Server
After=default.target

[Service]
ExecStart=x11vnc -nevershared -forever -nopw

[Install]
WantedBy=default.target

gdm3這可行,但仍然需要我親自坐在終端上登錄XAUTHORITY才能進行任何遠端工作。如果我ssh在使用 登錄之前登錄gdm3,則服務失敗。AutomaticLoginEnable=True我通過使用和AutomaticLogin=stewin來解決這個問題/etc/gdm3/daemon.conf

相反,我希望能夠使用 VNC 而無需先以特定使用者身份登錄(類似於 RDP)。我認為最好的方法是使用-nopw螢幕gdm3

我試圖這樣做:

$ systemctl cat vnc.service
# /etc/systemd/system/vnc.service
[Unit]
Description=VNC Service (system-wide)
After=graphical.target

[Service]
ExecStart=x11vnc -auth /run/user/116/gdm/Xauthority -display :0 -nopw

[Install]
WantedBy=graphical.target

我使用此命令找到了 XAUTHORITY 路徑,該路徑顯示該路徑歸 UID 116(系統使用者:)所有Debian-gdm

stew ~ $ ps wwwwaux | grep auth
root        1033  0.1  0.5 189548 63596 tty1     Sl+  14:32   0:00 /usr/lib/xorg/Xorg vt1 -displayfd 3 -auth /run/user/116/gdm/Xauthority -nolisten tcp -background none -noreset -keeptty -novtswitch -verbose 3

我還需要設置WaylandEnable=false/etc/gdm3/daemon.conf因為 VNC 似乎不適用於 Wayland。

起初,這似乎運作良好。我得到gdm登錄螢幕。但是,當我嘗試以使用者身份登錄時,auth會轉移到另一個使用者並且我已斷開連接。

有沒有辦法設置 VNC 以便我可以通過 gdm 登錄?

這不是無縫的,但這裡有一個解決方案。

我們從執行 VNC 並將我們連接到 GDM 登錄螢幕的服務開始

$ systemctl cat vnc-gdm.service 
# /etc/systemd/system/vnc-gdm.service
[Unit]
Description=VNC Server (gdm)
After=graphical.target

[Service]
ExecStart=bash -c 'x11vnc -auth /run/user/$(id -u Debian-gdm)/gdm/Xauthority -display :0 -nopw'
Restart=on-failure
RestartSec=3

[Install]
WantedBy=graphical.target

然後對於我們想要支持的每個使用者,我們添加另一個 VNC 服務。這將每 2 秒輪詢一次,ExecStartPre=以查看該使用者是否有Xorg實例。發生這種情況時,它將停止vnc-gdm.service釋放埠5900,以便它自己的實例x11vnc可以綁定到它。

然後它執行x11vnc

$ systemctl cat vnc-stew.service
# /etc/systemd/system/vnc-stew.service
[Unit]
Description=VNC Server (stew)
After=graphical.target

[Service]
User=stew
ExecStartPre=sh -c 'while ! pgrep -U stew Xorg; do sleep 2; done'
ExecStartPre=+systemctl stop vnc-gdm.service
ExecStart=x11vnc -many -shared -display :1 -auth /home/stew/.Xauthority -rfbauth /home/stew/.vnc/passwd
Restart=on-failure
RestartSec=3

[Install]
WantedBy=graphical.target

我說這不是無縫的,因為一旦你通過 gdm 登錄:你的連接就會被切斷,你需要重新連接到你的新顯示器。我也沒有對多個使用者進行過測試。另外,如果我退出 X-session,我很確定我將無法重新進入。

我也不喜歡我們systemctl stopExecStartPre=.

引用自:https://unix.stackexchange.com/questions/644886