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.