Ahojte všetci,
Na internete je veľa článkov na tému, ako nastaviť vzdialené pripojenie k existujúcej relácii Xorg cez x11vnc, ale nikde som nenašiel, ako potlačiť lokálny monitor a vstup tak, aby to urobil každý, kto sedí vedľa vzdialeného počítača nevidíte, čo robíte, a nestláčate tlačidlá počas relácie. Pod rezom je moja metóda, ako urobiť x11vnc viac podobným pripojeniu k Windowsu cez RDP.
Takže povedzme, že už viete používať x11vnc, ak nie, môžete si vygoogliť alebo prečítať napr.
Vzhľadom na to: spustíme x11nvc, pripojíme sa k nemu s klientom, všetko funguje, ale na prezeranie a vstup je k dispozícii aj lokálna konzola počítača.
Chceme: vypnite lokálnu konzolu (monitor + klávesnica + myš), aby nebolo nič vidieť ani zadávať.
Vypnutie monitorov
Prvé, čo ma napadlo, bolo jednoducho vypnúť monitor cez xrandr, napríklad takto:
$ xrandr --output CRT1 --off
ale zaroven si okenovacie prostredie (mam KDE) zacne mysliet, ze monitor je naozaj vypnuty a zacne hadzat okna a panely, vsetko sa odstahuje a smutno.
Existuje zaujímavejší spôsob, ktorým je prepnutie monitora do hibernácie, môžete to urobiť napríklad takto:
$ xset dpms force off
ale ani tu nie je všetko hladké. Systém prebudí monitor pri prvej udalosti. Najjednoduchšia barla vo forme cyklu pomáha:
while :
do
xset dpms force off
sleep .5
done
Ďalej som nerozmýšľal - bol som lenivý, plní to svoj účel - monitory nič nezobrazujú, aj keď stlačím tlačidlá, pohnem myšou atď.
UPS:
Vďaka
$ xrandr --output CRT1 --brightness 0
Vystrihnutie vstupu
Na zakázanie vstupu som použil xinput. Pri spustení bez parametrov sa zobrazí zoznam zariadení:
$ 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)]
Zariadenia Virtuálne jadro... nemôžete ho vypnúť - zobrazí sa chyba, ale zvyšok sa dá zapnúť a vypnúť, napríklad takto môžete zostať minútu bez myši:
xinput disable 9; sleep 60; xinput enable 9
Riešenie na kľúč
V mojom prípade som vytvoril skript, ktorý spustím v relácii ssh. Potlačí lokálny vstup a zdvihne server x11vnc a po dokončení skriptu sa všetko vráti tak, ako bolo. V dôsledku toho sme dostali tri skripty, tu sú (aktualizované).
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
Vlastne hlavný skript (mám dva monitory, nastavil som jeden spoločný server a jeden pre každý 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 x11vnc
To je všetko. Prihláste sa cez ssh a spustite vnc_server, kým je nažive, máme prístup cez vnc a lokálna konzola je zhasnutá.
Ďakujem za pozornosť, doplnky a vylepšenia sú vítané.
Zdroj: hab.com