Deaktivieren der lokalen Konsole bei Verwendung von x11vnc

Hallo zusammen,

im Internet gibt es viele Artikel darüber, wie man eine Remote-Verbindung zu einer bestehenden Xorg-Sitzung über x11vnc einrichtet. Ich habe jedoch nirgends gefunden, wie man dabei den lokalen Monitor und die Eingabegeräte so deaktiviert, dass niemand, der neben dem entfernten Computer sitzt, sehen kann, was Sie tun, oder Tasten in Ihrer Sitzung drücken kann. Im Folgenden finden Sie meine Methode, um x11vnc ähnlicher zu machen als eine Verbindung zu Windows über RDP.

Angenommen, Sie wissen bereits, wie man x11vnc verwendet. Falls nicht, können Sie zum Beispiel hier.

Gegeben: x11vnc starten, sich mit einem Client verbinden, alles funktioniert, aber die lokale Konsole des Computers ist ebenfalls zum Ansehen und Eingeben verfügbar.

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

Wir schalten die Monitore ab

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

$ xrandr --output CRT1 --off

aber dabei beginnt die Desktop-Umgebung (ich verwende KDE) zu denken, dass der Monitor tatsächlich deaktiviert ist, und fängt an, Fenster und Panels zu verschieben, alles verschiebt sich und es wird traurig.
Es gibt eine interessantere Möglichkeit, den Monitor in den Standby-Modus zu versetzen, beispielsweise so:

$ 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

Damit wollte ich nicht weiter nachdenken – war zu faul, es erfüllt allerdings seinen Zweck – die Monitore zeigen nichts an, selbst wenn man die Tasten drückt oder mit der Maus herumfuchtelt.

UPD:

Danke amarao ein weiterer Weg, um die Helligkeit auf null zu drehen:

$ xrandr --output CRT1 --brightness 0

Eingabe deaktivieren

Zum Deaktivieren der Eingabe habe ich xinput verwendet. Ohne Parameter gibt es eine Liste der Geräte aus:

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

Geräte Virtueller Kern… Kann nicht deaktiviert werden — es tritt ein Fehler auf, aber die anderen können aktiviert und deaktiviert werden, zum Beispiel so kann man für eine Minute ohne Maus auskommen:

xinput disable 9; sleep 60; xinput enable 9

Fertige Lösung

Für meinen Anwendungsfall habe ich ein Skript erstellt, das ich in einer SSH-Sitzung ausführe. Es deaktiviert die lokale Eingabe und startet den x11vnc-Server, und nach Abschluss des Skripts wird alles wieder wie zuvor hergestellt. Am Ende habe ich drei Skripte erstellt, 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 je einen auf jedem 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 loggen uns per SSH ein, starten vnc_server, solange er läuft, haben wir Zugriff über VNC und die lokale Konsole ist deaktiviert.

Vielen Dank für Ihre Aufmerksamkeit, Ergänzungen und Verbesserungen sind willkommen.

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster