Huwag paganahin ang lokal na console kapag gumagamit ng x11vnc

Hello everyone,

Mayroong maraming mga artikulo sa Internet sa paksa kung paano mag-set up ng isang malayuang koneksyon sa isang umiiral na session ng Xorg sa pamamagitan ng x11vnc, ngunit wala akong nakita kahit saan kung paano sugpuin ang lokal na monitor at input upang magawa ng sinumang nakaupo sa tabi ng malayong computer. hindi nakikita kung ano ang iyong ginagawa at hindi pinindot ang mga pindutan sa iyong session. Sa ibaba ng hiwa ay ang aking pamamaraan para sa paggawa ng x11vnc na mas katulad ng pagkonekta sa Windows sa pamamagitan ng RDP.

Kaya, sabihin nating alam mo na kung paano gamitin ang x11vnc, kung hindi, maaari kang mag-google o magbasa halimbawa. dito.

Ibinigay: inilunsad namin ang x11nvc, kumonekta dito sa kliyente, gumagana ang lahat, ngunit ang lokal na console ng computer ay magagamit din para sa pagtingin at pag-input.

Gusto namin: patayin ang local console (monitor + keyboard + mouse) para walang makita o maipasok.

Pinapatay ang mga monitor

Ang unang bagay na pumasok sa isip ay i-off lang ang monitor sa pamamagitan ng xrandr, halimbawa tulad nito:

$ xrandr --output CRT1 --off

ngunit sa parehong oras, ang windowing environment (mayroon akong KDE) ay nagsisimulang isipin na ang monitor ay talagang naka-off at nagsisimulang magtapon ng mga bintana at mga panel, ang lahat ay gumagalaw at nagiging malungkot.
Mayroong isang mas kawili-wiling paraan, na kung saan ay upang ipadala ang monitor sa hibernation, maaari mong gawin ito halimbawa tulad nito:

$ xset dpms force off

ngunit dito rin, hindi lahat ay makinis. Gigisingin ng system ang monitor sa unang kaganapan. Ang pinakasimpleng saklay sa anyo ng isang cycle ay nakakatulong:

while :
do
    xset dpms force off
    sleep .5
done

Hindi na ako nag-isip pa - tamad ako, nagsisilbi itong layunin - walang ipinapakita ang mga monitor, kahit na pinindot ko ang mga pindutan, ilipat ang mouse, atbp.

UPS:

salamat amarao para sa isa pang paraan sa paggawa ng liwanag sa zero:

$ xrandr --output CRT1 --brightness 0

Pinutol namin ang input

Upang hindi paganahin ang input, ginamit ko ang xinput. Kapag inilunsad nang walang mga parameter, nagpapakita ito ng listahan ng mga device:

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

Mga device Virtual core... hindi mo ito maaaring paganahin - ang isang error ay ipinapakita, ngunit ang iba ay maaaring i-on at i-off, halimbawa, ito ay kung paano ka maiiwan nang walang mouse sa loob ng isang minuto:

xinput disable 9; sleep 60; xinput enable 9

Solusyon sa bantay-bilangguan

Para sa aking kaso, gumawa ako ng isang script na pinapatakbo ko sa isang ssh session. Pinipigilan nito ang lokal na input at itinataas ang x11vnc server, at sa pagkumpleto ng script lahat ay bumalik sa dati. Bilang resulta, nakakuha kami ng tatlong script, narito sila (na-update).

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

Sa totoo lang, ang pangunahing script (mayroon akong dalawang monitor, nag-set up ako ng isang karaniwang server at isa para sa bawat 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

Iyon lang. Mag-login sa pamamagitan ng ssh at ilunsad vnc_server, habang siya ay buhay, mayroon kaming access sa pamamagitan ng vnc at ang lokal na console ay pinapatay.

Salamat sa iyong pansin, ang mga karagdagan at pagpapabuti ay malugod na tinatanggap.

Pinagmulan: www.habr.com

Magdagdag ng komento