Como posso procurar um nome de usuário por id no linux?

67

O comando idpode ser usado para procurar um usuário uid, por exemplo:

$ id -u ubuntu
1000

Existe um comando para procurar um nome de usuário de a uid? Sei que isso pode ser feito olhando o /etc/passwdarquivo, mas estou perguntando se existe um comando para isso, especialmente se o usuário que o executa não é root.

Não estou procurando o nome de usuário do usuário atual , ou seja, não estou procurando whoamiou logname.

Isso também me fez pensar se na hospedagem compartilhada na web esse é um recurso de segurança ou simplesmente não estou entendendo algo corretamente?

Para exame, o /etc/passwdarquivo de um host compartilhado:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
pcap:x:77:77::/var/arpwatch:/sbin/nologin
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
avahi:x:70:70:Avahi daemon:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
avahi-autoipd:x:100:104:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologin
named:x:25:25:Named:/var/named:/sbin/nologin
mailman:x:32006:32006::/usr/local/cpanel/3rdparty/mailman/mailman:/usr/local/cpanel/bin/noshell
dovecot:x:97:97:dovecot:/usr/libexec/dovecot:/sbin/nologin
mysql:x:101:105:MySQL server:/var/lib/mysql:/bin/bash
cpaneleximfilter:x:32007:32009::/var/cpanel/userhomes/cpaneleximfilter:/usr/local/cpanel/bin/noshell
nagios:x:102:106:nagios:/var/log/nagios:/bin/sh
ntp:x:38:38::/etc/ntp:/sbin/nologin
myuser:x:1747:1744::/home/myuser:/usr/local/cpanel/bin/jailshell

E aqui está uma lista de diretório de exemplo de /tmp/

drwx------  3 root     root        1024 Apr 16 02:09 spamd-22217-init/
drwxr-xr-x  2      665      664    1024 Apr  4 00:05 update-cache-44068ab4/
drwxr-xr-x  4      665      664    1024 Apr 17 15:17 update-extraction-44068ab4/
-rw-rw-r--  1      665      664   43801 Apr 17 15:17 variable.zip
-rw-r--r--  1      684      683    4396 Apr 17 07:01 wsdl-13fb96428c0685474db6b425a1d9baec

Podemos ver que rooté o proprietário de alguns arquivos e roottambém está aparecendo, no /etc/passwdentanto, todos os outros usuários / grupos aparecem como números.

cwd
fonte
6
Lembre-se de que mais de um usuário pode ter o mesmo UID. É raro, mas acontece ocasionalmente.
Barry Brown

Respostas:

35

lsjá realiza essa pesquisa. Você pode executar uma pesquisa de informações do usuário na linha de comando com getent passwd.

Se lsmostra um ID do usuário em vez de um nome de usuário, é porque não há usuário com esse nome. Os sistemas de arquivos armazenam IDs de usuário, não nomes de usuário. Se você montar um sistema de arquivos a partir de outro sistema, ou se um arquivo pertencer a um usuário excluído agora ou se tiver passado um ID de usuário numérico chown, poderá ter um arquivo que pertença a um ID de usuário que não tem nome.

Em um host compartilhado, você pode ter acesso a alguns arquivos compartilhados entre várias máquinas virtuais, cada uma com seu banco de dados do usuário. Isso é um pouco estranho (por que compartilhar arquivos, mas não os usuários que os possuem?), Mas é tecnicamente possível.

Gilles 'SO- parar de ser mau'
fonte
2
Estou vendo o número, em vez do nome, ls -lse o nome tiver mais de oito caracteres.
kgrittn
@kgrittn Pode depender da variante Unix. GNU ls mostra o nome de usuário inteiro. BusyBox sl trunca para 8 caracteres (pelo menos na versão que tenho aqui).
Gilles 'SO- stop being evil'
66

Experimentar

getent passwd "$uid" | cut -d: -f1
jw013
fonte
Se isso não retornar nada, isso significa que não tenho acesso para traduzir o ID em um nome de usuário?
Cwd
11
Provavelmente você não t set "$ uid" `ou esse uid não existe. O grep ":$uid:" /etc/passwdencontra? Não getent passwdproduz nenhuma saída?
Mikel
@cwd: Você sempre deve ter acesso para traduzir um ID em um nome de usuário. Por exemplo, ls -lestá sempre fazendo isso.
Camh
Apenas curioso, porque olhar para uma lslista em um host compartilhado estava mostrando números nas colunas de nome de usuário / grupo com ls. Talvez seja uma precaução de segurança ou coisa de cadeia?
Cwd
@cwd É mais provável que o host compartilhado esteja usando um /etc/passwdmontado / compartilhado de outro lugar que não estava montado no momento.
Jw013
39

Você pode gostar deste pequeno cantinho.

$ id -nu [number]

3.17.3-1-ARCH # 1 SMP PREEMPT Sexta-feira, 14 de novembro às 22:56:01 CET 2014 i686 GNU / Linux

Posso confirmar que ele retorna um nome de usuário correspondente, se houver, no Arch Linux. Também posso confirmar que ele não funciona no Ubuntu quando executado como usuário normal, embora eu não tenha testado isso como superusuário. Também não funciona no Alpine Linux. Talvez um recurso de segurança impeça que isso funcione em alguns sistemas.

Stefan
fonte
id -u jimmij=> 1000. id -nu 1000=> id: 1000: no such user.
jimmij
2
funciona para mim, com id --version=id (GNU coreutils) 8.23
eMPee584 5/16
Também funciona no FreeBSD 10.3.
forquare
note: isso funciona no Red Hat / CentOS> = 7 (não no Red Hat / CentOS <= 6)
Franklin Piat
FYI isso não trabalhar em busybox alpinas imagens docker / linux / Alpine
jjj
0

Sei que essa é uma pergunta antiga, mas aqui está outra resposta

awk -F: '{print $1,$3}' /etc/passwd | grep <UID>
D Smith
fonte
Tubo para o grepque? (Além disso, se você adicionar quatro espaços no início da linha, ele será renderizado como texto de largura fixa.)
Curinga
Eu prefiro a resposta com getent passwd. Mas se analisando / etc / passwd, seria melhor usar apenas o awk ID=0 ; awk -F: '{if ( $3 == '"$ID"' ) print $1}' /etc/passwd.
Franklin Piat
-1

Analise / etc / passwd:

% awk -F: "/:$(id -u ubuntu):/{print \$1}" /etc/passwd
ubuntu
laebshade
fonte
7
Ao contrário getent, isso não funciona se o sistema usa LDAP.
choroba
3
isso não funciona se o NIS for usado ou qualquer outro protocolo de autenticação distribuído.
Jlliagre
@choroba: se ele tivesse um requisito específico para LDAP ou NIS, ele provavelmente o teria mencionado. Minha solução funciona em configurações típicas de linux.
Laebshade 18/04/12
2
downvote beacause não é confiável (pode corresponder ao usuário ou ao grupo).
Franklin Piat
-1
id | awk '{print $1}' | sed 's:.*(::;s:)$::'
NAIM
fonte
4
Olá NAIM. Embora essa possa ser uma resposta correta, ajudaria o solicitante (e possivelmente os futuros leitores de sua solução) se você pudesse editar sua resposta para explicar brevemente como isso funciona.
roaima 3/16