Onemogočite lokalno konzolo, ko uporabljate x11vnc

Pozdravljeni vsi,

Na internetu je veliko člankov na temo, kako nastaviti oddaljeno povezavo z obstoječo sejo Xorg prek x11vnc, vendar nikjer nisem našel, kako onemogočiti lokalni monitor in vnos, tako da bi kdorkoli, ki sedi poleg oddaljenega računalnika, ne vidi, kaj počnete, in ne pritiska gumbov v vaši seji. Pod izrezom je moja metoda za izdelavo x11vnc bolj podobnega povezovanju z Windows prek RDP.

Torej, recimo, da že znate uporabljati x11vnc, če ne, lahko poguglate ali preberete npr. tukaj.

Glede na: zaženemo x11nvc, se povežemo z odjemalcem, vse deluje, vendar je na voljo tudi lokalna konzola računalnika za ogled in vnos.

Želimo: izklopi lokalno konzolo (monitor + tipkovnica + miška), da se nič ne vidi ali vnese.

Izklop monitorjev

Prva stvar, ki mi je prišla na misel, je bila preprosto izklop monitorja prek xrandrja, na primer tako:

$ xrandr --output CRT1 --off

hkrati pa začne okensko okolje (imam KDE) misliti, da je monitor res izklopljen in začne metati okna in plošče, vse se premakne in postane žalostno.
Obstaja bolj zanimiv način, in sicer pošiljanje monitorja v stanje mirovanja, to lahko storite na primer takole:

$ xset dpms force off

a tudi tu ni vse gladko. Sistem zbudi monitor ob prvem dogodku. Najpreprostejša bergla v obliki cikla pomaga:

while :
do
    xset dpms force off
    sleep .5
done

Nisem več razmišljal - bil sem len, služi svojemu namenu - monitorji ne pokažejo ničesar, tudi če pritiskam gumbe, premikam miško itd.

UPS:

Hvala amarao za drugo metodo z obračanjem svetlosti na nič:

$ xrandr --output CRT1 --brightness 0

Izrezovanje vnosa

Za onemogočanje vnosa sem uporabil xinput. Ko se zažene brez parametrov, prikaže seznam naprav:

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

Naprave Virtualno jedro... ne morete ga onemogočiti - prikaže se napaka, ostalo pa lahko vklopite in izklopite, na primer, tako lahko ostanete brez miške za minuto:

xinput disable 9; sleep 60; xinput enable 9

Rešitev na ključ

Za svoj primer sem naredil skript, ki ga izvajam v seji ssh. Zatre lokalni vnos in dvigne strežnik x11vnc, po zaključku skripta pa se vse vrne, kot je bilo. Kot rezultat smo dobili tri skripte, tukaj so (posodobljene).

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

onemogoči_lokalno_konzolo:

#!/bin/sh

trap "switch_local_console 1" EXIT

while :
do
    switch_local_console 0
    sleep 1
done

Pravzaprav glavna skripta (imam dva monitorja, nastavil sem en skupni strežnik in enega za vsak monitor).

vnc_strežnik:

#!/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 vse. Prijavite se prek ssh in zaženite vnc_strežnik, dokler je živ imamo dostop preko vnc in lokalna konzola ugasne.

Hvala za vašo pozornost, dopolnitve in izboljšave so dobrodošle.

Vir: www.habr.com

Dodaj komentar