Witam wszystkich,
W Internecie jest wiele artykułów na temat tego jak skonfigurować zdalne połączenie z istniejącą sesją Xorg przez x11vnc, ale nigdzie nie znalazłem jak wyłączyć lokalny monitor i wejście, aby zrobił to każdy, kto siedzi obok zdalnego komputera nie widzi, co robisz i nie naciska przycisków podczas sesji. Poniżej znajduje się moja metoda upodobnienia x11vnc do łączenia się z Windowsem przez RDP.
Powiedzmy, że już wiesz, jak używać x11vnc, jeśli nie, możesz na przykład skorzystać z Google lub przeczytać
Biorąc pod uwagę: uruchamiamy x11nvc, łączymy się z nim z klientem, wszystko działa, ale lokalna konsola komputera jest również dostępna do przeglądania i wprowadzania danych.
Chcemy: wyłącz konsolę lokalną (monitor + klawiatura + mysz), aby nic nie było widoczne ani wprowadzane.
Wyłączenie monitorów
Pierwsze co mi przyszło do głowy to po prostu wyłączyć monitor przez xrandr, na przykład tak:
$ xrandr --output CRT1 --off
ale jednocześnie środowisko okienkowe (mam KDE) zaczyna myśleć, że monitor jest naprawdę wyłączony i zaczyna wyrzucać okna i panele, wszystko się wysuwa i staje się smutne.
Jest ciekawszy sposób, polegający na przełączeniu monitora w stan hibernacji. Możesz to zrobić na przykład w ten sposób:
$ xset dpms force off
ale i tutaj nie wszystko jest gładkie. System wybudza monitor przy pierwszym zdarzeniu. Najprostsza kula w postaci roweru pomaga:
while :
do
xset dpms force off
sleep .5
done
Nie myślałem dalej - leniwy byłem, spełnia swoją funkcję - monitory nic nie pokazują, nawet jeśli naciskam przyciski, ruszam myszką itp.
UPD:
Dzięki
$ xrandr --output CRT1 --brightness 0
Wycięcie wejścia
Aby wyłączyć wejście, użyłem xinput. Po uruchomieniu bez parametrów wyświetla listę urządzeń:
$ 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)]
Urządzenia Wirtualny rdzeń... nie da się tego wyłączyć - wyświetla się błąd, ale resztę można włączyć i wyłączyć, np. w ten sposób można zostać na chwilę bez myszy:
xinput disable 9; sleep 60; xinput enable 9
Gotowe rozwiązanie
W moim przypadku stworzyłem skrypt, który uruchamiam w sesji ssh. Tłumi lokalne dane wejściowe i podnosi serwer x11vnc, a po zakończeniu skryptu wszystko wraca do poprzedniego stanu. W rezultacie otrzymaliśmy 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
wyłącz_lokalną_konsolę:
#!/bin/sh
trap "switch_local_console 1" EXIT
while :
do
switch_local_console 0
sleep 1
done
Właściwie główny skrypt (mam dwa monitory, ustawiam jeden wspólny serwer i po jednym dla każdego monitora).
serwer_vnc:
#!/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 wszystko. Zaloguj się przez ssh i uruchom serwer_vnc, póki żyje mamy dostęp przez vnc i konsola lokalna gaśnie.
Dziękujemy za uwagę, uzupełnienia i ulepszenia są mile widziane.
Źródło: www.habr.com