Désactivez la console locale lors de l'utilisation de x11vnc

Bonjour à tous,

Il existe de nombreux articles sur Internet sur la façon de configurer une connexion à distance à une session Xorg existante via x11vnc, mais je n'ai trouvé nulle part comment supprimer le moniteur et l'entrée locaux afin que toute personne assise à côté de l'ordinateur distant le fasse. ne voit pas ce que vous faites et n'appuie pas sur les boutons de votre session. Sous la coupe se trouve ma méthode pour rendre x11vnc plus similaire à la connexion à Windows via RDP.

Donc, disons que vous savez déjà utiliser x11vnc, sinon vous pouvez googler ou lire par exemple ici.

donné: nous lançons x11nvc, nous nous y connectons avec le client, tout fonctionne, mais la console locale de l'ordinateur est également disponible pour la visualisation et la saisie.

Nous voulons: éteignez la console locale (moniteur + clavier + souris) pour que rien ne puisse être vu ou saisi.

Éteindre les moniteurs

La première chose qui m'est venue à l'esprit a été simplement d'éteindre le moniteur via xrandr, par exemple comme ceci :

$ xrandr --output CRT1 --off

mais en même temps, l'environnement de fenêtrage (j'ai KDE) commence à penser que le moniteur est vraiment éteint et commence à ouvrir des fenêtres et des panneaux, tout bouge et devient triste.
Il existe une manière plus intéressante, qui consiste à envoyer le moniteur en hibernation, vous pouvez le faire par exemple comme ceci :

$ xset dpms force off

mais ici aussi, tout ne se passe pas bien. Le système réveille le moniteur au premier événement. La béquille la plus simple en forme de cycle permet de :

while :
do
    xset dpms force off
    sleep .5
done

Je n'ai pas réfléchi plus loin - j'étais paresseux, ça remplit son rôle - les moniteurs n'affichent rien, même si j'appuie sur les boutons, bouge la souris, etc.

UPD:

merci amarao pour une autre méthode consistant à mettre la luminosité à zéro :

$ xrandr --output CRT1 --brightness 0

Supprimer l'entrée

Pour désactiver la saisie, j'ai utilisé xinput. Lorsqu'il est lancé sans paramètres, il affiche une liste d'appareils :

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

Dispositifs Noyau virtuel... vous ne pouvez pas le désactiver - une erreur s'affiche, mais le reste peut être activé et désactivé, par exemple, voici comment vous pouvez vous retrouver sans souris pendant une minute :

xinput disable 9; sleep 60; xinput enable 9

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

Pour mon cas, j'ai créé un script que j'exécute dans une session ssh. Il supprime les entrées locales et active le serveur x11vnc, et une fois le script terminé, tout revient tel qu'il était. En conséquence, nous avons obtenu trois scripts, les voici (mis à jour).

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

désactiver_local_console :

#!/bin/sh

trap "switch_local_console 1" EXIT

while :
do
    switch_local_console 0
    sleep 1
done

En fait, le script principal (j'ai deux moniteurs, j'ai configuré un serveur commun et un pour chaque moniteur).

serveur_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

C'est tout. Connectez-vous via ssh et lancez serveur_vnc, tant qu'il est en vie, nous avons accès via vnc et la console locale est éteinte.

Merci de votre attention, les ajouts et améliorations sont les bienvenus.

Source: habr.com

Ajouter un commentaire