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: .
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 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
doneDarü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 für einen weiteren Weg, die Helligkeit auf Null zu drehen:
$ xrandr --output CRT1 --brightness 0Eingabe 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 9Fertige 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
doneEigentlich 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 x11vncDas 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
