Debian: obtenha o nome de login do UID

2

O que eu preciso é algo como:

$ who-has-uid 1000
cyrus

Eu sei que o arquivo /etc/passwd contém tais informações, não estou pedindo um script que o analise.

    
por cYrus 30.11.2011 / 23:21

4 respostas

4

Se você tem acesso root, é tão simples quanto:

sudo -u \#${pid} whoami
    
por 01.12.2011 / 02:46
2

Você pode tentar getent ( página man getent ):

$ getent passwd 1005
shufler:x:1005:119:shufler,,,:/home/local/shufler:/bin/bash

Você pode analisar apenas o nome de usuário com sed.

    
por 30.11.2011 / 23:27
1
$ who-has-uid() { perl -e 'print +(getpwuid('$1'))[0], "\n"'; }
$ who-has-uid 0
root
$ who-has-uid 1
daemon

Observe que isso funcionará (supondo que o Perl esteja configurado corretamente), mesmo se as informações vierem de algum lugar diferente do arquivo /etc/passwd .

Não há verificação de erros real; who-has-uid 999 imprime uma linha vazia se não houver tal UID no sistema.

Se você não insistir em uma linha única, poderá colocar isso em algum lugar no seu $PATH :

#!/usr/bin/perl

use strict;
use warnings;

my $ok = 1;
foreach my $uid (@ARGV) {
    my @pw = getpwuid $uid;
    if (@pw) {
        print "$pw[0]\n";
    }
    else {
        warn "$uid: No such user\n";
        $ok = 0;
    }
}

exit 1 if not $ok;
    
por 01.12.2011 / 04:46
0

Use o awk (geralmente instalado GNU awk, gawk) Diga-lhe para usar dois pontos como um delimitador, veja se o campo 3 (o UID) é 1000, então imprima o primeiro campo (username)

gawk -F: '$3 == 1000{print $1}' < /etc/passwd

Isto é, se a informação estiver em / etc / passwd, se você tiver informações de login de rede (por exemplo, no NIS ou no LDAP), o getent funciona melhor

getent passwd | gawk -F: '$3 == 1000{print $1}'

Você faz precisa de aspas simples: se você usar aspas duplas, o bash tentará descobrir o que significa $ 1 para o shell, e não passá-lo para o gawk.

    
por 01.12.2011 / 01:05