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
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
$ 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