Como retornar o usuário / sessão atualmente ativo em um desktop Linux? [fechadas]

3

Minha pergunta é como obter o nome de usuário no shell, que atualmente está usando o desktop Linux (em um sistema de desktop "normal", onde você normalmente só tem um usuário ativo, ou seja, nenhum sistema de servidor aqui, mas apenas seu Laptop usual etc.). Se você realmente quer imaginar um sistema de servidor, eu ficaria bem em listar todos os usuários ativos .

Então pegue, por exemplo o caso em que um script está sendo executado como root como uma tarefa cron (ou similar) e eu quero obter os / todos os usuários atualmente ativos no sistema.

Eu sei que posso usar w ou who ou users para obter os usuários atualmente conectados. Tudo bem, mas esse usuário está logado não significa que eles estão realmente usando o desktop, porque em todos os ambientes de área de trabalho eu sei, os usuários podem mudar para outro usuário depois de terem logado.
Eu também poderia usar last para obter o último login do usuário, mas isso também não garante que esse usuário ainda seja o ativo.

Então, como se pode fazer isso? É bom fornecer soluções específicas para diferentes ambientes de desktops (GNOME, KDE,…), mas, é claro, é preferível uma solução compatível cruzada.

    
por rugk 27.09.2017 / 10:46

3 respostas

6

Em muitas distribuições atuais, as sessões de login (gráficas e não gráficas) são gerenciadas por logind . Você pode listar sessões usando

loginctl list-sessions

e, em seguida, exibir as propriedades de cada sessão usando

loginctl show-session ${SESSIONID}

ou

loginctl session-status ${SESSIONID}

(substituindo ${SESSIONID} conforme apropriado); A diferença entre as duas variantes é que show-session é projetado para ser facilmente analisado, session-status é projetado para consumo humano. Sessões ativas são identificadas pelo seu estado; você pode consultar isso diretamente usando

loginctl show-session -p State ${SESSIONID}

qual produzirá

State=active

para a (s) sessão (ões) ativa (s). A saída total show-session dirá qual usuário está conectado, qual TTY está sendo usado, se é uma sessão remota, se é uma sessão gráfica, etc.

Observe que logind pode ter várias sessões ativas, se o sistema estiver configurado com várias estações ou se houver sessões remotas.

Colocando tudo isso junto,

for sessionid in $(loginctl list-sessions --no-legend | awk '{ print $1 }')
do loginctl show-session -p Id -p Name -p User -p State -p Type -p Remote $sessionid
done

fornecerá todas as informações necessárias para determinar quais sessões estão ativas e quem as está usando e

for sessionid in $(loginctl list-sessions --no-legend | awk '{ print $1 }')
do loginctl show-session -p Id -p Name -p User -p State -p Type -p Remote $sessionid | sort
done |
awk -F= '/Name/ { name = $2 } /User/ { user = $2 } /State/ { state = $2 } /Type/ { type = $2 } /Remote/ { remote = $2 } /User/ && remote == "no" && state == "active" && (type == "x11" || type == "wayland") { print user, name }'

imprimirá os identificadores e logins de todos os usuários ativos com sessões gráficas.

    
por 27.09.2017 / 14:57
0

Estou usando uma função bash como a seguinte

function Xowner() {
    for pid in $(ps -houid --ppid $(ps -hoppid $(pgrep X))) ; do
        [ "$pid" = "0" ] && continue
        id -n -u $pid
        break
    done
}

A intenção com essa função é basicamente escolher "o primeiro" UID não-raiz dos processos irmãos do Xserver. Veja man ps para detalhes. Suponho que, se o seu caso de uso envolver potencialmente vários servidores X, você precisará se concentrar melhor em quais deles começar.

    
por 27.09.2017 / 11:24
0

Na maioria dos sistemas semelhantes a Unix (diz Wikipedia ) o comando

$ whoami

fornece o nome do usuário atual que está executando o comando, por exemplo

$ whoami
dessert

$ sudo whoami
root
    
por 27.09.2017 / 11:28