Wyłączamy lokalną konsolę przy użyciu x11vnc

Cześć wszystkim,

w sieci jest wiele artykułów na temat, jak skonfigurować zdalne połączenie z istniejącą sesją Xorg przez x11vnc, ale nigdzie nie znalazłem, jak przy tym wyłączyć lokalny monitor i wejście, żeby nikt, kto siedzi obok zdalnego komputera, nie widział, co robisz i nie wciskał przycisków w twojej sesji. Poniżej przedstawiam mój sposób, jak sprawić, żeby x11vnc bardziej przypominał połączenie z Windows przez RDP.

Załóżmy, że już umiesz korzystać z x11vnc, jeśli nie — można to znaleźć w internecie lub poczytać na przykład tutaj.

Dane: uruchamiamy x11nvc, łączymy się z nim klientem, wszystko działa, ale lokalna konsola komputera jest również dostępna do podglądu i wprowadzania.

Chcemy: wyłączyć lokalną konsolę (monitor + klawiatura + mysz), tak aby nic nie można było zobaczyć ani wpisać.

Wyłączamy monitory

Pierwsze, co przyszło mi do głowy, to po prostu wyłączyć monitor za pomocą xrandr, na przykład tak:

$ xrandr --output CRT1 --off

ale w tym przypadku środowisko okienne (mam KDE) zaczyna myśleć, że monitor jest rzeczywiście wyłączony i zaczyna przenosić okna i paski, wszystko się przestawia i staje się smutne.
Jest bardziej interesujący sposób, polegający na tym, aby wysłać monitor w tryb uśpienia, co można zrobić na przykład tak:

$ xset dpms force off

ale i tu nie wszystko jest gładkie. System budzi monitor przy pierwszym zdarzeniu. Pomaga najprostszy sposób w postaci pętli:

while :
do
    xset dpms force off
    sleep .5
done

Dalej nie myślałem – było mi leniwie, spełnia swoją rolę – monitory nic nie pokazują, nawet jeśli wciskasz przyciski, poruszasz myszką itd.

UPD:

Dziękuję amarao za jeszcze jeden sposób na zawężenie do zera jasności:

$ xrandr --output CRT1 --brightness 0

Wyłączamy wejście

Do wyłączenia wejścia użyłem xinput. Przy uruchomieniu bez parametrów wyświetla listę urządzeń:

$ xinput
⎡ Wirtualny wskaźnik rdzeniowy                          id=2    [główny wskaźnik  (3)]
⎜   ↳ Wirtualny wskaźnik XTEST                           id=4    [niewolnik  wskaźnik  (2)]
⎜   ↳ Myszy Laserowej USB Logitech                        id=9    [niewolnik  wskaźnik  (2)]
⎣ Wirtualna klawiatura rdzeniowa                         id=3    [główna klawiatura (2)]
    ↳ Wirtualna klawiatura XTEST                           id=5    [niewolnik  klawiatura (3)]
    ↳ Przycisk zasilania                                  id=6    [niewolnik  klawiatura (3)]
    ↳ Przycisk zasilania                                  id=7    [niewolnik  klawiatura (3)]
    ↳ Przycisk uśpienia                                  id=8    [niewolnik  klawiatura (3)]
    ↳ Kamera USB 2.0: HD 720P                      id=10   [niewolnik  klawiatura (3)]
    ↳ HID 041e:30d3                                   id=11   [niewolnik  klawiatura (3)]
    ↳ Klawiatura AT Zinterpretowana Zestaw 2          id=12   [niewolnik  klawiatura (3)]

Urządzenia Wirtualny rdzeń… nie można wyłączyć — pojawia się błąd, za to pozostałe można włączać i wyłączać, na przykład można zostać bez myszki przez minutę:

xinput disable 9; sleep 60; xinput enable 9

Gotowe rozwiązanie

Dla swojego przypadku napisałem skrypt, który uruchamiam w sesji ssh. Tłumi lokalne wejście i uruchamia serwer x11vnc, a po zakończeniu skryptu wszystko wraca do stanu poprzedniego. W rezultacie powstały trzy skrypty, oto one (zaktualizowane).

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

Właśnie główny skrypt (mam dwa monitory, uruchamiam jeden wspólny serwer i po jednym na każdy 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

Właściwie to wszystko. Wchodzimy przez ssh, uruchamiamy vnc_server, dopóki jest aktywny, mamy dostęp przez vnc i wyłączoną lokalną konsolę.

Dziękuję za uwagę, dodatkowe uwagi i usprawnienia są mile widziane.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster