x11vnc ์‚ฌ์šฉ ์‹œ ๋กœ์ปฌ ์ฝ˜์†” ๋น„ํ™œ์„ฑํ™”

์•ˆ๋…•ํ•˜์‹ญ๋‹ˆ๊นŒ,

x11vnc๋ฅผ ํ†ตํ•ด ๊ธฐ์กด Xorg ์„ธ์…˜์— ๋Œ€ํ•œ ์›๊ฒฉ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ฃผ์ œ์— ๋Œ€ํ•œ ๋งŽ์€ ๊ธฐ์‚ฌ๊ฐ€ ์ธํ„ฐ๋„ท์— ์žˆ์ง€๋งŒ ์›๊ฒฉ ์ปดํ“จํ„ฐ ์˜†์— ์•‰์•„ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ๋กœ์ปฌ ๋ชจ๋‹ˆํ„ฐ ๋ฐ ์ž…๋ ฅ์„ ์–ต์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋ณผ ์ˆ˜ ์—†๊ณ  ์„ธ์…˜์—์„œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ปท ์•„๋ž˜์—๋Š” x11vnc๋ฅผ RDP๋ฅผ ํ†ตํ•ด Windows์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ๊ณผ ๋” ์œ ์‚ฌํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ x11vnc๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ Google์— ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ์˜ˆ๋ฅผ ์ฝ์–ด ๋ณด์„ธ์š”. ์—ฌ๊ธฐ์—.

๊ฐ์•ˆํ•  ๋•Œ : x11nvc๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์™€ ์—ฐ๊ฒฐํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€๋งŒ ์ปดํ“จํ„ฐ์˜ ๋กœ์ปฌ ์ฝ˜์†”์—์„œ๋„ ๋ณด๊ณ  ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์›ํ•ฉ๋‹ˆ๋‹ค: ์•„๋ฌด๊ฒƒ๋„ ๋ณด๊ฑฐ๋‚˜ ์ž…๋ ฅํ•  ์ˆ˜ ์—†๋„๋ก ๋กœ์ปฌ ์ฝ˜์†”(๋ชจ๋‹ˆํ„ฐ + ํ‚ค๋ณด๋“œ + ๋งˆ์šฐ์Šค)์„ ๋„์‹ญ์‹œ์˜ค.

๋ชจ๋‹ˆํ„ฐ ๋„๊ธฐ

๊ฐ€์žฅ ๋จผ์ € ๋– ์˜ค๋ฅธ ๊ฒƒ์€ xrandr์„ ํ†ตํ•ด ๊ฐ„๋‹จํžˆ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ๋„๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ xrandr --output CRT1 --off

๊ทธ๋Ÿฌ๋‚˜ ๋™์‹œ์— ์œˆ๋„์šฐ ํ™˜๊ฒฝ(๋‚˜๋Š” KDE๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค)์€ ๋ชจ๋‹ˆํ„ฐ๊ฐ€ ์ •๋ง๋กœ ๊บผ์ ธ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  ์œˆ๋„์šฐ์™€ ํŒจ๋„์„ ๋˜์ง€๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€์„œ ์Šฌํผ์ง‘๋‹ˆ๋‹ค.
๋ชจ๋‹ˆํ„ฐ๋ฅผ ์ตœ๋Œ€ ์ ˆ์ „ ๋ชจ๋“œ๋กœ ๋ณด๋‚ด๋Š” ๋” ํฅ๋ฏธ๋กœ์šด ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ xset dpms force off

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋„ ๋ชจ๋“  ๊ฒƒ์ด ์ˆœํƒ„ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์€ ์ฒซ ๋ฒˆ์งธ ์ด๋ฒคํŠธ์—์„œ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ๊นจ์›๋‹ˆ๋‹ค. ์ฃผ๊ธฐ ํ˜•ํƒœ์˜ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฒ„ํŒ€๋ชฉ์ด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

while :
do
    xset dpms force off
    sleep .5
done

๋” ์ด์ƒ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ฒŒ์œผ๋ฅด๊ณ  ๋ชฉ์ ์— ๋ถ€ํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ๋งˆ์šฐ์Šค๋ฅผ ์›€์ง์—ฌ๋„ ๋ชจ๋‹ˆํ„ฐ์— ์•„๋ฌด๊ฒƒ๋„ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

UPD :

๊ฐ์‚ฌ ์•„๋งˆ๋ผ์˜ค ๋ฐ๊ธฐ๋ฅผ 0์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์žฅ์น˜ ๊ฐ€์ƒ ์ฝ”์–ด... ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜์ง€๋งŒ ๋‚˜๋จธ์ง€๋Š” ์ผœ๊ณ  ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋งˆ์šฐ์Šค ์—†์ด ์ž ์‹œ ๋™์•ˆ ๋ฐฉ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

xinput disable 9; sleep 60; xinput enable 9

๊ธฐ์„ฑํ’ˆ ์†”๋ฃจ์…˜

๋‚ด ๊ฒฝ์šฐ์—๋Š” SSH ์„ธ์…˜์—์„œ ์‹คํ–‰ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ž…๋ ฅ์„ ์–ต์ œํ•˜๊ณ  x11vnc ์„œ๋ฒ„๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉฐ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์„ธ ๊ฐœ์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๊ทธ๊ฒƒ๋“ค์ด ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์Šค์œ„์น˜_๋กœ์ปฌ_์ฝ˜์†”:

#!/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_์„œ๋ฒ„:

#!/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_์„œ๋ฒ„, ๊ทธ๊ฐ€ ์‚ด์•„์žˆ๋Š” ๋™์•ˆ ์šฐ๋ฆฌ๋Š” vnc๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ณ  ๋กœ์ปฌ ์ฝ˜์†”์€ ๊บผ์ง‘๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์˜ ๊ด€์‹ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฌ๋ฉฐ, ์ถ”๊ฐ€ ๋ฐ ๊ฐœ์„ ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€