Como posso obter o nome de usuário do usuário atual no Bash?

321

Estou escrevendo um programa no Bash que precisa obter o nome de usuário do usuário.

Ouvi falar de uma coisa chamada whoami, mas não tenho ideia do que faz ou como usá-la.

Qual comando eu uso para obter o nome de usuário atual?

George
fonte
Parece que nenhum dos métodos propostos até o momento funciona sem depender de US $ USER ou invocar um processo separado. Não há bash embutido para obter o nome de usuário sem chamar um processo separado?
ColinM
9
Quando você ouvir um comando, mas não tiver certeza de como usá-lo, a verificação man whoamigeralmente é uma boa primeira parada para verificar a documentação.
Mark Stosberg

Respostas:

470

Na linha de comandos, insira

whoami

ou

echo "$USER"

Para salvar esses valores em uma variável, faça

myvariable=$(whoami)

ou

myvariable=$USER

Obviamente, você não precisa criar uma variável, pois é para isso que serve a $USERvariável.

SethMMorton
fonte
53
Apenas uma observação rápida de que $ USER e whoami retornam valores diferentes se você estiver executando um comando através do ssh como outro usuário. whoami retorna o usuário do sistema operacional e $ USER retorna o usuário ssh.
Billman
4
@ BillMan, o que isso significa? Você poderia dar um exemplo?
precisa saber é o seguinte
17
Em alguns casos, $USERnão está definido. Pior, é apenas uma variável de ambiente, para que possa ser substituída pelo usuário:USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
sitaktif
1
@sitaktif O que você sugere como solução para este problema?
SethMMorton
3
@SethMMorton Sei que fiz o problema parecer pior do que normalmente é. Para responder à pergunta, porém, o uso whoami(como sugerido) elimina completamente o problema, assumindo que as variáveis ​​de ambiente substituídas sejam um problema em potencial no seu contexto.
26515 sitaktif
81

Uma alternativa para whoamié id -u -n.

id -uretornará o ID do usuário (por exemplo, 0 para root ).

Brett
fonte
5
Se não me engano este seria o caminho a percorrer se a portabilidade é uma preocupação como o idcomando e -ue -nbandeiras são uma parte de posix
3
Esta realmente deve ser a resposta aceita. "${USER}"e whoamiambos dependem de como você efetua login. Especificamente, shells de login e sudo definirão $ USER e whoamiexaminam o usuário conectado ao stdin. No entanto, se você estiver executando um trabalho em lotes a partir do cron ou executando um script de inicialização como um usuário diferente do root, eles produzirão o usuário errado (root) ou nada. Esta resposta retornará o valor correto, independentemente, observando o ID do usuário do processo.
Asfand Qazi
Isso não é útil se você quiser o nome de usuário em vez do id
Jonathan
3
se você tentasse o comando antes de adicionar comentários falsos, veria que o -nargumento imprime o nome de usuário, exatamente como a pergunta original. veja o seguinte: id -u -nimpressões brett- mesmo em darwin.
Brett
20

Use o comando Unix / Linux / BSD / MacOS padrão lognamepara recuperar o usuário conectado. Isso ignora o ambiente e o sudo, pois são repórteres não confiáveis. Ele sempre imprimirá o nome do usuário conectado e sairá. Este comando existe desde 1981.

My-Mac:~ devin$ logname
devin
My-Mac:~ devin$ sudo logname
Password:
devin
My-Mac:~ devin$ sudo su -
My-Mac:~ root# logname
devin
My-Mac:~ root# echo $USER
root
Devin R
fonte
17

Um truque que usei no Solaris 9 e Linux e que funciona bem para os dois:

ps -o user= -p $$ | awk '{print $1}'

Esse trecho imprime o nome do usuário com o EUID atual.

NOTA: você precisa do Bash como intérprete aqui.

No Solaris, você tem problemas com os métodos descritos acima:

  • idnão aceita os parâmetros -ue -n(assim você terá que analisar a saída)
  • whoami não existe (por padrão)
  • who am I imprime o proprietário do terminal atual (ignora o EUID)
  • $USERA variável é configurada corretamente somente após a leitura dos arquivos de perfil (por exemplo, /etc/profile)
Elvenfighter
fonte
1
Por que você precisa do bash como intérprete? Nada na linha de comando mostrada parece ser específico para qualquer shell. De fato, por que incluir o tubo no awk? Pelo que sei, seu pscomando é tudo o que é necessário para exibir o proprietário do pid atual do shell.
ghoti
Para nós, humanos, desconsiderar a informação supérflua é natural. A parte awk isola os dados desejados - para variáveis ​​ou, em geral, o computador que ainda não pode fazer suposições dinâmicas neste nível rudimentar.
BradChesney79
No Solaris, use command -p id(de um shell POSIX) ou /usr/xpg4/bin/id. De maneira mais geral, no Solaris, você deseja modificar seu ambiente para se colocar em um ambiente POSIX (com algo como PATH=getconf PATH` e certifique-se de executar /usr/xpg4/bin/sh) para evitar ficar preso aos comandos dos anos 70/80.
Stephane Chazelas
'ps: opção desconhecida - o'
Anand Rockzz 30/01
12

Dois comandos:

  1. id imprime a identificação do usuário junto com os grupos. Formato:uid=usernumber(username) ...

  2. whoami fornece o nome de usuário atual

Sireesh Yarlagadda
fonte
1
$ whoami não está disponível como uma variável no bash. Você precisa fazer $ (whoami) ou `whoami` para realmente executar o comando whoami!
Rudolf Mayer
@RudolfMayer I fix it it
wjandrea
6

Quando são necessárias permissões root (sudo), que geralmente são 90% + ao usar scripts, os métodos nas respostas anteriores sempre fornecem root a resposta.

Obter o usuário "logado" atual é tão simples quanto isso, mas é necessário acessar diferentes variáveis: $SUDO_UIDe$SUDO_USER .

Eles podem ser ecoados:

echo $SUDO_UID
echo $SUDO_USER

Ou atribuído, por exemplo:

myuid=$SUDO_UID
myuname=$SUDO_USER
OldManRiver
fonte
6

No Solaris OS, usei este comando:

$ who am i     # Remember to use it with space.

No Linux - Alguém já respondeu isso nos comentários.

$ whoami       # Without space
Lin-man
fonte
5

Para Bash , KornShell ( ksh), shetc. Muitas de suas perguntas são respondidas rapidamente por:

man [function]

para obter a documentação do sistema que você está usando ou geralmente de maneira mais conveniente:

google "função homem"

Isso pode dar resultados diferentes para algumas coisas em que o Linux e o Unix têm diferenças modestas.

Para esta pergunta, basta digitar "whoami" no seu shell.

Para criar um script:

myvar=$(whoami)
Fred Mitchell
fonte
2

O nome de usuário do usuário atual pode ser obtido no Bash puro com a ${parameter@operator}expansão de parâmetro (introduzida no Bash 4.4):

$ : \\u
$ printf '%s\n' "${_@P}"

O :interno (sinônimo de true) é usado em vez de uma variável temporária, definindo o último argumento, armazenado em $_. Em seguida, expandimos ( \u) como se fosse uma string de prompt com o Poperador.

Isso é melhor do que usar $USER, pois $USERé apenas uma variável ambiental regular; ele pode ser modificado, desabilitado, etc. Mesmo que não seja intencionalmente violado, um caso comum em que ainda está incorreto é quando o usuário é alternado sem iniciar um shell de login ( suo padrão).

Crestwave
fonte
1

Na maioria dos sistemas Linux, basta digitar whoami na linha de comandos para fornecer o ID do usuário.

No entanto, no Solaris, pode ser necessário determinar o ID do usuário, determinando o UID do usuário conectado através do comando abaixo.

echo $UID

Depois que o UID for conhecido, encontre o usuário combinando o UID com o /etc/passwdarquivo.

cat /etc/passwd | cut -d":" -f1,3
John
fonte
cat / etc / passwd | cut -d ":" -f1,3 | grep $ UID | cut -d ":" -f1
Andrew Taylor
-4

Obter o user_struct da tarefa atual

#define get_current_user()              \
({                                      \
    struct user_struct *__u;            \
    const struct cred *__cred;          \
    __cred = current_cred();            \
    __u = get_uid(__cred->user);        \
    __u;                                \
})
leesagacious
fonte
2
A questão era sobre como obter o nome de usuário dentro de um script bash. Esta resposta é sobre como obter o ID do usuário numérico (não o nome de usuário) do código C em execução no kernel do Linux (como em um módulo do kernel do Linux personalizado). Não é uma resposta para a pergunta que foi feita, é uma resposta para uma pergunta diferente.
Simon Kissane 15/05