هنگام استفاده از x11vnc، کنسول محلی را غیرفعال کنید

سلام به همه،

مقالات زیادی در اینترنت در مورد نحوه تنظیم یک اتصال از راه دور به یک جلسه Xorg موجود از طریق x11vnc وجود دارد، اما من جایی پیدا نکردم که چگونه مانیتور و ورودی محلی را سرکوب کنم تا هر کسی که در کنار رایانه از راه دور نشسته است این کار را انجام دهد. نمی بیند که چه کاری انجام می دهید و دکمه ها را در جلسه شما فشار نمی دهد. در زیر برش روش من برای شبیه سازی x11vnc به اتصال به ویندوز از طریق RDP است.

بنابراین، فرض کنید شما از قبل می دانید چگونه از x11vnc استفاده کنید، اگر نه، می توانید به عنوان مثال در گوگل جستجو کنید یا بخوانید اینجا.

داده شده: 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

اضافه کردن نظر