Hallo allemaal,
op het internet zijn er veel artikelen over hoe je een remote verbinding kunt opzetten met een bestaande Xorg-sessie via x11vnc, maar ik heb nergens gevonden hoe je tegelijkertijd het lokale scherm en invoer kunt uitschakelen, zodat iedereen die naast de remote computer zit, niet kan zien wat je doet of toetsen kan indrukken in jouw sessie. Hieronder zie je mijn manier om x11vnc meer op een verbinding met Windows via RDP te laten lijken.
Laten we aannemen dat je al weet hoe je x11vnc gebruikt; zo niet, je kunt het opzoeken of bijvoorbeeld lezen over .
Gegeven: we starten x11vnc, verbinden er met een client mee, alles werkt, maar de lokale console van de computer is ook toegankelijk voor bekijken en invoer.
We willen: schakel de lokale console (scherm + toetsenbord + muis) uit, zodat er niets zichtbaar of invoerbaar is.
Schakel de monitoren uit
Het eerste wat in me opkwam, was gewoon de monitor uit te schakelen via xrandr, bijvoorbeeld zo:
$ xrandr --output CRT1 --off maar hierdoor denkt mijn desktopomgeving (ik gebruik KDE) dat de monitor echt is uitgeschakeld en begint het vensters en panelen te verplaatsen, alles verschuift en wordt triest.
Er is een interessantere manier, namelijk door de monitor in de slaapstand te zetten, en dat kan bijvoorbeeld zo:
$ xset dpms force offmaar ook hier is niet alles perfect. Het systeem wekt de monitor weer bij de eerste gebeurtenis. Een simpele hack helpt in de vorm van een loop:
while :
do
xset dpms force off
sleep .5
doneDaar hoefde ik niet verder over na te denken — ik had er geen zin in, het bereikt zijn doel — de monitoren tonen niets, zelfs niet als je op knoppen drukt, de muis beweegt, enz.
UPD:
Dank voor nog een manier om de helderheid tot nul te verminderen:
$ xrandr --output CRT1 --brightness 0Schakel invoer uit
Om de invoer uit te schakelen heb ik xinput gebruikt. Bij het starten zonder parameters toont het een lijst van apparaten:
$ 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)]Apparaten Virtual core… je kunt niet uitschakelen — er verschijnt een foutmelding, maar de andere kunnen worden in- en uitgeschakeld, bijvoorbeeld zo kun je een minuut zonder muis blijven:
xinput disable 9; sleep 60; xinput enable 9Kant-en-klaar oplossing
Voor mijn situatie heb ik een script gemaakt dat ik in een ssh-sessie uitvoer. Het dempt de lokale invoer en start de x11vnc-server, en na het voltooien van het script herstelt het alles weer zoals het was. Uiteindelijk heb ik drie scripts gemaakt, hier zijn ze (geüpdatet).
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
doneEigenlijk het hoofdscript (ik heb twee monitoren, ik start één gezamenlijke server en één voor elke 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 x11vncDat is alles. Laten we via ssh binnenkomen, starten vnc_server, zolang hij actief is, hebben we toegang via vnc en is de lokale console uitgeschakeld.
Bedankt voor uw aandacht, aanvullingen en verbeteringen zijn welkom.
Bron: habr.com
