Posso lançar um programa gráfico na área de trabalho de outro usuário como root?

35

A seguir, outras perguntas que eu acho que preciso saber:

  • De uma sessão não X? (significa que a raiz não está logada no X)

  • Se várias pessoas estivessem conectadas no X, eu poderia detectar automaticamente quem estava em qual tela e, assim, detectar programaticamente em qual tela eu precisava iniciar o aplicativo?

  • Posso iniciar o aplicativo como usuário? (ok, tenho 99,999% de certeza que isso é um sim)

  • Posso detectar se usuários do grupo X estão logados no X?

por xenoterracide 04.09.2010 / 23:29

5 respostas

21

Para iniciar um programa gráfico na área de trabalho de um usuário, você precisa encontrar duas coisas: em que exibição a área de trabalho do usuário está (o endereço) e qual cookie de autorização usar (a senha).

O comando a seguir deve listar as exibições locais em que o usuário está conectado (uma por linha) na maioria dos unices:

who | awk -v user="$target_user" '$1 == user && $2 ~ "^:" {print $2}'

Encontrar o cookie de autorização é um pouco mais difícil. Você tem que procurar o arquivo de cookie do usuário, que é ~/.Xauthority por padrão (tudo que você precisa é o local do arquivo de cookie, você não precisa extrair o cookie dele). Isso funciona em muitos sistemas, mas não em todos; isso depende do gerenciador de exibição e de como ele está configurado e, em particular, o Gdm (o padrão no Ubuntu) não utilizou a localização padrão por último. Não consigo pensar em uma maneira portátil de descobrir o arquivo de cookie X real. A maneira mais precisa de descobrir é descobrir o pid do processo X e procurar o argumento para a opção -auth . Outra maneira é encontrar um processo em execução nesse servidor X e pegar sua variável XAUTHORITY environemnt. Se você tiver problemas para encontrar o arquivo de cookie, consulte Abra uma janela em um display X remoto (por que" Não é possível abrir a tela ")?

Quando tiver as duas informações, coloque a exibição escolhida na variável de ambiente DISPLAY , o arquivo de cookie de autoridade X escolhido na variável de ambiente XAUTHORITY e você está definido. Não importa qual usuário o programa executa; combine com su se quiser.

    
por 05.09.2010 / 00:59
10

Eu não posso tentar isso completamente, já que todas as minhas máquinas estão com o root desativado.

Para descobrir em qual tela um usuário está, você pode usar o comando who . A última coluna de saída é geralmente o DISPLAY em que o usuário está logado. Algo como isso poderia ser usado para pegar apenas a tela (provavelmente há uma maneira muito mais eficiente de fazer isso, sinta-se livre para oferecer edições):

who | grep -m1 ^username.*\( | awk '{print $5}' | sed 's/[(|)]//g'

Em seguida, inicie um comando X gráfico nessa exibição:

DISPLAY=:0 firefox &

onde: 0 seria substituído por qualquer exibição que você encontrasse no primeiro comando e o firefox seria substituído pelo comando que você deseja executar. Você poderia colocar isso em um shell script e apenas usar uma variável.

A próxima parte é a parte que eu não testei, mas não vejo por que não deveria ser possível fazer isso:

su username -c "DISPLAY=:0 firefox"

para iniciar o comando X como esse usuário.

    
por 05.09.2010 / 00:03
4

Você pode ver como isso acontece. Por exemplo. quando ele emite comandos xscreensaver ou em branco a tela para cada usuário executando a sessão X ou X.

Por exemplo, no Ubuntu, este arquivo contém informações relacionadas:

/etc/acpi/lid.sh

Contém este loop:

for x in /tmp/.X11-unix/*; do
    displaynum='echo $x | sed s#/tmp/.X11-unix/X##'
    getXuser;
    if [ x"$XAUTHORITY" != x"" ]; then
        export DISPLAY=":$displaynum"
        grep -q off-line /proc/acpi/ac_adapter/*/state
        if [ $? = 1 ]
            then
            if pidof xscreensaver > /dev/null; then 
                su $user -c "xscreensaver-command -unthrottle"
            fi
        fi
        if [ x$RADEON_LIGHT = xtrue ]; then
            [ -x /usr/sbin/radeontool ] && radeontool light on
        fi
        if [ 'pidof xscreensaver' ]; then
            su $user -c "xscreensaver-command -deactivate"
        fi
        su $user -c "xset dpms force on"
    fi
done
    
por 05.09.2010 / 00:07
1

Uma extensão da resposta do Gilles é como encontrar o arquivo de cookie. Uma maneira de fazer isso pode ser depois que você definir a variável de ambiente DISPLAY (como descrito por Gilles), use strace para localizar os arquivos xhost access. Eu posso pensar em algo assim em BASH:

# Set the DISPLAY variable first
DISPLAY = :0.0
# Use strace on xhost
strace xhost 2>&1 | grep access

A saída do código acima será parecida com:

access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
access("/home/someuser/.Xauthority", R_OK) = 0

Como você pode ver claramente, o arquivo de cookie aparecerá diretamente aqui.

    
por 15.09.2013 / 18:22
0

Em minha pesquisa de encontrar uma maneira elegante de exibir a GUI ou a tarefa X a partir de ambientes limitados, como regras do udev ou do superusuário, criei recentemente uma ferramenta para ajustá-la (for mais detalhes ).

xpub é um script de shell para obter as variáveis do ambiente de exibição X em relação ao TTY atual ou a um determinado.

Este é um exemplo com uma regra do udev:

IMPORT{program}="/usr/bin/xpub", \
RUN+="/bin/su $env{XUSER} -c '/usr/bin/notify-send Hello'"

$env{ENV} : se o usuário atual-tty iniciar o X, caso contrário, remova-o.

O princípio é o mesmo para uma linha de comando usando export :

export $(xpub) ; su ${XUSER} -c 'notify-send Hello'
    
por 02.02.2017 / 15:14