Debian: get the login name from UID

2

What I need is something like:

$ who-has-uid 1000
cyrus

I know the file /etc/passwd contains such informations, I'm not asking a script that parses it.

cYrus

Posted 2011-11-30T22:21:03.757

Reputation: 18 102

2Why not? Sounds like the easiest solution if you have read access to that file... – Yitzchak – 2011-11-30T22:25:02.277

Because I can't believe there isn't such built-in tool in Debian (e.g. id -u cyrus just do the opposite thing). – cYrus – 2011-11-30T22:28:59.007

Simple enough to do in a one line bash function: who-has-uid() { grep $1 /etc/passwd| awk -F: '{print $1;}' } – Doug Harris – 2011-11-30T22:38:42.897

who-has-uid 100 will match also 100, 1001, ... I would use getent passwd 100 | cut -f1 -d: instead. – cYrus – 2011-11-30T22:45:16.240

Answers

4

If you have root access, it's as simple as:

sudo -u \#${pid} whoami

Eroen

Posted 2011-11-30T22:21:03.757

Reputation: 5 615

Finally! Thanks, I meant something like that. – cYrus – 2011-12-01T17:33:29.730

2

You could try getent (getent man page):

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

You could parse out just the username with sed.

shufler

Posted 2011-11-30T22:21:03.757

Reputation: 1 716

1

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

Note that this will work (assuming Perl is configured properly) even if the information comes from somewhere other than the /etc/passwd file.

There's no real error checking; who-has-uid 999 prints an empty line if there's no such UID on the system.

If you don't insist on a one-liner, you can put this somewhere in your $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;

Keith Thompson

Posted 2011-11-30T22:21:03.757

Reputation: 4 645

Thanks but way too complicated outside a Perl context. – cYrus – 2011-12-01T17:32:05.613

@cYrus: Perhaps, but you only have to write it (or copy-and-paste it from here) once. – Keith Thompson – 2011-12-01T18:02:12.440

1

Sure, I understand your point. With "complicated" I mean: unnecessarily complicated. The accepted answer is an example.

– cYrus – 2011-12-01T19:08:26.783

1@cYrus: I would say that a simple getpwuid() or getent, which is available to all users, is much less complicated than executing a program as the target user via a privileged tool. – user1686 – 2011-12-01T21:45:22.103

@grawity: much less complicated is quite subjective. – cYrus – 2011-12-01T22:29:32.693

0

Use awk, (usually installed GNU awk, gawk) Tell it to use colon as a delimiter, see if field 3 (the UID) is 1000, then print the first field (username)

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

This is if the info is in /etc/passwd, if you have network login info (e.g. on NIS or LDAP) getent works better

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

You do need single quotes: if you use double quotes, bash will try to figure out what $1 means to the shell, and not pass it to gawk.

Rich Homolka

Posted 2011-11-30T22:21:03.757

Reputation: 27 121

This works, but is awfully inefficient with centralized user directories: with 500 users, it'd have to make 499 unnecessary lookups. And that's even assuming the directory supports/allows enumeration, which not all do. – user1686 – 2011-12-01T13:29:39.063