سلام به همه،
مقالات زیادی در اینترنت در مورد نحوه تنظیم یک اتصال از راه دور به یک جلسه 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