É possível automatizar cliques com xdotool para controlar uma sessão de GUI diferente daquela que está sendo usada atualmente?

1

O comando xdotool nos permite criar scripts controlando a interface gráfica do usuário do sistema com muita facilidade. Posso por exemplo abra meu navegador Google Chrome na área de trabalho a seguir executando xdotool mousemove 26 146 click 1 .

Então,digamosqueeucrieumnovousuárioparaomeusistema:

#addusernewuser

Seeuregistrarcomnewuseremumasessãodiferenteeexecutaroscomandosxdotool,elesfuncionarãoperfeitamente.Masbem,digamosqueeuabriduassessõesGUIdiferentesemdiferentesttys,umacommeuusuárioregulareoutracomnewuser,edigamostambémquesouatualmenteexecutandoumasessãodeGUIcommeuusuáriocomumeeucriooseguintescript:

#!/bin/bashxdotoolmousemove3161click1

Emseguida,salve-ocomomacro.bashnaminhapastapessoaleexecutechmod777~/macro.bashparadefiniraspermissõescorretasparaele.Porfim,abroumnovoterminalefaçologoncomonewuser(enquantousominhasessãonormaldeusuário):

$sunewuser

Agora,seeutentarexecutarmeuscript,recebooseguinteerro(consulteEDITAR):

newuser@myPC:~$/home/myregularuser/macro.bashNoprotocolspecifiedError:Can'topendisplay:(null)Failedcreatingnewxdoinstance

Estescriptfuncionabemseeutentarexecutá-loduranteaexecuçãodeumasessãoGUIregistradacomonewuser,masmeuobjetivoaquiéterumaferramentademacroquepossacontrolarainterfacegráficadasessãonewusercomscriptsenquantoeuestouusandominhasessãodeusuárioregular.Épossível?Alguémconheceumasoluçãoalternativapararesolveresseerro?

EDITAR

Como quixotesco disse nos comentários e telcoM disse em sua resposta que eu estava faltando definindo os valores corretos das variáveis de ambiente $DISPLAY e $XAUTHORITY . Embora não tenha conseguido resolver o meu problema como descrito na resposta da telcoM, consegui resolvê-lo com o seguinte processo:

1- Fazendo login na minha sessão newuser .

2- Inserindo os seguintes comandos como as últimas linhas do arquivo ~/.bashrc :

if xhost >& /dev/null; then
   echo "export DISPLAY=\"$DISPLAY\"" > $HOME/.variableMemory
   echo "export XAUTHORITY=\"$XAUTHORITY\"" >> $HOME/.variableMemory
fi

3- Alterando meu script, redefinindo as variáveis $DISPLAY e $XAUTHORITY para seus valores corretos enquanto o script é executado:

#!/bin/bash

source $HOME/.variableMemory
xdotool mousemove 31 61 click 1

Com isso, basicamente, estou capturando e salvando os valores das variáveis $DISPLAY e $AUTHORITY ao fazer o logon pela primeira vez na sessão newuser com a interface gráfica, para poder usar esses valores quando eu fizer logon com o shell mais tarde.

Agora não vejo nenhum erro e posso mover o mouse em torno da outra sessão com os comandos xdotool perfeitamente quando executo o script, mas tenho um novo problema: O Xorg que está em um Uma sessão de GUI diferente está congelada enquanto não está sendo usada . Para resumir, ele enfileira todos os cliques que eu envio para ele e então libera todos eles de uma só vez quando eu alterno manualmente para aquela sessão de GUI em particular (e isso torna xdotool inutilizável) ... Então, a questão ainda permanece : É possível controlar uma sessão da GUI com uma ferramenta de macro enquanto estou executando uma sessão da GUI diferente? Existe uma configuração do Xorg que desabilite esse "comportamento de congelamento" para que ele receba os comandos de clique em tempo real, mesmo quando não estou usando essa sessão?

Informações adicionais

  1. Estou executando o Ubuntu 18.04.
  2. O servidor de exibição usado é o Xorg (com o Wayland xdotool não funciona, mas essa questão não está relacionada ao Wayland).
  3. O GNOME é a interface gráfica do usuário que estou usando no momento.
  4. Meu objetivo principal é usar uma ferramenta de macro para controlar uma tela que não estou usando fisicamente, para que eu possa usar o computador enquanto a macro faz seu trabalho. Embora eu tenha escolhido o xdotool, o Ubuntu, o Xorg e o GNOME para resolver este problema, estou aberto a respostas que resolvam esse mesmo problema com diferentes ferramentas, ambientes de desktop ou até diferentes distribuições Linux ... Obrigado!
por Rafael Muynarsk 18.06.2018 / 01:38

1 resposta

0

O outro componente que está faltando é o arquivo .Xauthority . Ele contém um "cookie de sessão" que é gerado novamente a cada vez que um servidor X11 é reiniciado, e o cliente é obrigado a recebê-lo para enviar qualquer comando ao servidor X11. Esse arquivo está normalmente localizado em ~/.Xauthority , embora você possa usar a variável de ambiente $XAUTHORITY para especificar um local alternativo.

Para controlar a sessão da GUI que não é sua, você precisará obter acesso ao cookie da sessão dessa outra sessão. Se tiver um valor $DISPLAY diferente, você poderá simplesmente copiar o cookie da sessão no arquivo .Xauthority usando os comandos xauth extract e xauth merge :

su newuser -c "xauth extract /home/newuser/.Xauthority $newuserDISPLAY" | xauth merge

O arquivo .Xauthority pode conter vários cookies de sessão para diferentes DISPLAYs ao mesmo tempo.

Ou, se o cookie da sessão estiver localizado em um arquivo que já está acessível para você, use a variável $XAUTHORITY para apontá-lo.

Isso está começando a parecer um problema XA : você tem algo que deseja alcançar e pode ter xdotool como a maneira assumida de fazer isso.

Mas quando você está tentando automatizar algo, passar pelos movimentos da GUI usando xdotool é geralmente a maneira menos conveniente de fazer isso. Por exemplo, se você deseja automatizar a inicialização do Google Chrome como um usuário específico, não é necessário simular o clique em um ícone: basta organizar a identidade e o ambiente corretos e iniciar o processo desejado.

Por exemplo, para iniciar google-chrome como usuário newuser , você pode fazer:

su -lc "DISPLAY=<whatever> google-chrome" newuser

Como o comando su tem a opção -l , o processo google-chrome terá o $HOME correto para o novo usuário e, portanto, procurará .Xauthority no local padrão, ou seja, ~newuser/.Xauthority . Você só precisa fornecer o valor correto para a variável $DISPLAY que corresponda à sessão real da GUI em execução de newuser . Se você quiser que o Google Chrome abra uma URL específica, você pode especificá-lo como um argumento para google-chrome entre aspas duplas.

    
por 18.06.2018 / 10:22