O comando id
pode ser usado para pesquisar um usuário “s uid
, por exemplo:
$ id -u ubuntu 1000
Existe um comando para pesquisar um nome de usuário em um uid
? Sei que isso pode ser feito olhando para o arquivo /etc/passwd
, mas estou perguntando se há um comando existente para isso, especialmente se o usuário que o está executando não é root.
Não estou procurando o nome de usuário do usuário atual, ou seja, não estou procurando whoami
ou logname
.
Isso também me fez pensar se na hospedagem compartilhada na web esse é um recurso de segurança ou se não estou entendendo algo corretamente?
Para análise, o /etc/passwd
arquivo 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á um exemplo de listagem de diretório 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 root
é o proprietário de alguns arquivos e root
também está aparecendo em /etc/passwd
, no entanto, todos os outros usuários / grupos aparecem como números .
Comentários
- Lembre-se de que mais de um usuário pode ter o mesmo UID. É ‘ raro, mas acontece ocasionalmente.
Resposta
ls
já executa essa pesquisa. Você pode realizar uma pesquisa de informações do usuário na linha de comando com getent passwd
.
Se ls
mostra um ID de usuário em vez de um nome de usuário, é “porque não há nenhum 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 de outro sistema, ou se um arquivo pertencer a um usuário excluído, ou se você passou um ID de usuário numérico para chown
, você pode ter um arquivo que pertence para um ID de usuário que não tem um nome.
Em um host compartilhado, você pode ter acesso a alguns arquivos que são compartilhados entre várias máquinas virtuais, cada uma com seu banco de dados de usuário. Isso é um pouco estranho (por que compartilhar arquivos, mas não os usuários que os possuem?), mas é tecnicamente possível.
Comentários
- I ‘ estou vendo o número em vez do nome em
ls -l
se o nome tiver mais de oito caracteres. - @kgrittn Pode depender na variante Unix. GNU ls mostra o nome de usuário completo. BusyBox ls o trunca para 8 caracteres (pelo menos na compilação que tenho aqui).
Resposta
Tente
getent passwd "$uid" | cut -d: -f1
Comentários
- Se não retornar nada, significa que eu não ‘ não tem acesso para traduzir o id para um nome de usuário?
- É mais provável que você não
t set
” $ uid ” `ou esse uid não ‘ não existe.grep ":$uid:" /etc/passwd
o encontra?getent passwd
produz alguma saída? - @cwd: Você sempre deve ter acesso para traduzir um id para um nome de usuário. Por exemplo,
ls -l
está sempre fazendo isso. - Apenas curioso porque olhando para uma
ls
listagem 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 jailshell? - @cwd Mais provavelmente o host compartilhado está usando um
/etc/passwd
montado / compartilhado de outro lugar que não foi ‘ t montado no momento.
Resposta
Você pode gostar deste pouco cantiga.
$ id -nu [number]
3.17.3-1-ARCH # 1 SMP PREEMPT Sex 14 Nov 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 não funciona no Ubuntu quando executado como um usuário normal, embora não tenha testado isso como superusuário. Também não funciona no Alpine Linux. Talvez um recurso de segurança evite que isso funcione em alguns sistemas.
Comentários
-
id -u jimmij
= >1000
.id -nu 1000
= >id: 1000: no such user
. - funciona para mim, com
id --version
=id (GNU coreutils) 8.23
- Funciona no FreeBSD 10.3 também.
- observação: isso funciona em Red Hat / CentOS > = 7 (não em Red Hat / CentOS < = 6)
- Para sua informação, isso não funciona em imagens do busybox / alpine linux / alpine docker
Resposta
Sei que esta é uma pergunta antiga, mas aqui está outra resposta
awk -F: "{print $1,$3}" /etc/passwd | grep <UID>
Comentários
- Pipe para
grep
o quê? (Além disso, se você adicionar quatro espaços no início da linha, será processado como texto de largura fixa.) - Prefiro a resposta com
getent passwd
. Mas se for analisar / etc / passwd, seria melhor usar apenas awkID=0 ; awk -F: '{if ( $3 == '"$ID"' ) print $1}' /etc/passwd
.
Resposta
Analisar / etc / passwd:
% awk -F: "/:$(id -u ubuntu):/{print \$1}" /etc/passwd ubuntu
Comentários
- Ao contrário de
getent
, isso não funciona se o sistema usa LDAP. - isso não ‘ também não funciona se o NIS i s usado ou qualquer outro protocolo de autenticação distribuído.
- @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 do Linux.
- downvote porque ‘ não é confiável (pode corresponder ao usuário ou grupo).
Resposta
id | awk "{print $1}" | sed "s/.*(//;s/)$//"
Este oneliner faz o seguinte:
- obtenha informações do usuário
- extraia a primeira coluna (“uid = ID (NOME)”)
- remova tudo o que estiver antes dos colchetes e os próprios colchetes
Resposta
O comando id
pode ser usado para ambos para pesquisar UID e / ou nome de USUÁRIO
- pesquisar UID pelo USUÁRIO , por exemplo:
$ id -u ubuntu 1000
- procure um USUÁRIO por UID , por exemplo:
$ id -un 1000 ubuntu
Se o UID ou USUÁRIO não for encontrado na máquina atual, ele imprime mensagem, por exemplo:
$ id -un 1234 id: 1234: no such user
De man id
:
id - print real and effective user and group IDs -n, --name print a name instead of a number, for -ugG -u, --user print only the effective user ID -g, --group print only the effective group ID -G, --groups print all group IDs