Como obter o nome do usuário que executou um script bash como sudo?

17

Quero criar um script bash que deve ser executado com o sudo, mas deve levar em consideração o nome do usuário que não o executou. Portanto, se o usuário bobexecuta, sudo ./myscript.sheu gostaria myscript.shde saber quem bobfoi o responsável pela execução.

Vamos olhar para dentro myscript.sh:

USER=$(whoami)
# Do something that takes into account the username.

Como posso saber o nome do usuário que gerou o processo? Mais especificamente, o que devo usar em vez de whoamiobter bobe não root?

marcio
fonte
Esse não é um script válido, acho que você quis dizer USER=$(whoami). Observe que o USERjá existe como uma variável interna do shell. Além disso, se for um script bash, não o execute sh, que possui apenas um subconjunto de recursos compatíveis com POSIX.
nyuszika7h
por que não editar? corrigido agora.
marcio
É muito trivial, as edições precisam ter pelo menos 6 caracteres, pelo menos os sugeridos.
nyuszika7h
Ok, eu entendo. Obrigado pelas dicas: o DI geralmente coloca um hashbang como esse #!/usr/bin/env bashnos meus scripts do bash.
Marcio
O hashbang é ignorado se você o chamar explicitamente com shou qualquer outra coisa.
nyuszika7h

Respostas:

28

Não sei ao certo como é padrão, mas pelo menos nos sistemas Ubuntu sudodefine as seguintes variáveis ​​de ambiente (entre outras - veja a ENVIRONMENTseção da página de manual do sudo):

   SUDO_UID        Set to the user ID of the user who invoked sudo

   SUDO_USER       Set to the login of the user who invoked sudo

por exemplo,

steeldriver@lap-t61p:~$ sudo sh -c 'whoami'
root
steeldriver@lap-t61p:~$ sudo sh -c 'echo $SUDO_USER'
steeldriver
chave de aço
fonte
Funciona como esperado em todas as plataformas que testei: debian, fedora (redhat) e freebsd. Obrigado!
marcio
Trabalho confirmado em um Mac.
SiKing
Funciona no ubuntu também.
Andi Jay
9

Se você quiser que ele funcione sem sudo, use ${SUDO_USER:-$USER}. Por exemplo:

printf '%s\n' "${SUDO_USER:-$USER}"

Explicação

${var:-val}será expandido para $var, a menos que esteja desconfigurado ou vazio, caso em que será expandido para val.

nyuszika7h
fonte