Как стать автором
Поиск
Написать публикацию
Обновить

Отключаем локальную консоль при использовании x11vnc

Время на прочтение3 мин
Количество просмотров4.2K
Всем привет,

на просторах интернетов много статей на тему как настроить удаленное подключение к существующей сессии Xorg через x11vnc, но я нигде не нашел, как при этом придавить локальный монитор и ввод, чтобы любой, кто сидит рядом с удаленным компом, не смотрел что вы делаете и не нажимал кнопочки в вашей сессии. Под катом мой способ, как сделать x11vnc более похожим на подключение к винде по RDP.

Итак, допустим, вы уже умеете пользоваться x11vnc, если нет — можно погуглить или почитать например тут.

Дано: запускаем x11nvc, подключаемся к нему клиентом, все работает, но локальная консоль компа тоже доступна для просмотра и ввода.

Хотим: вырубить локальную консоль (монитор + клава + мышка) так, чтобы ничего нельзя было увидеть и ввести.

Вырубаем мониторы


Первое, что пришло в голову, было просто отрубить монитор через xrandr например так:

$ xrandr --output CRT1 --off

но при этом оконная среда (у меня KDE) начинает думать, что монитор реально отключен и начинает перекидывать окна и панельки, все съезжает и становится грустно.
Есть более интересный способ, заключающийся в том, чтобы отправить монитор в спячку, сделать это можно например так:

$ xset dpms force off

но тут тоже не все гладко. Система будит монитор при первом же событии. Помогает простейший костыль в виде цикла:

while :
do
    xset dpms force off
    sleep .5
done

Дальше я думать не стал — было лень, оно выполняет свою цель — мониторы ничего не показывают, даже если давить кнопки, шерудить мышкой и т.д.

UPD:

Спасибо amarao за еще один способ с выкручиванием в ноль яркости:
$ xrandr --output CRT1 --brightness 0


Вырубаем ввод


Для отключения ввода я использовал xinput. При запуске без параметров он выводит список девайсов:

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

Девайсы Virtual core... отключить нельзя — выдается ошибка, зато остальные можно включать и отключать, например вот так можно остаться на минуту без мышки:

xinput disable 9; sleep 60; xinput enable 9

Готовое решение


Для своего случая я сделал скрипт, который запускаю в ssh сессии. Он глушит локальный ввод и поднимает x11vnc сервер, а по завершению скрипта все возвращает как было. В итоге получилось три скрипта, вот они (обновленные).

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

Собственно, главный скрипт (у меня два монитора, я поднимаю один общий сервер и по одному на каждый монитор).

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

Собственно все. Заходим по ssh, запускаем vnc_server, пока он жив, имеем доступ по vnc и потушенную локальную консоль.

Спасибо за внимание, дополнения и улучшения приветствуются.
Теги:
Хабы:
Всего голосов 10: ↑10 и ↓0+10
Комментарии14

Публикации

Ближайшие события