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?

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.


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

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`

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


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.


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


0

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

LOCAL_USER_ID=$(id -u $(logname))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.