Você pode escrever um script que simplesmente percorra a árvore de processos, imprimindo nomes de usuários / pids / executáveis / qualquer coisa que tenha subido na lista, parando quando finalmente saiu do terminal. O sshd geralmente começa a escutar em um TTY depois que ele já fez o setuid () para o usuário, assim o processo mais antigo conectado ao TTY estará sendo executado como o usuário com o qual você se logou.
Aqui está uma versão de script Bash específica do Linux do conceito.
saída de script:
Sudo simples à raiz:
[root@ditirlns04 ~]# ./test.sh
Current User: 0
Previous UID: 504
O UID 504 é como eu loguei na caixa, então funcionou:
[root@ditirlns04 ~]# logname
jadavis6
[root@ditirlns04 ~]# id jadavis6
uid=504(jadavis6) gid=504(jadavis6) groups=504(jadavis6),16777216(enterprise admins),16777217(ncatsys),16777218(sms admins),16777219(domain admins),16777220(aggieanywhere),16777221(group policy creator owners),16777222(tlh-test),16777223(dba admins),16777224(domain controllers),16777225(cupsadmin),16777226(linuxusers),16777227(da admins),16777228(webdev),16777229(schema admins),16777230,16777231(changeauditor operators - ncat),16777232(configmgr remote control users),16777233(changeauditor administrators - ncat),16777234(telnetclients),16777235(denied rodc password replication group)
O mesmo que acima, passando apenas por um usuário intermediário (ou seja, logado em 504, sudo para root, sudo para UID regular de 501 e, em seguida, de volta à raiz):
[root@ditirlns04 ~]# ./test.sh
Current User: 0
Previous UID: 501
Previous UID: 0
Previous UID: 504
[root@ditirlns04 ~]#
Assim, cada transição de UID é capturada na ordem inversa em que aconteceu. Se você precisar dela na mesma ordem, basta colocar o script em uma função em que você tac a saída:
[root@ditirlns04 ~]# ./test.sh | tac
Previous UID: 504
Previous UID: 0
Previous UID: 501
Current User: 0
[root@ditirlns04 ~]#
corpo do script:
#!/bin/bash
currentPID=$$
currentUser=$(id -u)
currentTTY=$(awk '{print $7}' /proc/$$/stat)
echo "Current User: $currentUser"
while /bin/true; do
parentPID=$(awk '{print $4}' /proc/$currentPID/stat)
parentTTY=$(awk '{print $7}' /proc/$currentPID/stat)
if [ $parentTTY -ne $currentTTY ]; then
break
fi
parentUser=$(awk '/^Uid:/ {print $2}' /proc/$currentPID/status)
if [[ "x$parentUser" != "x$currentUser" ]]; then
echo "Previous UID: $parentUser"
fi
currentPID=$parentPID
currentUser=$parentUser
done
Basicamente, ele usa apenas os arquivos per-pid stat
e status
. Você poderia fazer mais versões independentes de plataforma envolvendo ps
output, mas eu não confio na saída do comando parsing quando o dado está prontamente disponível em um formato que deveria ser analisado, então eu fui a rota procfs.
Basicamente, sempre que encontra um novo UID, ele é impresso. Eles têm a garantia de estar na mesma ordem que o usuário sudo'd, então ele deve cobrir efetivamente toda a sua sessão de login nessa máquina. Você deve ser capaz de modificar facilmente os itens acima para imprimir PIDs ou nomes de comandos, se você quiser, mas geralmente as pessoas que pensam nesta área estão mais preocupadas com quem eles estarão executando, ao invés do programa shell que estará rodando. / p>