Stänger av lokal konsol vid användning av x11vnc

Hej alla,

det finns många artiklar på nätet om hur man ställer in fjärranslutning till en befintlig Xorg-session via x11vnc, men jag har aldrig sett hur man kan stänga av den lokala monitorn och inmatningen, så att ingen som sitter bredvid den fjärranslutna datorn kan se vad du gör eller trycka på knapparna i din session. Nedan är min metod för att göra x11vnc mer likt en anslutning till Windows via RDP.

Så låt oss anta att du redan kan använda x11vnc, om inte – du kan söka på internet eller läsa till exempel ). Ett typiskt exempel på användning:.

Givet: vi kör x11vnc, ansluter till det med en klient, allt fungerar, men den lokala konsolen på datorn är också synlig för visning och inmatning.

Vi vill ha: stänga av den lokala konsolen (monitor + tangentbord + mus) så att ingenting kan ses eller matas in.

Vi stänger av monitorn

Det första som kom upp i mitt huvud var att helt enkelt stänga av monitorn med xrandr, till exempel så här:

$ xrandr --output CRT1 --off

men då börjar skrivbordsmiljön (jag har KDE) tro att monitorn faktiskt är avstängd och börjar flytta fönster och paneler, allt blir upp och ner och trist.
Det finns en mer intressant metod som innebär att föra monitorn i dvala, vilket kan göras så här:

$ xset dpms force off

men här är inte allt perfekt. Systemet väcker monitorn vid första evenemanget. En enkel workaround i form av en loop hjälper:

while :
do
    xset dpms force off
    sleep .5
done

Sedan tänkte jag inte mer på det — det var för jobbigt, det uppfyller sitt syfte — monitorerna visar ingenting, även om knappar trycks, musen rörs, etc.

UPD:

Tack amarao för ännu en metod med att stänga ned ljusstyrkan till noll:

$ xrandr --output CRT1 --brightness 0

Vi stänger av inmatningen

För att stänga av inmatningen använde jag xinput. När den körs utan parametrar skriver den ut en lista över enheter:

$ xinput
⎡ Virtuell kärnpointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtuell kärn XTEST-pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Laser Mouse                  id=9    [slave  pointer  (2)]
⎣ Virtuell kärntangentbord                         id=3    [master keyboard (2)]
    ↳ Virtuell kärn XTEST-tangentbord               id=5    [slave  keyboard (3)]
    ↳ Strömbrytare                              id=6    [slave  keyboard (3)]
    ↳ Strömbrytare                              id=7    [slave  keyboard (3)]
    ↳ Sömnbrytare                              id=8    [slave  keyboard (3)]
    ↳ USB 2.0 Kamera: HD 720P Webcam            id=10   [slave  keyboard (3)]
    ↳ HID 041e:30d3                             id=11   [slave  keyboard (3)]
    ↳ AT Översatt Set 2 tangentbord              id=12   [slave  keyboard (3)]

Enheter Virtuell kärn… Det går inte att stänga av — ett felmeddelande ges, men de andra kan slås av och på, till exempel kan du på det här sättet vara utan mus i en minut:

xinput disable 9; sleep 60; xinput enable 9

Färdig lösning

För mitt fall gjorde jag ett skript som jag kör i en ssh-session. Det tysta lokala inmatningen och startar x11vnc-servern, och efter att skriptet är klart återställs allt som det var. I slutändan blev det tre skript, här är de (uppdaterade).

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

Egentligen, huvudskriptet (jag har två skärmar, jag startar en gemensam server och en på varje skärm).

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

Egentligen allt. Vi går in via ssh, kör vnc_server, så länge det lever har vi tillgång via vnc och den lokala konsolen är avstängd.

Tack för uppmärksamheten, kompletteringar och förbättringar är välkomna.

Källa: habr.com

Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster