Além disso, essas variáveis sempre correspondem ao nome de usuário atualmente conectado (no meu sistema Debian)? Posso assumir a disponibilidade deles em outros sistemas Unix (como)?
Também estou curioso por que alguém usaria, em whoami
vez de apenas ler qualquer uma dessas variáveis.
environment-variables
tshepang
fonte
fonte
man
página,whoami
relata o nome associado ao seu ID de usuário efetivo. O que significa que ele retornará algo diferente se você estiver usandosudo
ou executando um executável setuid. Se vocêsudo
configurou, tentesudo whoami
por exemplo.USER
eUSERNAME
são variáveis de ambiente comuns, o que significa que, se desejar, você pode configurá-las para valores arbitrários. Apenas digiteUSER=xyz
. Em outras palavras, mesmo se essas variáveis existirem, não há garantia de que seus valores correspondam ao nome de usuário atualmente conectado.guarantee
, eu quis dizer por padrão (ou seja, assumindo que o usuário não os alterou).sudo whoami
esudo echo $USER
sudo echo $USER
, o shell se expande$USER
e depois chamasudo
. Então é claro que não produz a mesma saída quewhoami
. Comosudo whoami
,sudo sh -c 'echo $USER'
normalmente produzroot
. Em relação ao seu comentário sobre owhoami
uso do EUID , observe que elesudo whoami
sairiaroot
mesmo sewhoami
usado o UID.sudo
conjuntos tanto EUID e UID para o comando é executado (exceto na situação muito incomum que você configurá-lo explicitamente para se comportar de outra forma). Comparesudo id -u
comsudo id -ru
.Respostas:
É login .
A página do manual de login do Linux (1) diz:
A página de manual de login do FreeBSD (1) diz:
As páginas de manual do NetBSD , OpenBSD e OS X dizem a mesma coisa.
Aqui está o código fonte do login do util-linux:
Aqui está o código fonte do login do FreeBSD:
fonte
USER
eUSERNAME
set e seu comando apenas retornaLOGNAME
.login
que não parece ser a única coisa que define essas variáveis.login
comando. Os sistemas operacionais que usam Linux como seu kernel são livres para usar qualquer implementação que desejarem. Por exemplo, sistemas baseados no Debian tendem a usar o sistema shadow-utils, não o util-linux.login
muitas vezes não é invocado ao efetuar login nassh
maioria dos gerenciadores de login gráficos.Não há regra. Algumas conchas gostam
tcsh
ouzsh
colocam$LOGNAME
.zsh
conjuntos$USER
.Pode ser definido por algumas coisas que você fazer login como
login
(como invocado porgetty
quando o login em um terminal e às vezes por outras coisas comoin.rlogind
),cron
,su
,sudo
,sshd
,rshd
, gerenciadores de login gráfica ou não.No entanto, se houver um login, na minha experiência,
$USER
geralmente é definido (mas pode não ser atualizado após uma alteração na identificação do usuário (através de comandos setuid) nessa sessão de login.O POSIX exige que$LOGNAME
seja definido no login (ecron
).Para obter o nome de login de forma portável, o melhor é usar o
logname
comando (se não houver nenhum login, ele poderá retornar nada). Para obter o ID do usuário, useid -u
. Para obter um nome de usuário correspondente à corrente id efetivo de usuário:id -un
. Para obter todos eles (na maioria das vezes, há apenas um nome de usuário por ID de usuário, mas isso não é garantido):Embora isso possa não funcionar em sistemas onde o banco de dados do usuário não pode ser enumerado (como acontece às vezes com os bancos de dados do usuário em rede, por exemplo).
fonte
Você provavelmente deseja confiar no padrão POSIX aqui, pois em algum momento você provavelmente se preocupará não apenas com o login do usuário (gerenciado pelo
login
programa), mas também comcron
trabalhos e afins.Portanto, você deve saber que o POSIX exige,
$LOGNAME
mas não$USER
. Por exemplo,$USER
pode não ser definido pelo cron, como indicado em uma resposta de Keith Thompson , que também faz referência a um histórico de como isso se relaciona ao histórico do System-V vs BSD:fonte
Se você deseja usar as variáveis de ambiente (em vez de
whoami
ougetpwent
egetpwnam
) e não tem certeza se elas sempre são definidas da mesma maneira em todos os sistemas * NIX, tente isso no bash:Se ainda estiver vazio depois de tudo isso, você estará em um sistema bastante esotérico. ;)
fonte