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 .
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 offaber 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
doneDamit 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 ein weiterer Weg, um die Helligkeit auf null zu drehen:
$ xrandr --output CRT1 --brightness 0Eingabe 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 9Fertige 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
doneEigentlich 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 x11vncDas 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
