Descobrir se uma sessão está sendo executada sob 'su'

5

Estou tentando verificar se a sessão atual do shell está sendo executada em uma sessão% login su .

Qual é a melhor maneira de testar essa condição?

    
por Andrew Vit 07.11.2011 / 02:20

3 respostas

6

examine o comando logname . logname imprimirá o nome de usuário do usuário que efetuou login no terminal de controle, conforme fornecido pelo log de utmp.

tk-mbp:~ tkennedy$ id -g -rn
staff
tk-mbp:~ tkennedy$ id -u -rn
tkennedy
tk-mbp:~ tkennedy$ logname
tkennedy
tk-mbp:~ tkennedy$ su -
Password:
tk-mbp:~ root# id -g -rn
wheel
tk-mbp:~ root# id -u -rn
root
tk-mbp:~ root# logname
tkennedy

Este exemplo se do Mac OS X, portanto, o uso do comando id pode diferir de outros sistemas operacionais, no entanto, o uso do logname é consistente entre o Mac OS X, Linux e Solaris, que são todos os SOs I ter à noite para testar com.

Usando logname, você pode assumir que, se o usuário retornado pelo comando id for não igual ao usuário retornado por logname , a sessão atual do shell será executada em su, ou sudo, ou alguma outra ferramenta que permita a mudança de privilégios em um shell.

    
por 07.11.2011 / 05:29
2

Se você quiser testar se o shell atual foi executado por su :

[ "$(ps -o comm= $PPID)" = "su" ]

Se você quiser testar se o usuário chamou su desde o login, em muitos sistemas (mas não em todos) você pode comparar LOGNAME (normalmente definido no login inicial) com USER ou id -un (que identifica o usuário atual). Note que LOGNAME é trivialmente spoofable (é uma variável de ambiente). Porém, outras soluções também (por exemplo, ln -s /bin/su ~/sh; ~/sh ocultará su de qualquer solução baseada em nomes de processos).

    
por 08.11.2011 / 00:53
0

Aqui está uma solução que eu liguei:

pstree -p $$ | 
grep -oP '[r]oot su .*(\w+)' |
sed -n -E 's/.* ([[:alnum:]]+)$//p''

pstree com o sinalizador -p lista a árvore de ancestralidade do processo atual do shell PID ($$)

grep encontra linhas contendo "root su" (estou usando o truque [r] para evitar retornar o próprio processo do grep)

sed limpa o resultado e imprime apenas o nome de usuário atual no final da linha. (No entanto, seria mais útil imprimir o usuário do processo pai.)

    
por 07.11.2011 / 03:40

Tags