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 .
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 offale 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
doneDalej 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ę za jeszcze jeden sposób na zawężenie do zera jasności:
$ xrandr --output CRT1 --brightness 0Wyłą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 9Gotowe 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
doneWł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 x11vncWł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
