Desative o console local ao usar x11vnc

Oi pessoal

Na Internet, existem muitos artigos sobre como configurar uma conexão remota a uma sessão existente do Xorg via x11vnc, mas não encontrei em nenhum lugar como fixar o monitor e a entrada local para que qualquer pessoa que esteja ao lado do computador remoto não veja o que está fazendo e não botões pressionados em sua sessão. Sob cat, minha maneira de tornar o x11vnc mais parecido com a conexão ao Windows via RDP.

Então, digamos que você já saiba como usar o x11vnc, caso contrário, você pode pesquisar no Google ou ler, por exemplo, aqui .

Dado: inicie o x11nvc, conecte-se ao cliente, tudo funciona, mas o console do computador local também está disponível para visualização e entrada.

Queremos: reduzir o console local (monitor + teclado + mouse) para que nada possa ser visto e inserido.

Reduzimos monitores


A primeira coisa que veio à mente foi apenas cortar o monitor via xrandr, por exemplo:

$ xrandr --output CRT1 --off 

mas, ao mesmo tempo, o ambiente da janela (eu tenho o KDE) começa a pensar que o monitor está realmente desligado e começa a atirar janelas e painéis, tudo sai e fica triste.
Existe uma maneira mais interessante, que é enviar o monitor para dormir, você pode fazer isso, por exemplo, assim:

 $ xset dpms force off 

mas aqui também, nem tudo está indo bem. O sistema ativa o monitor no primeiro evento. A muleta mais simples na forma de um ciclo ajuda a:

 while : do xset dpms force off sleep .5 done 

Não pensei mais - era preguiça, cumpre seu objetivo - os monitores não mostram nada, mesmo se você pressionar botões, abanar o mouse etc.

UPD:

Obrigado amarao por outra maneira de mudar para zero brilho:
 $ xrandr --output CRT1 --brightness 0 


Corte a entrada


Para desativar a entrada, usei o xinput. Quando iniciado sem parâmetros, ele exibe uma lista de dispositivos:

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

Dispositivos virtuais virtuais ... não podem ser desativados - um erro é emitido, mas o restante pode ser ativado e desativado. Por exemplo, assim, você pode ficar sem um mouse por um minuto:

 xinput disable 9; sleep 60; xinput enable 9 

Solução chave na mão


Para o meu caso, criei um script que é executado na sessão ssh. Ele suprime a entrada local e gera o servidor x11vnc, e, após a conclusão do script, tudo retorna como estava. Como resultado, três scripts foram lançados, aqui estão eles (atualizados).

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 

Na verdade, o script principal (eu tenho dois monitores, eu levanto um servidor comum e um para cada monitor).

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 

Na verdade tudo. Utilizamos o ssh, rodamos o vnc_server enquanto ele está ativo, temos acesso via vnc e o console local extinto.

Obrigado por sua atenção, adições e melhorias são bem-vindas.

Source: https://habr.com/ru/post/pt469885/


All Articles