sábado, 26 de setembro de 2020

Rodando vários navegadores e programas isolados por UIDs diferentes

O que vou ensinar aqui se aplica para todos (ou quase) os sistemas que rodam X Windows, ou seja, sistemas Unix-Like (FreeBSD, Linux etc), e VMS (Não uso um faz décadas.), e talvez mais alguns outros sistemas (Ouvi falar de X Windows em Mac OS X, que é um Unix-Like derivado do FreeBSD).

O X Windows é um sistema em rede, isto é, um programa em um computador pode se conectar ao ambiente gráfico de outro computador (ou terminal X Windows).

Como na época em que ele surgiu o poder computacional era muito menor do que o atual, surgiram terminais que rodavam o X Windows. Assim os programas rodariam em um grande computador e a interface gráfica dele estaria no terminal em separado.

Também existiam programas que transformavam PCs em terminais X Windows.

Aqui tem um ponto que dá nó na cabeça de muita gente. Quem roda o X Windows é o servidor, pois serve janelas, teclado, mouse etc, em suma, fornece uma interface com o usuário, para os programas que os requisitam, é que são clientes. Assim os computadores grandes, os mainframes, eram os clientes de X Windows e os terminais eram os servidores de X Windows

Assim o navegador (por exemplo) é um cliente de X Windows que se conecta a um servidor de X Windows, e como atualmente se tem muito mais poder computacional do que se tinha antigamente, ambos normalmente rodam no mesmo computador.

Quando eu fiz um curso de programação em X Windows em 1991 usávamos uma única DEC VAX Station que tínhamos disponível para toda a turma, e um DEC VAX por vários terminais seriais (acho que compatíveis com o DEC VT-100 conectados por RS232). Rodávamos os programas neste DEC VAX, mas pedíamos que as janelas fossem feitas an DEC VAX Station. Assim a turma toda poderia usar a estação gráfica, mas sem ninguém realmente sentar diante dela.

Aliás, uma das máquinas rodava DEC Ultrix como sistema operacional (acho que era a VAX Station, mas posso estar errado) e o outro rodava DEC VMS como sistema operacional. Ou seja, cliente e servidor não precisam usar o mesmo sistema operacional.

Mesmo o mundo tendo mudado muito, este recurso de rede do X Windows ainda existe, e ainda é usado, mas bem menos. E por questões de segurança, ele normalmente fica desativado.

Eu me lembro do X Windows suportar HDR naquela época (1991), mesmo com este termo ainda não existindo. Ele suportava 16 bits por cor, 48 bits por pixel, mesmo com quase todos os hardwares atuais (2020) não suportando isso. (Descobri o suporte a 16 bits por cor por pixel quando o meu degradê de cinza só mostrava preto. rsrs)

Eu uso este recurso do X Windows no meu computador, e separo um usuário para o jogo do Minetest. Aliás, agora tenho vários usuários para este jogo, já que criei o canal Não É Minecraft. Mas eu já fazia antes. Eu tenho um usuário que só uso uma vez por ano, pois é o usuário para fazer Imposto de Renda. Eu tenho um com o login do meu antigo trabalho, e assim mantinha um navegador com o Trello, o e-mail do trabalho etc, abertos completamente isolados dos pessoais.

Os usos para isto são muito amplos.

Outro uso que fiz foi quase 20 anos atrás. Eu pensava no reaproveitamento dos antigos 486 no tempo que eu trabalhei na Biblioteca Nacional. Eu rodei um Netscape (navegador web) no Pentium 4, que era a minha estação de trabalho, mas a janela era apresentada no 486 antigo que não tinha condições de rodar um navegador. A ideia era rodar os navegadores em um Pentium 4, e cada um deles fazendo a sua janela num 486 diferente. Em suma, eu estava transformando os 486 em terminais X Windows.

 

Agora vamos ao que interessa a muita gente

Para começar, o X Windows tem que ser iniciado com suporte à conexão remota. No meu sistema eu faço assim:

startx -- -listen tcp

Isto diz ao X Windows, em seu momento de inicialização, que ele tem que escutar a porta TCP dele, caso contrário ele não a abrirá (creio eu).

No seu sistema (se não for um FreeBSD) pode ser diferente. Se isto não funcionar no seu sistema pesquise é nele, e pode colocar nos comentários qual foi o sistema e qual foi a solução adotada.

E ainda tem que autorizar quem pode fazer requisições a ele, e isto é com o comando xhost, como abaixo:

xhost +localhost

Aqui estamos dizendo que é para aceitar todas as conexões da máquina local. Então qualquer usuário da máquina local pode fazer janelas nela, e não só o usuário que iniciou o X Windows na máquina.

Em uma janela shell, de linha de comando, pode-se fazer login num outro usuário, como o exemplo abaixo:

exec login fulano

E depois fornecer a devida senha. (Nota: fulano é o usuário no qual vai se fazer login neste exemplo.)

Podem consultar o manual do exec e do login para saber mais detalhes.

Agora tem que avisar aos programas que este usuário rodar qual é o display dele, onde tem que ser feitas as janelas e a interface com o usuário.

Se usa uma csh como shell de linha de comando, isto pode ser feito da forma abaixo.

setenv DISPLAY localhost:0.0

É basicamente colocar a informação numa variável do ambiente que os programas receberão.

Se sempre vai usar este usuário desta forma, sem ele realmente fazer login diretamente no computador, coloque a linha acima no arquivo .login que fará com que esta configuração sempre seja feita quando fizer o exec login citado acima.

Se usa uma Bourne Shell (sh) ou uma derivada (como a bash), faça da seguinte forma (Nota: Não testei, mas acho que deve funcionar.).

set DISPLAY='localhost:0.0'

export DISPLAY

E o arquivo de configuração será o .profile.

Podem perguntar e fazer acréscimos nos comentários.