Die lokale Konsole wird bei der Verwendung von x11vnc deaktiviert

Hallo zusammen,

Im Internet gibt es viele Artikel darüber, wie man eine Remote-Verbindung zu einer bestehenden Xorg-Sitzung über x11vnc einrichtet, aber ich habe nirgendwo gefunden, wie man dabei den lokalen Monitor und die Eingabegeräte deaktiviert, damit niemand, der neben dem Remote-Computer sitzt, sehen oder eingreifen kann. Unten ist meine Methode, wie man x11vnc ähnlicher zu einer Verbindung unter Windows über RDP macht.

Angenommen, Sie wissen bereits, wie man x11vnc verwendet. Wenn nicht, können Sie googeln oder beispielsweise lesen: hier.

Gegeben: Wir starten x11vnc, verbinden uns mit dem Client, alles funktioniert, aber die lokale Konsole des Computers ist ebenfalls zur Ansicht und Eingabe verfügbar.

Wir wollen: Die lokale Konsole (Monitor + Tastatur + Maus) so deaktivieren, dass nichts gesehen und eingegeben werden kann.

Monitore ausschalten

Das erste, was mir in den Sinn kam, war, den Monitor einfach über xrandr auszuschalten, zum Beispiel so:

$ xrandr --output CRT1 --off

Aber dabei beginnt die Desktop-Umgebung (bei mir KDE) zu glauben, dass der Monitor tatsächlich ausgeschaltet ist, und beginnt, Fenster und Panels neu anzuordnen, alles verschiebt sich und wird traurig.
Es gibt eine interessantere Methode, die darin besteht, den Monitor in den Ruhemodus zu versetzen, dies kann man beispielsweise so erreichen:

$ xset dpms force off

Aber auch hier läuft nicht alles glatt. Das System weckt den Monitor bei jedem Ereignis. Ein einfacher Workaround in Form einer Schleife hilft:

while :
do
    xset dpms force off
    sleep .5
done

Darüber hinaus wollte ich nicht mehr nachdenken – es war mir zu mühsam, es erfüllt seinen Zweck – die Monitore zeigen nichts an, selbst wenn man Tasten drückt, mit der Maus herumfährt usw.

UPD:

Danke amarao für einen weiteren Weg, die Helligkeit auf Null zu drehen:

$ xrandr --output CRT1 --brightness 0

Eingabe deaktivieren

Um die Eingabe zu deaktivieren, habe ich xinput verwendet. Wenn man es ohne Parameter startet, gibt es eine Liste der Geräte aus:

$ xinput
⎡ Virtueller Kernzeiger                          id=2    [master pointer  (3)]
⎜   ↳ Virtueller Kern XTEST-Zeiger               id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Laser Maus                     id=9    [slave  pointer  (2)]
⎣ Virtuelle Kerntastatur                        id=3    [master keyboard (2)]
    ↳ Virtuelle Kern XTEST-Tastatur              id=5    [slave  keyboard (3)]
    ↳ Ein/Aus-Taste                               id=6    [slave  keyboard (3)]
    ↳ Ein/Aus-Taste                               id=7    [slave  keyboard (3)]
    ↳ Ruhemodus-Taste                             id=8    [slave  keyboard (3)]
    ↳ USB 2.0 Kamera: HD 720P Webcam             id=10   [slave  keyboard (3)]
    ↳ HID 041e:30d3                              id=11   [slave  keyboard (3)]
    ↳ AT Übersetztes Set 2 Tastatur              id=12   [slave  keyboard (3)]

Geräte Virtueller Kern… Es kann nicht deaktiviert werden — es wird ein Fehler ausgegeben, aber die anderen können ein- und ausgeschaltet werden, zum Beispiel so kann man eine Minute ohne Maus bleiben:

xinput disable 9; sleep 60; xinput enable 9

Fertige Lösung

Für meinen Fall habe ich ein Skript erstellt, das ich in einer ssh-Sitzung starte. Es unterdrückt die lokale Eingabe und startet den x11vnc-Server, und nach Beendigung des Skripts wird alles wieder sohergestellt wie vorher. Am Ende habe ich drei Skripte, hier sind sie (aktualisiert).

switch_local_console:

#!/bin/sh

case $1 in
    1|on)
    desired=1
    ;;
    0|off)
    desired=0
    ;;
    *)
    echo "USAGE: $0 0|1|on|off"
    exit 1
    ;;
esac

keyboards=`xinput | grep -v "XTEST" | grep "slave  keyboard" | sed -re 's/^.*sid=([0-9]+)s.*$/1/'`
mouses=`xinput | grep -v "XTEST" | grep "slave  pointer" | sed -re 's/^.*sid=([0-9]+)s.*$/1/'`
monitors=`xrandr | grep " connected" | sed -re 's/^(.+) connected.*$/1/'`

for device in $mouses
do
    xinput --set-prop $device "Device Enabled" $desired
done

for device in $keyboards
do
    xinput --set-prop $device "Device Enabled" $desired
done

for device in $monitors
do
    xrandr --output $device --brightness $desired
done

disable_local_console:

#!/bin/sh

trap "switch_local_console 1" EXIT

while :
do
    switch_local_console 0
    sleep 1
done

Eigentlich das Hauptskript (ich habe zwei Monitore, ich starte einen gemeinsamen Server und einen für jeden Monitor).

vnc_server:

#!/bin/bash

[[ ":0" == "$DISPLAY" ]] && echo "Should be run under ssh session" && exit 1

export DISPLAY=:0

killall x11vnc

rm -r /tmp/x11vnc
mkdir -p /tmp/x11vnc/{5900,5901,5902}

params="-fixscreen V=5 -forever -usepw -noxkb -noxdamage -repeat -nevershared"

echo "Starting VNC servers"

x11vnc -rfbport 5900 $params 2>&1 | tinylog -k 2 -r /tmp/x11vnc/5900 &
x11vnc -rfbport 5901 $params -clip 1920x1080+0+0 2>&1 | tinylog -k 2 -r /tmp/x11vnc/5901 &
x11vnc -rfbport 5902 $params -clip 1920x1080+1920+0 2>&1 | tinylog -k 2 -r /tmp/x11vnc/5902 &

echo "Waiting VNC servers"
while [ `ps afx | grep -c "x11vnc -rfbport"` -ne "4" ]
do
    sleep .5
done

echo "Disabling local console"
disable_local_console

echo "Killing VNC servers"
killall x11vnc

Das ist alles. Wir gehen über ssh rein, starten vnc_server, solange er lebt, haben wir Zugriff über vnc und eine deaktivierte lokale Konsole.

Danke für die Aufmerksamkeit, Ergänzungen und Verbesserungen sind willkommen.

Quelle: habr.com

60GB SSD 8Gb DDR4