Identifica o usuário em um script Bash chamado por sudo

108

Se eu criar o script /root/bin/whoami.shcontendo:

#!/bin/bash
whoami

e este script é chamado por um usuário com um sudo configurado corretamente, ele indicará

root

Existe uma maneira rápida de obter o usuário real em um script ou terei que recorrer a parâmetros que passam junto com esse nome de usuário?

quadmore
fonte

Respostas:

134

$ SUDO_USER não funciona se você estiver usando sudo su -.
Também requer várias verificações - se, $USER == 'root'então, obter $SUDO_USER.

Em vez do whoamiuso do comando who am i. Isso executa o whocomando filtrado para a sessão atual. Fornece mais informações do que você precisa. Então, faça isso para obter apenas o usuário:

who am i | awk '{print $1}'

Alternativamente (e mais simples) você pode usar logname. Ele faz a mesma coisa que a declaração acima.

Isso fornece o nome de usuário que efetuou login na sessão.

Estes funcionam independentemente de sudoou sudo su [whatever]. Ele também funciona independentemente de quantas vezes sue sudosão chamados.

Evan
fonte
2
Sim, +1, who am ié a resposta aqui.
Joe Kearney,
43
Alternativa para who am ié who mom likes. Sua escolha.
wchargin
3
whoretorna 2 linhas para mim, ambas contendo meu nome, e who am inenhuma. Qualquer ajuda?
Hosh Sadiq
7
Estou no Ubuntu 16.04 e o comando who am inão faz nada, parece ser simples who, então who | awk '{print $1}'funciona como esperado;)
daveoncode
1
Caso você não tenha awkinstalado, você também pode usar cut: who mom likes | cut -d' ' -f1 ou sedpor algum motivo: who mom likes | sed -n 's/^\([^ ]*\).*/\1/p'
Yzmir Ramirez
56

Acho que $ SUDO_USER é válido.

#!/bin/bash
echo $SUDO_USER
whoami
Brandon Horsley
fonte
1
Coisa estranha: sudo envmostra, SUDO_USERmas sudo echo $SUDO_USERnão imprime nada ...
Trabalho de
17
trabalho, isso não é estranho, é esperado. em sudo echo $SUDO_USER, bash está avaliando $ SUDO_USER antes de executar sudo. experimente o script postado nesta solução, ele funciona.
@quadmore: Se você está feliz com a resposta, não se esqueça de aceitá-la.
Trabalho de
2
Você também pode usar echo ${SUDO_USER:-$USER}para travar a sudoexecução de ambos e não sudo. Mas a resposta de evan logname parece mais fácil
Tobias Kienzler
2
@TobiasKienzler - E como evan aponta, $SUDO_USERnão funciona sudo su -, mas lognamesempre funciona.
David Harkness
13

Veja como obter o nome de usuário da pessoa que chamou o script, independentemente de ser sudo ou não:

if [ $SUDO_USER ]; then user=$SUDO_USER; else user=`whoami`; fi

ou uma versão mais curta

[ $SUDO_USER ] && user=$SUDO_USER || user=`whoami`
Alexei Tenitski
fonte
8
ainda mais curto: user=${SUDO_USER:-$(whoami)}ouuser=$(logname)
Tobias Kienzler
3

who am i | awk '{print $1}'não funcionou para mim, mas who|awk '{print $1}'servirá ao trabalho

Srinivas
fonte
1
Não em um host onde mais de um usuário tem sessão
Roman Grazhdan
1

Estranho, o sistema faz distinção entre UIDs reais e efetivos , mas não consigo encontrar nenhum programa que exporte isso no nível do shell.

msw
fonte
1

Usando whoami, who am i, who, idou $SUDO_USERnão está certo aqui.

Na verdade, whonunca é uma solução para a questão, já que listará apenas os usuários logados, que podem ser dezenas ...

A meu ver, a única resposta valiosa é o uso de logname.

Espero que isto ajude

Roubar

Roubar
fonte
0

Se for o UID que você está procurando (útil para travessuras do docker), isso funciona:

LOCAL_USER_ID=$(id -u $(logname))
Jim Hunziker
fonte