Deaktivieren Sie die lokale Konsole, wenn Sie x11vnc verwenden

Hallo an alle,

Es gibt viele Artikel im Internet zum Thema, wie man über x11vnc eine Remote-Verbindung zu einer bestehenden Sie sehen nicht, was Sie gerade tun, und haben in Ihrer Sitzung keine Tasten gedrückt. Nachfolgend finden Sie meine Methode, mit der ich x11vnc einer Verbindung zu Windows über RDP ähnlicher mache.

Nehmen wir also an, Sie wissen bereits, wie man x11vnc verwendet. Wenn nicht, können Sie beispielsweise googeln oder lesen hier.

Mai: Wir starten x11nvc, verbinden uns mit dem Client, alles funktioniert, aber die lokale Konsole des Computers steht auch zur Anzeige und Eingabe zur Verfügung.

Wir wollen: Schalten Sie die lokale Konsole (Monitor + Tastatur + Maus) aus, damit nichts gesehen oder eingegeben werden kann.

Ausschalten der Monitore

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

$ xrandr --output CRT1 --off

aber gleichzeitig beginnt die Fensterumgebung (ich habe KDE) zu denken, dass der Monitor wirklich ausgeschaltet ist und fängt an, Fenster und Panels zu werfen, alles bewegt sich heraus und wird traurig.
Es gibt eine interessantere Möglichkeit, den Monitor in den Ruhezustand zu versetzen. Dies können Sie beispielsweise so tun:

$ xset dpms force off

aber auch hier läuft nicht alles glatt. Das System weckt den Monitor beim ersten Ereignis. Die einfachste Krücke in Form eines Fahrrads hilft:

while :
do
    xset dpms force off
    sleep .5
done

Ich habe nicht weiter nachgedacht – ich war faul, es erfüllt seinen Zweck – die Monitore zeigen nichts, auch wenn ich die Tasten drücke, die Maus bewege usw.

UPD:

Danke amarao für eine andere Methode, bei der die Helligkeit auf Null gestellt wird:

$ xrandr --output CRT1 --brightness 0

Die Eingabe wegschneiden

Um die Eingabe zu deaktivieren, habe ich xinput verwendet. Beim Start ohne Parameter wird eine Geräteliste angezeigt:

$ xinput
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Laser Mouse                  id=9    [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ Sleep Button                              id=8    [slave  keyboard (3)]
    ↳ USB 2.0 Camera: HD 720P Webcam            id=10   [slave  keyboard (3)]
    ↳ HID 041e:30d3                             id=11   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=12   [slave  keyboard (3)]

Geräte Virtueller Kern... Sie können es nicht deaktivieren – es wird ein Fehler angezeigt, aber der Rest kann ein- und ausgeschaltet werden. So können Sie beispielsweise eine Minute lang ohne Maus bleiben:

xinput disable 9; sleep 60; xinput enable 9

Vorgefertigte Lösung

Für meinen Fall habe ich ein Skript erstellt, das ich in einer SSH-Sitzung ausführe. Es unterdrückt lokale Eingaben und ruft den x11vnc-Server hoch, und nach Abschluss des Skripts kehrt alles zurück, wie es war. Als Ergebnis haben wir drei Skripte erhalten, 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 richte einen gemeinsamen Server und einen für jeden Monitor ein).

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. Per SSH anmelden und starten vnc_server, solange er lebt, haben wir Zugriff über VNC und die lokale Konsole ist gelöscht.

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

Source: habr.com

Kommentar hinzufügen