ื“ื™ืกื™ื™ื‘ืึทืœ ื“ื™ ื”ื™ื’ืข ืงืึทื ืกืึธื•ืœ ื•ื•ืขืŸ ืื™ืจ ื ื•ืฆืŸ x11vnc

ื”ื™ ืึทืœืขืžืขืŸ

ืขืก ื–ืขื ืขืŸ ืคื™ืœืข ืึทืจื˜ื™ืงืœืขืŸ ืื•ื™ืฃ ื“ืขืจ ืื™ื ื˜ืขืจื ืขืฅ ืื•ื™ืฃ ื“ืขืจ ื˜ืขืžืข ืคื•ืŸ โ€‹โ€‹ื•ื•ื™ ืฆื• ืฉื˜ืขืœืŸ ืึทืจื•ื™ืฃ ืึท ื•ื•ื™ื™ึทื˜ ืคึฟืึทืจื‘ื™ื ื“ื•ื ื’ ืฆื• ืึท ื™ื’ื–ื™ืกื˜ื™ื ื’ Xorg ืกืขืกื™ืข ื“ื•ืจืš x11vnc, ืึธื‘ืขืจ ืื™ืš ื”ืึธื‘ืŸ ื ื™ื˜ ื’ืขืคึฟื•ื ืขืŸ ืขืจื’ืขืฅ ื•ื•ื™ ืฆื• ืคืึทืจืฉื˜ื™ืงืŸ ื“ื™ ื”ื™ื’ืข ืžืึธื ื™ื˜ืึธืจ ืื•ืŸ ืึทืจื™ื™ึทื ืฉืจื™ื™ึทื‘ ืึทื–ื•ื™ ืึทื– ื•ื•ืขืจ ืขืก ื™ื– ื–ื™ืฆืŸ ื•ื•ื™ื™ึทื˜ืขืจ ืฆื• ื“ื™ ื•ื•ื™ื™ึทื˜ ืงืึธืžืคึผื™ื•ื˜ืขืจ. ื ื™ื˜ ื–ืขืŸ ื•ื•ืึธืก ืื™ืจ ื˜ืึธืŸ ืื•ืŸ ื ื™ืฉื˜ ื’ืขื“ืจื™ืงื˜ ืงื ืขืคึผืœืขืš ืื™ืŸ ื“ื™ื™ืŸ ืกืขืกื™ืข. ื•ื ื˜ืขืจ ื“ืขืจ ื“ื•ืจื›ืฉื ื™ื˜ ืื™ื– ืžื™ื™ืŸ ืื•ืคึฟืŸ ืฆื• ืžืึทื›ืŸ x11vnc ืžืขืจ ืขื ืœืขืš ืฆื• ืงืึทื ืขืงื˜ื™ื ื’ ืฆื• Windows ื“ื•ืจืš RDP.

ืึทื–ื•ื™, ืœืึธื–ืŸ ืก ื–ืึธื’ืŸ ืื™ืจ ืฉื•ื™ืŸ ื•ื•ื™ืกืŸ ื•ื•ื™ ืฆื• ื ื•ืฆืŸ x11vnc, ืื•ื™ื‘ ื ื™ืฉื˜, ืื™ืจ ืงืขื ืขืŸ ื’ื•ื’ืœ ืึธื“ืขืจ ืœื™ื™ืขื ืขืŸ ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ ื“ืึธ.

Given: ืžื™ืจ ืงืึทื˜ืขืจ 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
โŽก 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)]

ื“ื™ื•ื•ื™ื™ืกืึทื– ื•ื•ื™ืจื˜ื•ืึทืœ ื”ืึทืจืฅ ... ืื™ืจ ืงืขื ืขืŸ ื ื™ืฉื˜ ื“ื™ืกื™ื™ื‘ืึทืœ ืขืก - ืึท ื˜ืขื•ืช ืื™ื– ื’ืขื•ื•ื™ื–ืŸ, ืึธื‘ืขืจ ื“ื™ ืžื ื•ื—ื” ืงืขื ืขืŸ ื–ื™ื™ืŸ ืื•ื™ืกื’ืขื“ืจื™ื™ื˜ ืื•ื™ืฃ ืื•ืŸ ืึทื•ื•ืขืง, ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ื“ืึธืก ืื™ื– ื•ื•ื™ ืื™ืจ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืœื™ื ืงืก ืึธืŸ ืึท ืžื•ื™ื– ืคึฟืึทืจ ืึท ืžื™ื ื•ื˜:

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

ื“ื™ืกืึทื‘ืœืข_ืœืึธืงืึทืœ_ืงืึทื ืกืึธื•ืœ:

#!/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, ื‘ืฉืขืช ืขืจ ืื™ื– ืœืขื‘ืขื“ื™ืง, ืžื™ืจ ื”ืึธื‘ืŸ ืฆื•ื˜ืจื™ื˜ ื“ื•ืจืš ื•ื ืง ืื•ืŸ ื“ื™ ื”ื™ื’ืข ืงืึทื ืกืึธื•ืœ ืื™ื– ื™ืงืกื˜ื™ื ื’ื’ื•ื•ื™ืฉื˜.

ื“ืื ืง ืื™ืจ ืคึฟืึทืจ ื“ื™ื™ืŸ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ื˜, ืึทื“ื™ืฉืึทื ื– ืื•ืŸ ื™ืžืคึผืจื•ื•ื•ืžืึทื ืฅ ื–ืขื ืขืŸ ื‘ืึทื’ืจื™ืกืŸ.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’