Ao administrar um servidor Linux (um servidor Debian, por exemplo), eu frequentemente troco de usuários. Às vezes, eu encadeio várias trocas de usuários:
aluriak$ sudo -s
root$ […]
root$ su aluriak
aluriak$ […]
aluriak$ su db
db$ […]
db$ <ctrl-D>
aluriak$ su front
front$ […]
Existe alguma maneira de obter a "cadeia de usuários" que criei dessa maneira?
No exemplo acima, esse utilitário hipotético produziria algo como front aluriak root aluriak
, porque eu sou o usuário frontal, que fez login como usuário aluriak, que fez login como conta root, que foi acessado pela conta aluriak.
Supondo que você queira apenas a cadeia de processos atualmente ativa, você também pode usar
pstree -s -u $$
Da página do
pstree
manual :Isso listará os processos pais — exatamente o que é desejado aqui.
Novamente - exatamente o que é desejado.
Exemplo de saída
pstree -s -u $$
em um sistema Ubuntu 22:Observe que o novo nome de usuário é listado entre parênteses após o nome do processo, não o UID como a página man declara. Um teste rápido em instâncias Centos 7 e RHEL 9 mostra o mesmo comportamento - um nome de usuário é emitido em vez do UID.
Você pode adicionar a
-p
opção de adicionar os pids, se desejar.Exemplo de saída de
pstree -p -s -u $$
, novamente em um sistema Ubuntu 22:Uma solução é consultar os logs de autenticação do sistema, como
/var/log/auth.log
, para obter linhas como:Como os logs são ordenados por tempo, é possível refazer as ações de login/logout e, portanto, listar cada etapa. As
pts/1
informações fornecem o número da sessão para evitar misturar duas sessões. Você pode obter sua sessão usandotty
.a resposta é rastreável em
/var/log/audit/audit.log
a menos que você tenha feitosystemctl disable | stop> auditd
. Será evidente nos camposUID
eAUID
para osexe=/usr/bin/su
itens.bem como
/var/log/secure
{no RHEL 8} para assu:session
linhasComo este é Linux, você tem um
/proc
sistema de arquivos. Se você tem acesso às entradas de outros processos (normalmente, se você se tornar o usuário root), então você pode examinar asSUDO_*
variáveis no ambiente de cada processo ancestral.Essas variáveis são definidas por
sudo
:SUDO_COMMAND
SUDO_GID
SUDO_HOME
SUDO_UID
SUDO_USER
O que nos interessa é
SUDO_USER
.Então, precisamos apenas examinar a cadeia de processos pais para encontrar onde
SUDO_USER
as mudanças de valor. Então, inverta o resultado comtac
para mostrar o usuário atual por último: