X11vnc kullanırken yerel konsolu devre dışı bırakın

Herkese Merhaba,

İnternette x11vnc aracılığıyla mevcut bir Xorg oturumuna uzaktan bağlantının nasıl kurulacağıyla ilgili pek çok makale var, ancak yerel monitörün ve girişin, uzak bilgisayarın yanında oturan herkesin yapması için nasıl bastırılacağını hiçbir yerde bulamadım. ne yaptığınızı görmüyorsunuz ve oturumunuzda düğmelere basmıyorsunuz. Kesimin altında x11vnc'yi RDP aracılığıyla Windows'a bağlanmaya daha benzer hale getirme yöntemim var.

Diyelim ki x11vnc'nin nasıl kullanılacağını zaten biliyorsunuz, bilmiyorsanız google'a yazabilir veya okuyabilirsiniz örneğin burada.

Verilen: x11nvc'i başlatıyoruz, istemciye bağlanıyoruz, her şey çalışıyor, ancak bilgisayarın yerel konsolu da görüntüleme ve giriş için mevcut.

İstiyoruz: hiçbir şeyin görülmemesi veya girilmemesi için yerel konsolu (monitör + klavye + fare) kapatın.

Monitörleri kapatma

Akla gelen ilk şey monitörü xrandr aracılığıyla kapatmaktı, örneğin şu şekilde:

$ xrandr --output CRT1 --off

ama aynı zamanda pencereleme ortamı (KDE'm var) monitörün gerçekten kapalı olduğunu düşünmeye başlıyor ve pencereleri ve panelleri atmaya başlıyor, her şey dışarı çıkıyor ve üzülüyor.
Monitörü hazırda bekletme moduna geçirmek için daha ilginç bir yol var; bunu örneğin şu şekilde yapabilirsiniz:

$ xset dpms force off

ama burada da her şey düzgün değil. Sistem ilk olayda monitörü uyandırır. Döngü şeklindeki en basit koltuk değneği aşağıdakilere yardımcı olur:

while :
do
    xset dpms force off
    sleep .5
done

Daha fazla düşünmedim - tembeldim, amacına hizmet ediyor - düğmelere bassam, fareyi hareket ettirsem vb. monitörler hiçbir şey göstermiyor.

UPD:

Teşekkürler amarao parlaklığı sıfıra çevirmenin başka bir yöntemi için:

$ xrandr --output CRT1 --brightness 0

Girişin kesilmesi

Girişi devre dışı bırakmak için xinput kullandım. Parametreler olmadan başlatıldığında cihazların bir listesini görüntüler:

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

Cihazlar Sanal çekirdek... devre dışı bırakamazsınız - bir hata görüntülenir, ancak geri kalanı açılıp kapatılabilir, örneğin, bir dakika boyunca faresiz kalmanın yolu budur:

xinput disable 9; sleep 60; xinput enable 9

Anahtar teslimi çözüm

Benim durumum için ssh oturumunda çalıştıracağım bir komut dosyası hazırladım. Yerel girişi bastırır ve x11vnc sunucusunu yükseltir ve betiğin tamamlanmasının ardından her şey olduğu gibi döner. Sonuç olarak, üç komut dosyası elde ettik, işte bunlar (güncellendi).

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

devre dışı_local_console:

#!/bin/sh

trap "switch_local_console 1" EXIT

while :
do
    switch_local_console 0
    sleep 1
done

Aslında ana script (İki monitörüm var, bir ortak sunucu ve her monitör için bir tane kuruyorum).

vnc_sunucusu:

#!/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

Bu kadar. Ssh ile giriş yapın ve başlatın vnc_sunucusu, hayattayken vnc üzerinden erişimimiz var ve yerel konsol söndürüldü.

İlginiz için teşekkür ederiz, eklemeler ve iyileştirmeler bekliyoruz.

Kaynak: habr.com

Yorum ekle