Απενεργοποιήστε την τοπική κονσόλα όταν χρησιμοποιείτε x11vnc

Γεια σε όλους,

Υπάρχουν πολλά άρθρα στο Διαδίκτυο σχετικά με το πώς να ρυθμίσετε μια απομακρυσμένη σύνδεση σε μια υπάρχουσα συνεδρία Xorg μέσω x11vnc, αλλά δεν βρήκα πουθενά πώς να καταστείλετε την τοπική οθόνη και την είσοδο έτσι ώστε όποιος κάθεται δίπλα στον απομακρυσμένο υπολογιστή να κάνει δεν βλέπει τι κάνετε και δεν πατάει κουμπιά στη συνεδρία σας. Κάτω από την περικοπή είναι η μέθοδος μου για να κάνω το x11vnc πιο παρόμοιο με τη σύνδεση στα Windows μέσω RDP.

Λοιπόν, ας πούμε ότι γνωρίζετε ήδη πώς να χρησιμοποιείτε το x11vnc, αν όχι, μπορείτε να κάνετε google ή να διαβάσετε για παράδειγμα εδώ.

Δεδομένος: εκκινούμε το x11nvc, συνδεόμαστε σε αυτό με τον πελάτη, όλα λειτουργούν, αλλά η τοπική κονσόλα του υπολογιστή είναι επίσης διαθέσιμη για προβολή και εισαγωγή.

Θέλουμε: απενεργοποιήστε την τοπική κονσόλα (οθόνη + πληκτρολόγιο + ποντίκι) για να μην φαίνεται ή να εισαχθεί τίποτα.

Απενεργοποίηση των οθονών

Το πρώτο πράγμα που μου ήρθε στο μυαλό ήταν απλά να απενεργοποιήσετε την οθόνη μέσω του xrandr, για παράδειγμα ως εξής:

$ xrandr --output CRT1 --off

αλλά ταυτόχρονα, το περιβάλλον παραθύρου (έχω το KDE) αρχίζει να πιστεύει ότι η οθόνη είναι πραγματικά απενεργοποιημένη και αρχίζει να πετάει παράθυρα και πάνελ, όλα βγαίνουν έξω και γίνονται λυπηρά.
Υπάρχει ένας πιο ενδιαφέρον τρόπος, ο οποίος είναι να στείλετε την οθόνη σε κατάσταση αδρανοποίησης, μπορείτε να το κάνετε για παράδειγμα ως εξής:

$ xset dpms force off

αλλά και εδώ δεν είναι όλα ομαλά. Το σύστημα ξυπνά την οθόνη στο πρώτο συμβάν. Το πιο απλό δεκανίκι σε μορφή κύκλου βοηθά:

while :
do
    xset dpms force off
    sleep .5
done

Δεν σκέφτηκα περαιτέρω - ήμουν τεμπέλης, εξυπηρετεί τον σκοπό του - οι οθόνες δεν δείχνουν τίποτα, ακόμα κι αν πατήσω τα κουμπιά, μετακινήσω το ποντίκι κ.λπ.

UPD:

σας ευχαριστώ αμάραο για μια άλλη μέθοδο με μηδενισμό της φωτεινότητας:

$ 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 και με την ολοκλήρωση του σεναρίου όλα επιστρέφουν όπως ήταν. Ως αποτέλεσμα, πήραμε τρία σενάρια, εδώ είναι (ενημερωμένα).

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

Στην πραγματικότητα, το κύριο σενάριο (έχω δύο οθόνες, έχω δημιουργήσει έναν κοινό διακομιστή και έναν για κάθε οθόνη).

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, όσο είναι ζωντανός, έχουμε πρόσβαση μέσω vnc και η τοπική κονσόλα έχει σβήσει.

Σας ευχαριστούμε για την προσοχή σας, είναι ευπρόσδεκτες οι προσθήκες και οι βελτιώσεις.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο