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.
If you have root access, it's as simple as:
sudo -u \#${pid} whoami
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.
$ 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;
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.
Dec 1, 2011 at 21:45
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.
id -u cyrus
just do the opposite thing).who-has-uid 100
will match also100
,1001
, ... I would usegetent passwd 100 | cut -f1 -d:
instead.